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) ]); } } }