You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

250 lines
7.4 KiB

2 years ago
<?php
declare(strict_types=1);
namespace App\Http\Controllers;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\Storage;
use OpenApi\Annotations as OA;
class Admin extends Controller
{
/**
* Префикс галерей на диске
* @var string
*/
private $prefixGallery = null;
public function __construct()
{
$this->prefixGallery = env("GALLERY_PREFIX", "/gallery/");
}
/**
* Создает галерею, ее имя и будет являться ключем для галереи
* @return JsonResponse
*
* @OA\Post(
* path="/api/admin/gallery/create",
* tags={"admin"},
* operationId="createGallery",
* description="Create new gallery",
* @OA\Response(
* response=400,
* description="Invalid input"
* ),
* @OA\Response(
* response=200,
* description="successful operation",
* @OA\JsonContent(ref="#/components/schemas/Gallery"),
* ),
* )
*/
public function createGallery(): JsonResponse
{
$folderName = md5(uniqid());
Storage::makeDirectory($this->prefixGallery . $folderName);
$model = new \App\DTO\Gallery();
$model->name = $folderName;
return response()->json($model);
}
/**
* Удаляет галерею вместе с содержимым
* @param $id string
* @return Response
*
* @OA\Delete(
* path="/api/admin/gallery/remove/{id}",
* tags={"admin"},
* operationId="removeGallery",
* description="Remove gallery with all photo",
* @OA\Parameter(
* name="id",
* in="path",
* required=true,
* description="Идентификатор галереи",
* @OA\Schema(
* type="string"
* )
* ),
* @OA\Response(
* response=400,
* description="Invalid input"
* ),
* @OA\Response(
* response=200,
* description="Success delete"
* ),
* )
*/
public function removeGallery(string $id): Response
{
$result = Storage::deleteDirectory($this->prefixGallery . $id);
return response('',$result ? 200 : 400);
}
/**
* Возвращает список галерей
* @return JsonResponse
*
* @OA\Get(
* path="/api/admin/gallery/list",
* tags={"admin"},
* operationId="getGalleryList",
* description="Get list gallery",
* @OA\Response(
* response=400,
* description="Invalid input"
* ),
* @OA\Response(
* response=200,
* description="Список существующих галерей, без файлов.",
* @OA\JsonContent(
* type="array",
* @OA\Items(ref="#/components/schemas/Gallery")
* )
* ),
* )
*/
public function listGallery(): JsonResponse
{
$list = Storage::allDirectories($this->prefixGallery);
$list=array_map(static function ($item){
$gal=new \App\DTO\Gallery();
$gal->name=explode('/',$item)[1];
return $gal;
},$list);
return response()->json($list);
}
/**
* Загрузка файлов
* @param Request $request
* @param string $id
* @return JsonResponse
*
* @OA\Post(
* path="/api/admin/file/upload/{galleryId}",
* tags={"admin"},
* operationId="uploadFile",
* description="Upload file in gallery",
* @OA\Parameter(
* name="galleryId",
* in="path",
* required=true,
* description="Идентификатор галереи",
* @OA\Schema(
* type="string"
* )
* ),
* @OA\RequestBody(
* required=true,
* @OA\MediaType(
* mediaType="multipart/form-data",
* @OA\Schema(
* @OA\Property(
* description="Photo file",
* property="file",
* type="string",
* format="binary",
* ),
* required={"file"}
* )
* )
* ),
* @OA\Response(
* response=400,
* description="Invalid input"
* ),
* @OA\Response(
* response=200,
* description="successful operation",
* @OA\JsonContent(
* @OA\Property(
* property="fileId",
* type="string",
* example="1bc29b36f623ba82aaf6724fd3b16718",
* description="Идентификатор фотографии"
* ),
* @OA\Property(
* property="galleryId",
* type="string",
* example="1bc29b36f623ba82aaf6724fd3b16718",
* description="Идентификатор галереи"
* ),
* ),
* ),
* )
*/
public function uploadFile(Request $request, string $id): JsonResponse
{
$file = $request->file('file');
$list = explode(',', env("ALLOW_MIME_TYPES", "jpeg,png"));
$list = array_map(static function ($item) {
return 'image/' . $item;
}, $list);
if (empty($file) || !in_array($file->getMimeType(), $list, true)) {
abort(400, 'Only jpg/png files!');
}
$fileName = implode(".",[md5(uniqid()),$file->extension()]);
$result = Storage::put($this->prefixGallery . $id . "/".$fileName,$file->getContent() );
if ($result) {
return response()->json(['galleryId' => $id, 'fileId' => $fileName]);
} else {
abort(400, 'File not found or not write');
}
}
/**
* Удаляет фотографию из галереи
* @param string $galleryId
* @param string $fileId
* @return Response
*
* @OA\Delete(
* path="/api/admin/file/remove/{galleryId}/{fileId} ",
* tags={"admin"},
* operationId="removeFile",
* description="Remove file in gallery",
* @OA\Parameter(
* name="galleryId",
* in="path",
* required=true,
* description="Идентификатор галереи",
* @OA\Schema(
* type="string"
* )
* ),
* @OA\Parameter(
* name="fileId",
* in="path",
* required=true,
* description="Идентификатор фотографии",
* @OA\Schema(
* type="string"
* )
* ),
* @OA\Response(
* response=400,
* description="Invalid input"
* ),
* @OA\Response(
* response=200,
* description="Success delete"
* ),
* )
*/
public function removeFile(string $galleryId, string $fileId): Response
{
$result = Storage::delete($this->prefixGallery . $galleryId . "/" . $fileId);
return response('',$result ? 200 : 400);
}
}