501 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			501 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						||
 | 
						||
namespace frontend\modules\api\controllers;
 | 
						||
 | 
						||
use common\classes\Debug;
 | 
						||
use common\models\ProjectTaskCategory;
 | 
						||
use common\models\Status;
 | 
						||
use common\models\UseStatus;
 | 
						||
use frontend\modules\api\models\Manager;
 | 
						||
use frontend\modules\api\models\Project;
 | 
						||
use frontend\modules\api\models\ProjectUser;
 | 
						||
use Yii;
 | 
						||
use yii\data\ActiveDataProvider;
 | 
						||
use yii\helpers\ArrayHelper;
 | 
						||
use yii\web\BadRequestHttpException;
 | 
						||
use yii\web\NotFoundHttpException;
 | 
						||
 | 
						||
class ProjectController extends ApiController
 | 
						||
{
 | 
						||
    public $modelClass = 'frontend\modules\api\models\Project';
 | 
						||
    public $serializer = [
 | 
						||
        'class' => 'yii\rest\Serializer',
 | 
						||
        'collectionEnvelope' => 'projects',
 | 
						||
    ];
 | 
						||
 | 
						||
    public function behaviors(): array
 | 
						||
    {
 | 
						||
        return ArrayHelper::merge(parent::behaviors(), [
 | 
						||
 | 
						||
            'verbs' => [
 | 
						||
                'class' => \yii\filters\VerbFilter::class,
 | 
						||
                'actions' => [
 | 
						||
                    'get-project' => ['GET', 'OPTIONS'],
 | 
						||
                    'project-list' => ['GET', 'OPTIONS'],
 | 
						||
                    'status-list' => ['GET', 'OPTIONS'],
 | 
						||
                    'project-task-category-list' => ['GET', 'OPTIONS'],
 | 
						||
                    'create' => ['POST', 'OPTIONS'],
 | 
						||
                    'add-user' => ['POST', 'OPTIONS'],
 | 
						||
                    'update' => ['PUT', 'OPTIONS']
 | 
						||
                ],
 | 
						||
            ]
 | 
						||
        ]);
 | 
						||
    }
 | 
						||
 | 
						||
    /**
 | 
						||
     *
 | 
						||
     * @OA\Get(path="/project/get-project",
 | 
						||
     *   summary="Получить данные проекта",
 | 
						||
     *   description="Метод для получения проета<br>
 | 
						||
    Статусы:<br>
 | 
						||
    10 - Закрыт<br>
 | 
						||
    19 - Работает",
 | 
						||
     *   security={
 | 
						||
     *     {"bearerAuth": {}}
 | 
						||
     *   },
 | 
						||
     *   tags={"TaskManager"},
 | 
						||
     *   @OA\Parameter(
 | 
						||
     *      name="project_id",
 | 
						||
     *      in="query",
 | 
						||
     *      required=true,
 | 
						||
     *      @OA\Schema(
 | 
						||
     *        type="integer",
 | 
						||
     *        default=null
 | 
						||
     *      )
 | 
						||
     *   ),
 | 
						||
     *   @OA\Parameter(
 | 
						||
     *      name="expand",
 | 
						||
     *      in="query",
 | 
						||
     *      required=false,
 | 
						||
     *      description="В этом параметре по необходимости передаются поля, которые нужно добавить в ответ сервера, сейчас доступно только поле <b>columns</b>",
 | 
						||
     *      @OA\Schema(
 | 
						||
     *        type="string",
 | 
						||
     *      )
 | 
						||
     *   ),
 | 
						||
     *   @OA\Response(
 | 
						||
     *     response=200,
 | 
						||
     *     description="Возвращает массив объектов проекта",
 | 
						||
     *     @OA\MediaType(
 | 
						||
     *         mediaType="application/json",
 | 
						||
     *         @OA\Schema(ref="#/components/schemas/Project"),
 | 
						||
     *     ),
 | 
						||
     *   ),
 | 
						||
     * )
 | 
						||
     *
 | 
						||
     * @param $project_id
 | 
						||
     * @return array|Project|\yii\db\ActiveRecord|null
 | 
						||
     */
 | 
						||
    public function actionGetProject($project_id)
 | 
						||
    {
 | 
						||
        return Project::find()->with('columns')->where(['id' => $project_id])->one();
 | 
						||
    }
 | 
						||
 | 
						||
    /**
 | 
						||
     *
 | 
						||
     * @OA\Get(path="/project/project-list",
 | 
						||
     *   summary="Список проектов",
 | 
						||
     *   description="Метод для получения списка проетов, если не передан параметр user_id, то возвращаются проеты текущего пользователя.<br>
 | 
						||
    Статусы:<br>
 | 
						||
    10 - Закрыт<br>
 | 
						||
    19 - Работает",
 | 
						||
     *   security={
 | 
						||
     *     {"bearerAuth": {}}
 | 
						||
     *   },
 | 
						||
     *   tags={"TaskManager"},
 | 
						||
     *   @OA\Parameter(
 | 
						||
     *      name="user_id",
 | 
						||
     *      in="query",
 | 
						||
     *      required=false,
 | 
						||
     *      @OA\Schema(
 | 
						||
     *        type="integer",
 | 
						||
     *        default=null
 | 
						||
     *      )
 | 
						||
     *   ),
 | 
						||
     *   @OA\Parameter(
 | 
						||
     *      name="expand",
 | 
						||
     *      in="query",
 | 
						||
     *      required=false,
 | 
						||
     *      description="В этом параметре по необходимости передаются поля, которые нужно добавить в ответ сервера, сейчас доступно только поле <b>columns</b>",
 | 
						||
     *      @OA\Schema(
 | 
						||
     *        type="string",
 | 
						||
     *      )
 | 
						||
     *   ),
 | 
						||
     *
 | 
						||
     *   @OA\Response(
 | 
						||
     *     response=200,
 | 
						||
     *     description="Возвращает массив объектов проекта",
 | 
						||
     *     @OA\MediaType(
 | 
						||
     *         mediaType="application/json",
 | 
						||
     *         @OA\Schema(ref="#/components/schemas/ProjectExample"),
 | 
						||
     *     ),
 | 
						||
     *   ),
 | 
						||
     * )
 | 
						||
     *
 | 
						||
     * @param $user_id
 | 
						||
     * @return ActiveDataProvider
 | 
						||
     */
 | 
						||
    public function actionProjectList($user_id = null): ActiveDataProvider
 | 
						||
    {
 | 
						||
        if (!$user_id) {
 | 
						||
            $user_id = Yii::$app->user->id;
 | 
						||
        }
 | 
						||
        if (!empty($user_id)) {
 | 
						||
            $projectIdList = ProjectUser::find()->where(['user_id' => $user_id])->select('project_id')->column();
 | 
						||
            $query = Project::find()->where(['IN', 'id', $projectIdList])->orWhere(['owner_id' => $user_id, 'status' => Project::STATUS_OTHER]);
 | 
						||
        } else {
 | 
						||
            $query = Project::find();
 | 
						||
        }
 | 
						||
 | 
						||
        return new ActiveDataProvider([
 | 
						||
            'query' => $query,
 | 
						||
        ]);
 | 
						||
    }
 | 
						||
 | 
						||
    public function actionStatusList(): array
 | 
						||
    {
 | 
						||
        return Status::find()
 | 
						||
            ->joinWith('useStatuses')
 | 
						||
            ->where(['`use_status`.`use`' => UseStatus::USE_PROJECT])->all();
 | 
						||
    }
 | 
						||
 | 
						||
    public function actionProjectTaskCategoryList($project_id): array
 | 
						||
    {
 | 
						||
        return ProjectTaskCategory::find()->where(['project_id' => $project_id])->all();
 | 
						||
    }
 | 
						||
 | 
						||
    public function actionCreateProjectTaskCategory()
 | 
						||
    {
 | 
						||
        $projectTaskCategory = new ProjectTaskCategory();
 | 
						||
        $projectTaskCategory->attributes = \yii::$app->request->post();
 | 
						||
 | 
						||
        if ($projectTaskCategory->validate()) {
 | 
						||
            $projectTaskCategory->save(false);
 | 
						||
            return $projectTaskCategory;
 | 
						||
        }
 | 
						||
        return $projectTaskCategory->errors;
 | 
						||
    }
 | 
						||
 | 
						||
    public function actionUpdateProjectTaskCategory()
 | 
						||
    {
 | 
						||
        $projectTaskCategory = ProjectTaskCategory::find()
 | 
						||
            ->where(['project_id' => Yii::$app->request->post('project_id')])
 | 
						||
            ->andWhere(['title' => Yii::$app->request->post('title')])
 | 
						||
            ->one();
 | 
						||
 | 
						||
        if (empty($projectTaskCategory)) {
 | 
						||
            throw new NotFoundHttpException('The project not found');
 | 
						||
        }
 | 
						||
 | 
						||
        $projectTaskCategory->title = Yii::$app->request->post('new_title');
 | 
						||
        if (!$projectTaskCategory->update() && $projectTaskCategory->hasErrors()) {
 | 
						||
            return $projectTaskCategory->errors;
 | 
						||
        }
 | 
						||
        return $projectTaskCategory;
 | 
						||
    }
 | 
						||
 | 
						||
    /**
 | 
						||
     *
 | 
						||
     * @OA\Post(path="/project/create",
 | 
						||
     *   summary="Добавить проект",
 | 
						||
     *   description="Метод для создания проекта, если не передан параметр <b>user_id</b>, то будет получен текущий пользователь<br>
 | 
						||
    Статусы:<br>
 | 
						||
    10 - Закрыт<br>
 | 
						||
    19 - Работает",
 | 
						||
     *   security={
 | 
						||
     *     {"bearerAuth": {}}
 | 
						||
     *   },
 | 
						||
     *   tags={"TaskManager"},
 | 
						||
     *
 | 
						||
     *   @OA\RequestBody(
 | 
						||
     *     @OA\MediaType(
 | 
						||
     *       mediaType="multipart/form-data",
 | 
						||
     *       @OA\Schema(
 | 
						||
     *          required={"name", "status"},
 | 
						||
     *          @OA\Property(
 | 
						||
     *              property="name",
 | 
						||
     *              type="string",
 | 
						||
     *              description="Название проекта",
 | 
						||
     *          ),
 | 
						||
     *          @OA\Property(
 | 
						||
     *              property="description",
 | 
						||
     *              type="string",
 | 
						||
     *              description="Описание проекта",
 | 
						||
     *          ),
 | 
						||
     *          @OA\Property(
 | 
						||
     *              property="status",
 | 
						||
     *              type="integer",
 | 
						||
     *              description="статус",
 | 
						||
     *          ),
 | 
						||
     *          @OA\Property(
 | 
						||
     *              property="company_id",
 | 
						||
     *              type="integer",
 | 
						||
     *              description="Компания к которой относится проект",
 | 
						||
     *          ),
 | 
						||
     *       ),
 | 
						||
     *     ),
 | 
						||
     *   ),
 | 
						||
     *   @OA\Response(
 | 
						||
     *     response=200,
 | 
						||
     *     description="Возвращает объект Проекта",
 | 
						||
     *     @OA\MediaType(
 | 
						||
     *         mediaType="application/json",
 | 
						||
     *         @OA\Schema(ref="#/components/schemas/Project"),
 | 
						||
     *     ),
 | 
						||
     *   ),
 | 
						||
     * )
 | 
						||
     *
 | 
						||
     * @return array|Project
 | 
						||
     * @throws BadRequestHttpException
 | 
						||
     */
 | 
						||
    public function actionCreate()
 | 
						||
    {
 | 
						||
        $project = new Project();
 | 
						||
        $user_id = \Yii::$app->user->id;
 | 
						||
        if (!$user_id) {
 | 
						||
            throw new BadRequestHttpException(json_encode(['Пользователь не найден']));
 | 
						||
        }
 | 
						||
        $project->load(\yii::$app->request->post(), '');
 | 
						||
        $project->owner_id = $user_id;
 | 
						||
 | 
						||
        if ($project->validate()) {
 | 
						||
            $project->save(false);
 | 
						||
            return $project;
 | 
						||
        }
 | 
						||
        return $project->errors;
 | 
						||
    }
 | 
						||
 | 
						||
    /**
 | 
						||
     *
 | 
						||
     * @OA\PUT(path="/project/update",
 | 
						||
     *   summary="Редактировать проект",
 | 
						||
     *   description="Метод для редактирования проекта<br>
 | 
						||
    Статусы:<br>
 | 
						||
    10 - Закрыт<br>
 | 
						||
    19 - Работает",
 | 
						||
     *   security={
 | 
						||
     *     {"bearerAuth": {}}
 | 
						||
     *   },
 | 
						||
     *   tags={"TaskManager"},
 | 
						||
     *
 | 
						||
     *   @OA\RequestBody(
 | 
						||
     *     @OA\MediaType(
 | 
						||
     *       mediaType="application/x-www-form-urlencoded",
 | 
						||
     *       @OA\Schema(
 | 
						||
     *          required={"project_id"},
 | 
						||
     *          @OA\Property(
 | 
						||
     *              property="project_id",
 | 
						||
     *              type="integer",
 | 
						||
     *              description="Идентификатор проекта",
 | 
						||
     *          ),
 | 
						||
     *          @OA\Property(
 | 
						||
     *              property="name",
 | 
						||
     *              type="string",
 | 
						||
     *              description="Название проекта",
 | 
						||
     *          ),
 | 
						||
     *          @OA\Property(
 | 
						||
     *              property="description",
 | 
						||
     *              type="string",
 | 
						||
     *              description="Описание проекта",
 | 
						||
     *          ),
 | 
						||
     *          @OA\Property(
 | 
						||
     *              property="status",
 | 
						||
     *              type="integer",
 | 
						||
     *              description="статус",
 | 
						||
     *          ),
 | 
						||
     *          @OA\Property(
 | 
						||
     *              property="company_id",
 | 
						||
     *              type="integer",
 | 
						||
     *              description="Компания к которой относится проект",
 | 
						||
     *          ),
 | 
						||
     *       ),
 | 
						||
     *     ),
 | 
						||
     *   ),
 | 
						||
     *   @OA\Response(
 | 
						||
     *     response=200,
 | 
						||
     *     description="Возвращает объект Проекта",
 | 
						||
     *     @OA\MediaType(
 | 
						||
     *         mediaType="application/json",
 | 
						||
     *         @OA\Schema(ref="#/components/schemas/Project"),
 | 
						||
     *     ),
 | 
						||
     *   ),
 | 
						||
     * )
 | 
						||
     *
 | 
						||
     * @throws \Throwable
 | 
						||
     * @throws \yii\base\InvalidConfigException
 | 
						||
     * @throws \yii\db\StaleObjectException
 | 
						||
     * @throws NotFoundHttpException
 | 
						||
     */
 | 
						||
    public function actionUpdate()
 | 
						||
    {
 | 
						||
        $request = Yii::$app->request->getBodyParams();
 | 
						||
        if (!isset($request['project_id']) || $request['project_id'] == null) {
 | 
						||
            throw new BadRequestHttpException(json_encode(['The project ID not found']));
 | 
						||
        }
 | 
						||
        $project = Project::findOne($request['project_id']);
 | 
						||
        if (empty($project)) {
 | 
						||
            throw new NotFoundHttpException('The project not found');
 | 
						||
        }
 | 
						||
 | 
						||
        $put = array_diff($request, [null, '']);
 | 
						||
        $project->load($put, '');
 | 
						||
        if (!$project->update()) {
 | 
						||
            return $project->errors;
 | 
						||
        }
 | 
						||
        return $project;
 | 
						||
    }
 | 
						||
 | 
						||
    /**
 | 
						||
     *
 | 
						||
     * @OA\Get(path="/project/my-employee",
 | 
						||
     *   summary="Список Сотрудников текущего пользователя",
 | 
						||
     *   description="Метод для получения списка сотрудников",
 | 
						||
     *   security={
 | 
						||
     *     {"bearerAuth": {}}
 | 
						||
     *   },
 | 
						||
     *   tags={"TaskManager"},
 | 
						||
     *
 | 
						||
     *   @OA\Response(
 | 
						||
     *     response=200,
 | 
						||
     *     description="Возвращает объект Менеджера",
 | 
						||
     *     @OA\MediaType(
 | 
						||
     *         mediaType="application/json",
 | 
						||
     *         @OA\Schema(ref="#/components/schemas/ManagerEmployee"),
 | 
						||
     *     ),
 | 
						||
     *   ),
 | 
						||
     * )
 | 
						||
     *
 | 
						||
     * @return array|\yii\db\ActiveRecord
 | 
						||
     * @throws BadRequestHttpException
 | 
						||
     */
 | 
						||
    public function actionMyEmployee()
 | 
						||
    {
 | 
						||
        $user_id = \Yii::$app->user->id;
 | 
						||
        if (!$user_id) {
 | 
						||
            throw new BadRequestHttpException(json_encode(['Пользователь не найден']));
 | 
						||
        }
 | 
						||
 | 
						||
        $model = Manager::find()->with(['managerEmployees'])->where(['user_id' => $user_id])->one();
 | 
						||
 | 
						||
        if (!$model) {
 | 
						||
            return [];
 | 
						||
        }
 | 
						||
 | 
						||
        return $model;
 | 
						||
    }
 | 
						||
 | 
						||
    /**
 | 
						||
     *
 | 
						||
     * @OA\Post(path="/project/add-user",
 | 
						||
     *   summary="Добавить пользователя в проект",
 | 
						||
     *   description="Метод для добавления пользователя в проект",
 | 
						||
     *   security={
 | 
						||
     *     {"bearerAuth": {}}
 | 
						||
     *   },
 | 
						||
     *   tags={"TaskManager"},
 | 
						||
     *
 | 
						||
     *   @OA\RequestBody(
 | 
						||
     *     @OA\MediaType(
 | 
						||
     *       mediaType="multipart/form-data",
 | 
						||
     *       @OA\Schema(
 | 
						||
     *          required={"user_id", "project_id"},
 | 
						||
     *          @OA\Property(
 | 
						||
     *              property="user_id",
 | 
						||
     *              type="integer",
 | 
						||
     *              description="Идентификатор пользователя",
 | 
						||
     *          ),
 | 
						||
     *          @OA\Property(
 | 
						||
     *              property="project_id",
 | 
						||
     *              type="integer",
 | 
						||
     *              description="Идентификатор проекта",
 | 
						||
     *          ),
 | 
						||
     *       ),
 | 
						||
     *     ),
 | 
						||
     *   ),
 | 
						||
     *   @OA\Response(
 | 
						||
     *     response=200,
 | 
						||
     *     description="Возвращает объект",
 | 
						||
     *     @OA\MediaType(
 | 
						||
     *         mediaType="application/json",
 | 
						||
     *         @OA\Schema(ref="#/components/schemas/ProjectUsers"),
 | 
						||
     *     ),
 | 
						||
     *   ),
 | 
						||
     * )
 | 
						||
     *
 | 
						||
     * @return array|ProjectUser
 | 
						||
     * @throws NotFoundHttpException
 | 
						||
     */
 | 
						||
    public function actionAddUser()
 | 
						||
    {
 | 
						||
        $request = Yii::$app->request->post();
 | 
						||
        $project = Project::findOne($request['project_id']);
 | 
						||
        if (empty($project)) {
 | 
						||
            throw new NotFoundHttpException('The project not found');
 | 
						||
        }
 | 
						||
 | 
						||
        $model = new ProjectUser();
 | 
						||
        $model->load($request, '');
 | 
						||
        if (isset($model->user->userCard)){
 | 
						||
            $model->card_id = $model->user->userCard->id;
 | 
						||
        }
 | 
						||
 | 
						||
        if (!$model->save()){
 | 
						||
            return $model->errors;
 | 
						||
        }
 | 
						||
 | 
						||
        return $model;
 | 
						||
    }
 | 
						||
 | 
						||
    /**
 | 
						||
     *
 | 
						||
     * @OA\Delete(path="/project/del-user",
 | 
						||
     *   summary="Удаление пользователя из проекта",
 | 
						||
     *   description="Метод для Удаления пользователя из проекта",
 | 
						||
     *   security={
 | 
						||
     *     {"bearerAuth": {}}
 | 
						||
     *   },
 | 
						||
     *   tags={"TaskManager"},
 | 
						||
     *
 | 
						||
     *   @OA\RequestBody(
 | 
						||
     *     @OA\MediaType(
 | 
						||
     *       mediaType="application/x-www-form-urlencoded",
 | 
						||
     *       @OA\Schema(
 | 
						||
     *          required={"project_id", "user_id"},
 | 
						||
     *          @OA\Property(
 | 
						||
     *              property="project_id",
 | 
						||
     *              type="integer",
 | 
						||
     *              description="Идентификатор проекта",
 | 
						||
     *          ),
 | 
						||
     *          @OA\Property(
 | 
						||
     *              property="user_id",
 | 
						||
     *              type="integer",
 | 
						||
     *              description="Идентификатор пользователя",
 | 
						||
     *          ),
 | 
						||
     *       ),
 | 
						||
     *     ),
 | 
						||
     *   ),
 | 
						||
     *   @OA\Response(
 | 
						||
     *     response=200,
 | 
						||
     *     description="Возвращает объект проекта",
 | 
						||
     *     @OA\MediaType(
 | 
						||
     *         mediaType="application/json",
 | 
						||
     *         @OA\Schema(ref="#/components/schemas/Project"),
 | 
						||
     *     ),
 | 
						||
     *   ),
 | 
						||
     * )
 | 
						||
     *
 | 
						||
     * @return Project
 | 
						||
     * @throws \yii\base\InvalidConfigException
 | 
						||
     */
 | 
						||
    public function actionDelUser(): Project
 | 
						||
    {
 | 
						||
        $request = Yii::$app->request->getBodyParams();
 | 
						||
 | 
						||
        ProjectUser::deleteAll(['project_id' => $request['project_id'], 'user_id' => $request['user_id']]);
 | 
						||
        $project = Project::findOne($request['project_id']);
 | 
						||
        if (empty($project)) {
 | 
						||
            throw new NotFoundHttpException('The project not found');
 | 
						||
        }
 | 
						||
 | 
						||
        return $project;
 | 
						||
    }
 | 
						||
} |