301 lines
9.3 KiB
PHP
301 lines
9.3 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Repositories\MediaCategoriesRepository;
|
|
use App\Repositories\MediaFileRepository;
|
|
use App\Traits\PureAjaxMethodProtectable;
|
|
use Illuminate\Http\Request;
|
|
use Gate;
|
|
use Auth;
|
|
use Validator;
|
|
|
|
/**
|
|
* 媒體庫分類的Controller
|
|
*
|
|
* Class MediaCategoryController
|
|
* @package App\Http\Controllers
|
|
*/
|
|
class MediaCategoryController extends Controller
|
|
{
|
|
use PureAjaxMethodProtectable;
|
|
|
|
private $mediaCategoriesRepository;
|
|
|
|
private $mediaFileRepository;
|
|
|
|
public function __construct(MediaCategoriesRepository $mediaCategoriesRepository, MediaFileRepository $mediaFileRepository)
|
|
{
|
|
$this->mediaCategoriesRepository = $mediaCategoriesRepository;
|
|
$this->mediaFileRepository = $mediaFileRepository;
|
|
}
|
|
|
|
public function hasAppMediaCategoryPermission()
|
|
{
|
|
return Gate::allows('permission:manage-app-media-categories');
|
|
}
|
|
|
|
/**
|
|
* 取得所有媒體庫分類
|
|
*
|
|
* @param Request $request
|
|
* @return \Illuminate\Http\JsonResponse
|
|
*/
|
|
public function index(Request $request)
|
|
{
|
|
$this->protectFromNoneAjaxRequest($request);
|
|
|
|
$responseData = [
|
|
'mediaCategories' => []
|
|
];
|
|
if(Auth::check()) {
|
|
$userId = Auth::id();
|
|
$categories = [];
|
|
$hasAppCategoryPermission = $this->hasAppMediaCategoryPermission();
|
|
if($hasAppCategoryPermission) {
|
|
$categories = $this->mediaCategoriesRepository->getAllAppMediaCategories();
|
|
} else {
|
|
$categories = $this->mediaCategoriesRepository->getAllUserCategories($userId);
|
|
}
|
|
foreach ($categories as $category) {
|
|
$category->count = $this->mediaCategoriesRepository->getMediaFilesCount($category->id);
|
|
}
|
|
$categories = array_merge([
|
|
[
|
|
'id' => 'all',
|
|
'name' => trans('mediaLibrary.all'),
|
|
'count' => $hasAppCategoryPermission
|
|
? $this->mediaFileRepository->getAppMediasCount()
|
|
: $this->mediaFileRepository->getUserMediasCount($userId)
|
|
],
|
|
[
|
|
'id' => 'uncategorized',
|
|
'name' => trans('mediaLibrary.uncategorized'),
|
|
'count' => $hasAppCategoryPermission
|
|
? $this->mediaFileRepository->getAppUncategorizedMediasCount()
|
|
: $this->mediaFileRepository->getUserUncategorizedMediasCount($userId)
|
|
]
|
|
] , $categories->toArray());
|
|
$responseData['mediaCategories'] = $categories;
|
|
return response()->json($responseData);
|
|
} else {
|
|
return response()->json($responseData, 401);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 新增媒體庫分類
|
|
*
|
|
* @param Request $request
|
|
* @return \Illuminate\Http\JsonResponse
|
|
*/
|
|
public function store(Request $request)
|
|
{
|
|
$this->protectFromNoneAjaxRequest($request);
|
|
|
|
Validator::make($request->all(), [
|
|
'name' => 'required|min:1'
|
|
])->validate();
|
|
|
|
$status = 200;
|
|
if(Auth::check()) {
|
|
$userId = Auth::id();
|
|
$hasAppMediaCategoryPermission = $this->hasAppMediaCategoryPermission();
|
|
$category = $this->mediaCategoriesRepository->addCategory($request->get('name'), $userId, $hasAppMediaCategoryPermission);
|
|
if(!$category) {
|
|
$status = 500;
|
|
}
|
|
} else {
|
|
$status = 401;
|
|
}
|
|
if($status == 200) {
|
|
return response()->json([
|
|
'mediaCategory' => $category,
|
|
'message' => trans('message.categoryNameHasBeenAdded', ['name' => $category->name])
|
|
]);
|
|
} else {
|
|
return response()->json([
|
|
'message' => trans('message.failToAddCategory')
|
|
], $status);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 更新媒體庫分類
|
|
*
|
|
* @param Request $request
|
|
* @param $categoryId
|
|
* @return \Illuminate\Http\JsonResponse
|
|
*/
|
|
public function update(Request $request, $categoryId)
|
|
{
|
|
$this->protectFromNoneAjaxRequest($request);
|
|
|
|
Validator::make($request->all(), [
|
|
'name' => 'required|min:1'
|
|
])->validate();
|
|
|
|
$category = $this->mediaCategoriesRepository->getCategory($categoryId);
|
|
|
|
$status = 200;
|
|
if(Auth::check()) {
|
|
if($category) {
|
|
$permissionCheck = true;
|
|
if($this->hasAppMediaCategoryPermission()) {
|
|
if(!$category->is_app_media_category) {
|
|
$permissionCheck = false;
|
|
}
|
|
} else {
|
|
if($category->user_id != Auth::id()) {
|
|
$permissionCheck = false;
|
|
}
|
|
}
|
|
|
|
if($permissionCheck) {
|
|
$category->name = $request->get('name');
|
|
$saved = $category->save();
|
|
if(!$saved) {
|
|
$status = 500;
|
|
}
|
|
} else {
|
|
$status = 403;
|
|
}
|
|
} else {
|
|
$status = 400;
|
|
}
|
|
} else {
|
|
$status = 401;
|
|
}
|
|
|
|
if($status == 200) {
|
|
return response()->json([
|
|
'id' => $categoryId,
|
|
'name' => $request->get('name'),
|
|
'message' => trans('message.categoryNameHasBeenUpdated', ['name' => $request->get('name')])
|
|
]);
|
|
} else {
|
|
return response()->json([
|
|
'message' => trans('message.failToUpdateCategoryName')
|
|
], $status);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 刪除媒體庫分類
|
|
*
|
|
* @param Request $request
|
|
* @param $categoryId
|
|
* @return \Illuminate\Http\JsonResponse
|
|
* @throws \Exception
|
|
*/
|
|
public function destroy(Request $request, $categoryId)
|
|
{
|
|
$this->protectFromNoneAjaxRequest($request);
|
|
$status = 200;
|
|
if(Auth::check()) {
|
|
$category = $this->mediaCategoriesRepository->getCategory($categoryId);
|
|
if($category) {
|
|
$permissionCheck = true;
|
|
if($this->hasAppMediaCategoryPermission()) {
|
|
if(!$category->is_app_media_category) {
|
|
$permissionCheck = false;
|
|
}
|
|
} else {
|
|
if($category->user_id != Auth::id()) {
|
|
$permissionCheck = false;
|
|
}
|
|
}
|
|
if($permissionCheck) {
|
|
$mediaFilesCount = $category->mediaFiles->count();
|
|
$category->delete();
|
|
} else {
|
|
$status = 403;
|
|
}
|
|
} else {
|
|
$status = 400;
|
|
}
|
|
} else {
|
|
$status = 401;
|
|
}
|
|
|
|
if($status == 200) {
|
|
return response()->json([
|
|
'id' => $category->id,
|
|
'count' => $mediaFilesCount,
|
|
'message' => trans('message.categoryNameHasBeenDeleted', ['name' => $category->name])
|
|
]);
|
|
} else {
|
|
return response()->json([
|
|
'message' => trans('message.failToDeleteCategory')
|
|
]);
|
|
}
|
|
|
|
}
|
|
|
|
/**
|
|
* 更新分類順序
|
|
*
|
|
* @param Request $request
|
|
* @return \Illuminate\Http\JsonResponse
|
|
*/
|
|
public function updateOrder(Request $request)
|
|
{
|
|
$this->protectFromNoneAjaxRequest($request);
|
|
|
|
$this->validate($request, [
|
|
'ids' => 'required|min:1'
|
|
]);
|
|
|
|
$status = 200;
|
|
|
|
$mediaCategories = [];
|
|
$ids = explode(',', $request->get('ids'));
|
|
foreach ($ids as $id) {
|
|
$mediaCategories[] = $this->mediaCategoriesRepository->getCategory($id);
|
|
}
|
|
|
|
if(Auth::check()) {
|
|
$existenceCheck = true;
|
|
|
|
foreach ($mediaCategories as $mediaCategory) {
|
|
$existenceCheck = $existenceCheck && $mediaCategory;
|
|
}
|
|
|
|
if($existenceCheck) {
|
|
$permissionCheck = true;
|
|
|
|
if($this->hasAppMediaCategoryPermission()) {
|
|
foreach ($mediaCategories as $mediaCategory) {
|
|
$permissionCheck = $permissionCheck && $mediaCategory->is_app_media_category;
|
|
}
|
|
} else {
|
|
foreach ($mediaCategories as $mediaCategory) {
|
|
$permissionCheck = $permissionCheck && ($mediaCategory->user_id == Auth::id());
|
|
}
|
|
}
|
|
|
|
if($permissionCheck) {
|
|
foreach ($mediaCategories as $index => $mediaCategory) {
|
|
$mediaCategory->seq = $index;
|
|
$mediaCategory->save();
|
|
}
|
|
} else {
|
|
$status = 403;
|
|
}
|
|
} else {
|
|
$status = 400;
|
|
}
|
|
} else {
|
|
$status = 401;
|
|
}
|
|
|
|
if($status == 200) {
|
|
return response()->json([]);
|
|
} else {
|
|
return response()->json([
|
|
'message' => trans('message.failToReOrderCategory', $status)
|
|
]);
|
|
}
|
|
}
|
|
}
|