cms/app/Http/Controllers/MediaCategoryController.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)
]);
}
}
}