310 lines
		
	
	
		
			9.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			310 lines
		
	
	
		
			9.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
namespace frontend\modules\api\controllers;
 | 
						|
 | 
						|
use common\classes\Debug;
 | 
						|
use common\models\File;
 | 
						|
use frontend\modules\api\models\FileEntity;
 | 
						|
use frontend\modules\api\models\Timer;
 | 
						|
use yii\helpers\FileHelper;
 | 
						|
use yii\web\NotFoundHttpException;
 | 
						|
use yii\web\ServerErrorHttpException;
 | 
						|
use yii\web\UploadedFile;
 | 
						|
 | 
						|
class FileController extends ApiController
 | 
						|
{
 | 
						|
    public function verbs(): array
 | 
						|
    {
 | 
						|
        return [
 | 
						|
            'upload' => ['post'],
 | 
						|
            'attach' => ['post'],
 | 
						|
            'detach' => ['delete'],
 | 
						|
            'get-by-entity' => ['get'],
 | 
						|
        ];
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     *
 | 
						|
     * @OA\Post(path="/file/upload",
 | 
						|
     *   summary="Загрузить файл",
 | 
						|
     *   description="Метод для загрузки файлов",
 | 
						|
     *   security={
 | 
						|
     *     {"bearerAuth": {}}
 | 
						|
     *   },
 | 
						|
     *   tags={"File"},
 | 
						|
     *
 | 
						|
     *   @OA\RequestBody(
 | 
						|
     *     @OA\MediaType(
 | 
						|
     *       mediaType="multipart/form-data",
 | 
						|
     *       @OA\Schema(
 | 
						|
     *          required={"uploadFile"},
 | 
						|
     *          @OA\Property(
 | 
						|
     *              property="uploadFile",
 | 
						|
     *              type="file",
 | 
						|
     *              description="Файл который необходимо загрузить",
 | 
						|
     *          ),
 | 
						|
     *       ),
 | 
						|
     *     ),
 | 
						|
     *   ),
 | 
						|
     *   @OA\Response(
 | 
						|
     *     response=200,
 | 
						|
     *     description="Возвращает объект Файла",
 | 
						|
     *     @OA\MediaType(
 | 
						|
     *         mediaType="application/json",
 | 
						|
     *         @OA\Schema(ref="#/components/schemas/FileExample"),
 | 
						|
     *     ),
 | 
						|
     *   ),
 | 
						|
     * )
 | 
						|
     *
 | 
						|
     * @return array
 | 
						|
     * @throws ServerErrorHttpException
 | 
						|
     * @throws \yii\base\Exception
 | 
						|
     */
 | 
						|
    public function actionUpload()
 | 
						|
    {
 | 
						|
        $uploads = UploadedFile::getInstancesByName("uploadFile");
 | 
						|
        if (empty($uploads)) {
 | 
						|
            throw new ServerErrorHttpException("Must upload at least 1 file in uploadFile form-data POST");
 | 
						|
        }
 | 
						|
 | 
						|
        $savedFiles = [];
 | 
						|
        foreach ($uploads as $file) {
 | 
						|
            $md5 = md5($file->baseName);
 | 
						|
            $path = \Yii::getAlias("@frontend/web/files/") . $md5[0] . $md5[1] . "/" . $md5[2] . $md5[3] . "/";
 | 
						|
            if (!file_exists($path)) {
 | 
						|
                FileHelper::createDirectory($path);
 | 
						|
            }
 | 
						|
 | 
						|
            $path .= $md5 . '.' . $file->getExtension();
 | 
						|
            $file->saveAs($path);
 | 
						|
 | 
						|
            if (!$file->hasError) {
 | 
						|
                $fileModel = new File();
 | 
						|
                $fileModel->name = $file->name;
 | 
						|
                $fileModel->path = $path;
 | 
						|
                $fileModel->url = "/files/" . $md5[0] . $md5[1] . "/" . $md5[2] . $md5[3] . "/" . $md5 . '.' . $file->getExtension();
 | 
						|
                $fileModel->type = $file->getExtension();
 | 
						|
                $fileModel->{'mime-type'} = $file->type;
 | 
						|
 | 
						|
                if (!$fileModel->validate()) {
 | 
						|
                    throw new ServerErrorHttpException(json_encode($fileModel->errors));
 | 
						|
                }
 | 
						|
 | 
						|
                $fileModel->save();
 | 
						|
                $savedFiles[] = $fileModel;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        return $savedFiles;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     *
 | 
						|
     * @OA\Post(path="/file/attach",
 | 
						|
     *   summary="Прикрепить файл",
 | 
						|
     *   description="Метод для прикрепления файлов",
 | 
						|
     *   security={
 | 
						|
     *     {"bearerAuth": {}}
 | 
						|
     *   },
 | 
						|
     *   tags={"File"},
 | 
						|
     *
 | 
						|
     *   @OA\RequestBody(
 | 
						|
     *     @OA\MediaType(
 | 
						|
     *       mediaType="multipart/form-data",
 | 
						|
     *       @OA\Schema(
 | 
						|
     *          required={"file_id", "entity_type", "entity_id"},
 | 
						|
     *          @OA\Property(
 | 
						|
     *              property="file_id",
 | 
						|
     *              type="intager",
 | 
						|
     *              example=232,
 | 
						|
     *              description="Идентификатор файла",
 | 
						|
     *          ),
 | 
						|
     *          @OA\Property(
 | 
						|
     *              property="entity_type",
 | 
						|
     *              type="intager",
 | 
						|
     *              example=2,
 | 
						|
     *              description="Идентификатор типа сущности",
 | 
						|
     *          ),
 | 
						|
     *          @OA\Property(
 | 
						|
     *              property="entity_id",
 | 
						|
     *              type="intager",
 | 
						|
     *              example=234,
 | 
						|
     *              description="Идентификатор сущности",
 | 
						|
     *          ),
 | 
						|
     *          @OA\Property(
 | 
						|
     *              property="status",
 | 
						|
     *              type="intager",
 | 
						|
     *              example=1,
 | 
						|
     *              description="Статус",
 | 
						|
     *          ),
 | 
						|
     *       ),
 | 
						|
     *     ),
 | 
						|
     *   ),
 | 
						|
     *   @OA\Response(
 | 
						|
     *     response=200,
 | 
						|
     *     description="Возвращает объект прикрепления",
 | 
						|
     *     @OA\MediaType(
 | 
						|
     *         mediaType="application/json",
 | 
						|
     *         @OA\Schema(ref="#/components/schemas/FileEntity"),
 | 
						|
     *     ),
 | 
						|
     *   ),
 | 
						|
     * )
 | 
						|
     *
 | 
						|
     * @return FileEntity
 | 
						|
     * @throws NotFoundHttpException
 | 
						|
     * @throws ServerErrorHttpException
 | 
						|
     */
 | 
						|
    public function actionAttach(): FileEntity
 | 
						|
    {
 | 
						|
        $request = \Yii::$app->request->post();
 | 
						|
        $file = File::findOne($request['file_id']);
 | 
						|
        if (!$file) {
 | 
						|
            throw new NotFoundHttpException('File bot found');
 | 
						|
        }
 | 
						|
 | 
						|
        $fileEntity = new FileEntity();
 | 
						|
        $fileEntity->load($request, '');
 | 
						|
 | 
						|
        if (!$fileEntity->validate()) {
 | 
						|
            throw new ServerErrorHttpException(json_encode($fileEntity->errors));
 | 
						|
        }
 | 
						|
 | 
						|
        $fileEntity->save();
 | 
						|
 | 
						|
        return $fileEntity;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     *
 | 
						|
     * @OA\Delete (path="/file/detach",
 | 
						|
     *   summary="Открепить файл",
 | 
						|
     *   description="Метод для открепления файлов",
 | 
						|
     *   security={
 | 
						|
     *     {"bearerAuth": {}}
 | 
						|
     *   },
 | 
						|
     *   tags={"File"},
 | 
						|
     *
 | 
						|
     *   @OA\RequestBody(
 | 
						|
     *     @OA\MediaType(
 | 
						|
     *       mediaType="application/x-www-form-urlencoded",
 | 
						|
     *       @OA\Schema(
 | 
						|
     *          required={"file_id", "entity_type", "entity_id"},
 | 
						|
     *          @OA\Property(
 | 
						|
     *              property="file_id",
 | 
						|
     *              type="intager",
 | 
						|
     *              example=232,
 | 
						|
     *              description="Идентификатор файла",
 | 
						|
     *          ),
 | 
						|
     *          @OA\Property(
 | 
						|
     *              property="entity_type",
 | 
						|
     *              type="intager",
 | 
						|
     *              example=2,
 | 
						|
     *              description="Идентификатор типа сущности",
 | 
						|
     *          ),
 | 
						|
     *          @OA\Property(
 | 
						|
     *              property="entity_id",
 | 
						|
     *              type="intager",
 | 
						|
     *              example=234,
 | 
						|
     *              description="Идентификатор сущности",
 | 
						|
     *          ),
 | 
						|
     *          @OA\Property(
 | 
						|
     *              property="status",
 | 
						|
     *              type="intager",
 | 
						|
     *              example=1,
 | 
						|
     *              description="Статус",
 | 
						|
     *          ),
 | 
						|
     *       ),
 | 
						|
     *     ),
 | 
						|
     *   ),
 | 
						|
     *   @OA\Response(
 | 
						|
     *     response=200,
 | 
						|
     *     description="Возвращает объект прикрепления",
 | 
						|
     *     @OA\MediaType(
 | 
						|
     *         mediaType="application/json",
 | 
						|
     *         @OA\Schema(ref="#/components/schemas/FileEntity"),
 | 
						|
     *     ),
 | 
						|
     *   ),
 | 
						|
     * )
 | 
						|
     *
 | 
						|
     * @return FileEntity
 | 
						|
     * @throws NotFoundHttpException
 | 
						|
     * @throws ServerErrorHttpException
 | 
						|
     */
 | 
						|
    public function actionDetach(): FileEntity
 | 
						|
    {
 | 
						|
        $request = \Yii::$app->request->getBodyParams();
 | 
						|
        $file = File::findOne($request['file_id']);
 | 
						|
        if (!$file) {
 | 
						|
            throw new NotFoundHttpException('File bot found');
 | 
						|
        }
 | 
						|
 | 
						|
        $fileEntity = FileEntity::findOne(['file_id' => $request['file_id'], 'entity_type' => $request['entity_type'], 'entity_id' => $request['entity_id']]);
 | 
						|
        //$fileEntity->load($request, '');
 | 
						|
        $fileEntity->status = FileEntity::STATUS_DISABLE;
 | 
						|
 | 
						|
        if (!$fileEntity->validate()) {
 | 
						|
            throw new ServerErrorHttpException(json_encode($fileEntity->errors));
 | 
						|
        }
 | 
						|
 | 
						|
        $fileEntity->save();
 | 
						|
 | 
						|
        return $fileEntity;
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
    /**
 | 
						|
     *
 | 
						|
     * @OA\Get(path="/file/get-by-entity",
 | 
						|
     *   summary="Получить файл по идентификатору сущности",
 | 
						|
     *   description="Метод для получения файла по идентификатору сущности.",
 | 
						|
     *   security={
 | 
						|
     *     {"bearerAuth": {}}
 | 
						|
     *   },
 | 
						|
     *   tags={"File"},
 | 
						|
     *   @OA\Parameter(
 | 
						|
     *      name="entity_id",
 | 
						|
     *      in="query",
 | 
						|
     *      required=true,
 | 
						|
     *      @OA\Schema(
 | 
						|
     *        type="integer",
 | 
						|
     *        default=null
 | 
						|
     *      )
 | 
						|
     *   ),
 | 
						|
     *
 | 
						|
     *   @OA\Parameter(
 | 
						|
     *      name="entity_type",
 | 
						|
     *      in="query",
 | 
						|
     *      required=true,
 | 
						|
     *      @OA\Schema(
 | 
						|
     *        type="integer",
 | 
						|
     *        default=null
 | 
						|
     *      )
 | 
						|
     *   ),
 | 
						|
     *
 | 
						|
     *   @OA\Response(
 | 
						|
     *     response=200,
 | 
						|
     *     description="Возвращает массив объектов Файлов",
 | 
						|
     *     @OA\MediaType(
 | 
						|
     *         mediaType="application/json",
 | 
						|
     *         @OA\Schema(ref="#/components/schemas/FileEntity"),
 | 
						|
     *     ),
 | 
						|
     *   ),
 | 
						|
     * )
 | 
						|
     *
 | 
						|
     * @param int $entity_type
 | 
						|
     * @param int $entity_id
 | 
						|
     * @return array
 | 
						|
     * @throws NotFoundHttpException
 | 
						|
     */
 | 
						|
    public function actionGetByEntity(int $entity_type, int $entity_id): array
 | 
						|
    {
 | 
						|
        $model = FileEntity::find()->where(['entity_type' => $entity_type, 'entity_id' => $entity_id, 'status' => FileEntity::STATUS_ACTIVE])->all();
 | 
						|
 | 
						|
        if (!$model) {
 | 
						|
            throw new NotFoundHttpException('The file not found');
 | 
						|
        }
 | 
						|
 | 
						|
        return $model;
 | 
						|
    }
 | 
						|
 | 
						|
} |