From 78aaef28df887a03e0237d4e2e36fb34d4d2d069 Mon Sep 17 00:00:00 2001 From: iIronside Date: Tue, 24 Jan 2023 17:32:46 +0300 Subject: [PATCH] add api for project --- common/models/Project.php | 1 + docs/api/projects_and_tasks.md | 993 ++++++++++++++++++ docs/api/task-user.md | 200 ---- docs/api/task.md | 321 ------ frontend/modules/api/Api.php | 2 - .../api/controllers/ProjectController.php | 96 ++ frontend/modules/api/models/Company.php | 20 + frontend/modules/api/models/Project.php | 44 + 8 files changed, 1154 insertions(+), 523 deletions(-) create mode 100644 docs/api/projects_and_tasks.md delete mode 100644 docs/api/task-user.md delete mode 100644 docs/api/task.md create mode 100644 frontend/modules/api/controllers/ProjectController.php create mode 100644 frontend/modules/api/models/Company.php create mode 100644 frontend/modules/api/models/Project.php diff --git a/common/models/Project.php b/common/models/Project.php index 9ec01d3..f1c499d 100755 --- a/common/models/Project.php +++ b/common/models/Project.php @@ -52,6 +52,7 @@ class Project extends \yii\db\ActiveRecord public function rules() { return [ + ['name', 'unique'], [['name', 'status'], 'required'], [['description'], 'string'], [['created_at', 'updated_at'], 'safe'], diff --git a/docs/api/projects_and_tasks.md b/docs/api/projects_and_tasks.md new file mode 100644 index 0000000..33b1108 --- /dev/null +++ b/docs/api/projects_and_tasks.md @@ -0,0 +1,993 @@ +## Проекты + +## Методы + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Метод + + Описание +
+ project + + Получить проект +
+ project-list + + Получить список проектов +
+ status-list + + Получить список статусов для проекта +
+ create + + Создать проект +
+ update + + Изменить проект +
+ +### Получить проект +`https://guild.craft-group.xyz/api/project/get-project` +

+ Для получения проекта необходимо отправить GET запрос на URL https://guild.craft-group.xyz/api/project/get-project +

+ +

+ Требуемые параметры: +

+ + + + + + + + + +
+ Параметры + + Значение +
+ project_id + + ID проекта +
+ +

+ Пример запроса: +

+ +`https://guild.craft-group.xyz/api/project/get-project?project_id=1` + +

+ Возвращает объект проекта имеющий такой вид: +

+ +```json5 +{ + "id": 1, + "name": "проект название", + "budget": "333", + "status": 5, + "hh_id": { + "id": 1, + "hh_id": null, + "url": "knkjsefnejkdbvjfdbv", + "title": null, + "dt_add": null, + "photo": null + }, + "company": { + "id": 1, + "name": "Рога и копыта", + "description": "Живодёрня" + }, + "_links": { + "self": { + "href": "http://guild.loc/api/project/index?project_id=1" + } + } +} +``` + +### Получить список проектов +`https://guild.craft-group.xyz/api/project/project-list` +

+ Для получения списка проектов необходимо отправить GET запрос на URL https://guild.craft-group.xyz/api/project/project-list +

+ +

+ Параметры: +

+ + + + + + + + + +
+ Параметры + + Значение +
+ card_id + + ID профиля пользователя (При передаче этого параметра будет возвращён список проектов в которых задействован конкретный пользователь, без него будет возвращён список всех проектов) +
+ +

+ Пример запроса: +

+ +`https://guild.craft-group.xyz/api/project/project-list?card_id=1` + +

+ Возвращает массив объектов проект имеющий такой вид: +

+ +```json5 +{ + "projects": [ + { + "id": 1, + "name": "проект название", + "budget": "333", + "status": 5, + "hh_id": { + "id": 1, + "hh_id": null, + "url": "knkjsefnejkdbvjfdbv", + "title": null, + "dt_add": null, + "photo": null + }, + "company": { + "id": 1, + "name": "Рога и копыта", + "description": "Живодёрня" + }, + "_links": { + "self": { + "href": "http://guild.loc/api/project/index?project_id=1" + } + } + }, + { + "id": 3, + "name": "тестовый проект", + "budget": "333", + "status": 5, + "hh_id": { + "id": 1, + "hh_id": null, + "url": "knkjsefnejkdbvjfdbv", + "title": null, + "dt_add": null, + "photo": null + }, + "company": null, + "_links": { + "self": { + "href": "http://guild.loc/api/project/index?project_id=3" + } + } + } + ], + "_links": { + "self": { + "href": "http://guild.loc/api/project/project-list?card_id=1&page=1" + }, + "first": { + "href": "http://guild.loc/api/project/project-list?card_id=1&page=1" + }, + "last": { + "href": "http://guild.loc/api/project/project-list?card_id=1&page=1" + } + }, + "_meta": { + "totalCount": 2, + "pageCount": 1, + "currentPage": 1, + "perPage": 20 + } +} +``` + +### Получить список статусов для проекта +`https://guild.craft-group.xyz/api/project/status-list` +

+ Для получения списка статусов проекта необходимо отправить GET запрос на URL https://guild.craft-group.xyz/api/project/status-list +

+ +

+ Требуемые параметры: не требуются +

+ +

+ Пример запроса: +

+ +`https://guild.craft-group.xyz/api/project/status-list` + +

+ Возвращает массив объектов статус имеющий такой вид: +

+ +```json5 +[ + { + "id": 5, + "name": "проект" + }, + { + "id": 6, + "name": "проект статус 2" + } +] +``` + +### Создать проект + +`https://guild.craft-group.xyz/api/project/create` + +

+ Для создания нового проекта необходимо отправить POST запрос на URL https://guild.craft-group.xyz/api/project/create +

+ +

+ Параметры: +

+* - обязательные параметры + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Параметры + + Значение +
+ * name + + название проекта +
+ * status + + статус проекта +
+ description + + описание проекта +
+ budget + + бюджет проекта +
+ company_id + + ID компании +
+ $hh_id + + ID hh +
+ +

+ Пример запроса: +

+ +`https://guild.craft-group.xyz/api/project/create` + +

+ Возвращает массив объектов статус имеющий такой вид: +

+ +```json5 +{ + "id": 10, + "name": "test", + "budget": "333", + "status": "5", + "hh_id": null, + "company": null, + "_links": { + "self": { + "href": "http://guild.loc/api/project/index?project_id=10" + } + } +} +``` + +### Обновить проект + +`https://guild.craft-group.xyz/api/project/update` + +

+ Для создания нового проекта необходимо отправить POST запрос на URL https://guild.craft-group.xyz/api/project/update +

+ +

+ Параметры: +

+* - обязательные параметры + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Параметры + + Значение +
+ * project_id + + ID проекта +
+ status + + статус проекта +
+ name + + название +
+ description + + описание проекта +
+ budget + + бюджет проекта +
+ company_id + + ID компании +
+ hh_id + + ID hh +
+ +

+ Пример запроса: +

+ +`https://guild.craft-group.xyz/api/project/update` + +

+ Возвращает массив объектов статус имеющий такой вид: +

+ +```json5 +{ + "id": 7, + "name": "777nnknkfg666", + "budget": "333", + "status": "5", + "hh_id": { + "id": 1, + "hh_id": null, + "url": "knkjsefnejkdbvjfdbv", + "title": null, + "dt_add": null, + "photo": null + }, + "company": { + "id": 1, + "name": "Рога и копыта", + "description": "Живодёрня" + }, + "_links": { + "self": { + "href": "http://guild.loc/api/project/index?project_id=7" + } + } +} +``` + +# Задачи + +## Методы + + + + + + + + + + + + + + + + + + + + + +
+ Метод + + Описание +
+ get-task-list + + Возвращает список задач +
+ get-task + + Возвращает задачу +
+ create-task + + Создаёт задачу +
+ update + + Обновить задачу +
+ +## Список задач + +`https://guild.craft-group.xyz/api/task/get-task-list?project_id=1` +

+ Параметры: +

+ + + + + + + + + +
+ Параметры + + Значение +
+ project_id + + Id проекта +
+

+ Без передачи параметра возвращает массив объектов Задача . С параметром project_id, +метод возвращает объекты Задача определённого проекта. +

+ +

+ Возвращает массив объектов Задача.
+ Каждый объект Задача имеет такой вид: +

+ +```json5 +[ + { + "id": "6", + "project_id": "74", + "title": "Название задачи", + "status": "1", + "created_at": "2021-12-20 16:29:39", + "updated_at": "2021-12-20 17:35:04", + "description": "Описание задачи", + "card_id_creator": "1", + "card_id": "3" + }, + '...' +] +``` + +## Получить документ + +`https://guild.craft-group.xyz/api/task/get-task?task_id=15` +

+ Параметры: +

+ + + + + + + + + +
+ Параметры + + Значение +
+ task_id + + Id задачи +
+ +

+ Возвращает объект Задача.
+ Каждый объект Задача имеет такой вид: +

+ +```json5 +{ + "id": 15, + "project_id": 74, + "title": "4324238888", + "status": 1, + "created_at": "2022-01-05 17:37:37", + "updated_at": "2022-01-05 17:46:10", + "description": "888", + "card_id_creator": 1, + "card_id": null +} +``` +

+ Пример ошибки: +

+ +```json5 +{ + "name": "Not Found", + "message": "The task does not exist", + "code": 0, + "status": 404, + "type": "yii\\web\\NotFoundHttpException" +} +``` + +## Создать документ + +`https://guild.craft-group.xyz/api/document/create-document` +

+ Параметры: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Параметры + + Значение +
+ title + + Название задачи +
+ project_id + + Id проекта +
+ status + + статус задачи +
+ card_id_creator + + Id профиля создателя +
+ card_id + + Id профиля наблюдателя(не обязательный параметр) +
+ description + + Описание +
+ +

+ Создаёт Задача. Требует передачи POST запроса с соответствующими +параметрами +

+ +

+ В случае указания не верных параметров буде возвращена соответствующая ошибка. Пример ошибки: +

+ +```json5 +{ + "name": "Internal Server Error", + "message": "{\"project_id\":[\"\П\р\о\е\к\т is invalid.\"]}", + "code": 0, + "status": 500, + "type": "yii\\web\\ServerErrorHttpException" +} +``` + +## Обновить задачу + +`https://guild.craft-group.xyz/api/task/update` +

+ Параметры: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Параметры + + Значение +
+ title + + Название задачи +
+ project_id + + Id проекта +
+ status + + статус задачи +
+ card_id_creator + + Id профиля создателя +
+ card_id + + Id профиля наблюдателя(не обязательный параметр) +
+ description + + Описание +
+ +

+ Обновляет объект Задача. Требует передачи POST запроса с соответствующими +параметрами +

+ +

+ В случае указания не верных параметров буде возвращена соответствующая ошибка. Пример ошибки: +

+ +```json5 +{ + "name": "Not Found", + "message": "The task does not exist", + "code": 0, + "status": 404, + "type": "yii\\web\\NotFoundHttpException" +} +``` + +## Исполнители задачи +## Методы + + + + + + + + + + + + + +
+ Метод + + Описание +
+ get-task-users + + Список исплнителей задачи +
+ set-task-users + + Назначить исполнителя на задачу +
+ +### Список исполнителей задачи +`https://guild.craft-group.xyz/api/task-user/get-task-users` +

+ Для получения списка исполнителей необходимо отправить GET запрос на URL https://guild.craft-group.xyz/api/task-user/get-task-users +

+ +

+ Требуемые параметры: +

+ + + + + + + + + +
+ Параметры + + Значение +
+ task_id + + ID задачи +
+ +

+ Пример запроса: +

+ +`https://guild.craft-group.xyz/api/task-user/get-task-users?task_id=10` + +

+ Возвращает массив сотрудников проекта закреплённых за задачей.
+ Каждый ответ имеет такой вид: +

+ +```json5 +[ + { + "id": 5, + "task_id": 10, + "project_user_id": 1 + }, + { + "id": 7, + "task_id": 10, + "project_user_id": 5 + } +] +``` +

+ Параметры объекта Исполнитель: +

+ + + + + + + + + + + + + + + + + +
+ Параметры + + Значение +
+ id + + ID исполнителя задачи(int) +
+ task_id + + ID задачи(int) +
+ project_user_id + + ID сотрудника на проекте(int) +
+

+ Если задача не найдена будет отправлено следующее сообщение: +

+ +```json5 +{ + "name": "Not Found", + "message": "The task does not exist or there are no employees for it", + "code": 0, + "status": 404, + "type": "yii\\web\\NotFoundHttpException" +} +``` +### Назначить сотрудника на задачу +`https://guild.craft-group.xyz/api/task-user/set-task-users` +

+ Для назначения исполнителя необходимо отправить POST запрос на URL https://guild.craft-group.xyz/api/task-user/set-task-user +

+ +

+ Требуемые параметры: +

+ + + + + + + + + + + + + +
+ Параметры + + Значение +
+ task_id + + ID задачи +
+ project_user_id + + ID сотрудника на проекте +
+ +

+ Пример запроса: +

+ +`https://guild.craft-group.xyz/api/task-user/set-task-user` + +

+ Возвращает объект Исполнителя задачи.
+ Каждый ответ имеет такой вид: +

+ +```json5 +{ + "task_id": "10", + "project_user_id": "5", + "id": 8 +} +``` + +

+ Если задача не найдена будет отправлено следующее сообщение: +

+ +```json5 +{ + "name": "Bad Request", + "message": "{\"task_id\":[\"\З\а\д\а\ч\а is invalid.\"]}", + "code": 0, + "status": 400, + "type": "yii\\web\\BadRequestHttpException" +} +``` \ No newline at end of file diff --git a/docs/api/task-user.md b/docs/api/task-user.md deleted file mode 100644 index a21e905..0000000 --- a/docs/api/task-user.md +++ /dev/null @@ -1,200 +0,0 @@ -## Исполнители задачи -## Методы - - - - - - - - - - - - - -
- Метод - - Описание -
- get-task-users - - Список исплнителей задачи -
- set-task-users - - Назначить исполнителя на задачу -
- -### Список исполнителей задачи -`https://guild.craft-group.xyz/api/task-user/get-task-users` -

- Для получения списка исполнителей необходимо отправить GET запрос на URL https://guild.craft-group.xyz/api/task-user/get-task-users -

- -

- Требуемые параметры: -

- - - - - - - - - -
- Параметры - - Значение -
- task_id - - ID задачи -
- -

- Пример запроса: -

- -`https://guild.craft-group.xyz/api/task-user/get-task-users?task_id=10` - -

- Возвращает массив сотрудников проекта закреплённых за задачей.
- Каждый ответ имеет такой вид: -

- -```json5 -[ - { - "id": 5, - "task_id": 10, - "project_user_id": 1 - }, - { - "id": 7, - "task_id": 10, - "project_user_id": 5 - } -] -``` -

- Параметры объекта Исполнитель: -

- - - - - - - - - - - - - - - - - -
- Параметры - - Значение -
- id - - ID исполнителя задачи(int) -
- task_id - - ID задачи(int) -
- project_user_id - - ID сотрудника на проекте(int) -
-

- Если задача не найдена будет отправлено следующее сообщение: -

- -```json5 -{ - "name": "Not Found", - "message": "The task does not exist or there are no employees for it", - "code": 0, - "status": 404, - "type": "yii\\web\\NotFoundHttpException" -} -``` -### Назначить сотрудника на задачу -`https://guild.craft-group.xyz/api/task-user/set-task-users` -

- Для назначения исполнителя необходимо отправить POST запрос на URL https://guild.craft-group.xyz/api/task-user/set-task-user -

- -

- Требуемые параметры: -

- - - - - - - - - - - - - -
- Параметры - - Значение -
- task_id - - ID задачи -
- project_user_id - - ID сотрудника на проекте -
- -

- Пример запроса: -

- -`https://guild.craft-group.xyz/api/task-user/set-task-user` - -

- Возвращает объект Исполнителя задачи.
- Каждый ответ имеет такой вид: -

- -```json5 -{ - "task_id": "10", - "project_user_id": "5", - "id": 8 -} -``` - -

- Если задача не найдена будет отправлено следующее сообщение: -

- -```json5 -{ - "name": "Bad Request", - "message": "{\"task_id\":[\"\З\а\д\а\ч\а is invalid.\"]}", - "code": 0, - "status": 400, - "type": "yii\\web\\BadRequestHttpException" -} -``` \ No newline at end of file diff --git a/docs/api/task.md b/docs/api/task.md deleted file mode 100644 index 2e84803..0000000 --- a/docs/api/task.md +++ /dev/null @@ -1,321 +0,0 @@ -# Задачи - -## Методы - - - - - - - - - - - - - - - - - - - - - -
- Метод - - Описание -
- get-task-list - - Возвращает список задач -
- get-task - - Возвращает задачу -
- create-task - - Создаёт задачу -
- update - - Обновить задачу -
- -## Список задач - -`https://guild.craft-group.xyz/api/task/get-task-list?project_id=1` -

- Параметры: -

- - - - - - - - - -
- Параметры - - Значение -
- project_id - - Id проекта -
-

- Без передачи параметра возвращает массив объектов Задача . С параметром project_id, -метод возвращает объекты Задача определённого проекта. -

- -

- Возвращает массив объектов Задача.
- Каждый объект Задача имеет такой вид: -

- -```json5 -[ - { - "id": "6", - "project_id": "74", - "title": "Название задачи", - "status": "1", - "created_at": "2021-12-20 16:29:39", - "updated_at": "2021-12-20 17:35:04", - "description": "Описание задачи", - "card_id_creator": "1", - "card_id": "3" - }, - '...' -] -``` - -## Получить документ - -`https://guild.craft-group.xyz/api/task/get-task?task_id=15` -

- Параметры: -

- - - - - - - - - -
- Параметры - - Значение -
- task_id - - Id задачи -
- -

- Возвращает объект Задача.
- Каждый объект Задача имеет такой вид: -

- -```json5 -{ - "id": 15, - "project_id": 74, - "title": "4324238888", - "status": 1, - "created_at": "2022-01-05 17:37:37", - "updated_at": "2022-01-05 17:46:10", - "description": "888", - "card_id_creator": 1, - "card_id": null -} -``` -

- Пример ошибки: -

- -```json5 -{ - "name": "Not Found", - "message": "The task does not exist", - "code": 0, - "status": 404, - "type": "yii\\web\\NotFoundHttpException" -} -``` - -## Создать документ - -`https://guild.craft-group.xyz/api/document/create-document` -

- Параметры: -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Параметры - - Значение -
- title - - Название задачи -
- project_id - - Id проекта -
- status - - статус задачи -
- card_id_creator - - Id профиля создателя -
- card_id - - Id профиля наблюдателя(не обязательный параметр) -
- description - - Описание -
- -

- Создаёт Задача. Требует передачи POST запроса с соответствующими -параметрами -

- -

- В случае указания не верных параметров буде возвращена соответствующая ошибка. Пример ошибки: -

- -```json5 -{ - "name": "Internal Server Error", - "message": "{\"project_id\":[\"\П\р\о\е\к\т is invalid.\"]}", - "code": 0, - "status": 500, - "type": "yii\\web\\ServerErrorHttpException" -} -``` - -## Обновить задачу - -`https://guild.craft-group.xyz/api/task/update` -

- Параметры: -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Параметры - - Значение -
- title - - Название задачи -
- project_id - - Id проекта -
- status - - статус задачи -
- card_id_creator - - Id профиля создателя -
- card_id - - Id профиля наблюдателя(не обязательный параметр) -
- description - - Описание -
- -

- Обновляет объект Задача. Требует передачи POST запроса с соответствующими -параметрами -

- -

- В случае указания не верных параметров буде возвращена соответствующая ошибка. Пример ошибки: -

- -```json5 -{ - "name": "Not Found", - "message": "The task does not exist", - "code": 0, - "status": 404, - "type": "yii\\web\\NotFoundHttpException" -} -``` \ No newline at end of file diff --git a/frontend/modules/api/Api.php b/frontend/modules/api/Api.php index df9e98a..a39e878 100755 --- a/frontend/modules/api/Api.php +++ b/frontend/modules/api/Api.php @@ -18,7 +18,5 @@ class Api extends \yii\base\Module public function init() { parent::init(); - - // custom initialization code goes here } } diff --git a/frontend/modules/api/controllers/ProjectController.php b/frontend/modules/api/controllers/ProjectController.php new file mode 100644 index 0000000..f0fb178 --- /dev/null +++ b/frontend/modules/api/controllers/ProjectController.php @@ -0,0 +1,96 @@ + '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'], + 'create' => ['POST', 'OPTIONS'], + 'update' => ['POST', 'OPTIONS'] + ], + ] + ]); + } + + public function actionGetProject($project_id): ?Project + { + return Project::findOne($project_id); + } + + public function actionProjectList($card_id = null): ActiveDataProvider + { + if (!empty($card_id)) { + $projectIdList = ProjectUser::find()->where(['card_id' => $card_id])->select('project_id')->column(); + $query = Project::find()->where([ 'IN', 'id', $projectIdList]); + } 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 actionCreate() + { + $project = new Project(); + $project->attributes = \yii::$app->request->post(); + + if($project->validate()) { + $project->save(false); + return $project; + } + return $project->errors; + } + + /** + * @throws \Throwable + * @throws \yii\base\InvalidConfigException + * @throws \yii\db\StaleObjectException + * @throws NotFoundHttpException + */ + public function actionUpdate() + { + $project = Project::findOne(Yii::$app->request->post('project_id')); + if(empty($project)) { + throw new NotFoundHttpException('The project not found'); + } + + $project->load(Yii::$app->request->getBodyParams(), ''); + if (!$project->update()) { + return $project->errors; + } + return $project; + } +} \ No newline at end of file diff --git a/frontend/modules/api/models/Company.php b/frontend/modules/api/models/Company.php new file mode 100644 index 0000000..c844201 --- /dev/null +++ b/frontend/modules/api/models/Company.php @@ -0,0 +1,20 @@ + function() { + return $this->hh; + }, + 'company' => function() { + return $this->company; + } + ]; + } + + public function extraFields(): array + { + return []; + } + + public function getLinks(): array + { + return [ + Link::REL_SELF => Url::to(['index', 'project_id' => $this->id], true), + ]; + } + + public function getCompany(): ActiveQuery + { + return $this->hasOne(Company::className(), ['id' => 'company_id']); + } +}