Merge pull request #94 from apuc/refactoring_api/ProfileController

Refactoring api/profile controller
This commit is contained in:
kavalar 2022-03-22 13:15:42 +03:00 committed by GitHub
commit c4f6ce195e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
17 changed files with 2158 additions and 399 deletions

View File

@ -0,0 +1,27 @@
<?php
namespace common\services;
use common\models\InterviewRequest;
use Yii;
class InterviewRequestService
{
public static function createInterviewRequest($interviewRequestParams)
{
$interviewRequest = new InterviewRequest();
$attributes = $interviewRequestParams;
$interviewRequest->attributes = $attributes;
$interviewRequest->created_at = time();
$interviewRequest->user_id = \Yii::$app->user->id;
if ($interviewRequest->save()) {
\Yii::$app->telegram_bot->sendRenderedMessage('interview_request', $attributes);
}
return $interviewRequest;
}
}

View File

@ -4,59 +4,120 @@ namespace common\services;
use common\models\Manager; use common\models\Manager;
use common\models\ManagerEmployee; use common\models\ManagerEmployee;
use common\models\UserCard;
use frontend\modules\api\models\ProfileSearchForm;
use Yii;
use yii\web\BadRequestHttpException;
use yii\web\ServerErrorHttpException;
class ProfileService class ProfileService
{ {
private $searcherID; /**
private $id; * @throws ServerErrorHttpException
*/
public function __construct($searcherID, $id) public static function getMainData($user_id): array
{ {
$this->searcherID = $searcherID; $userCard = UserCard::findOne(['id_user' => $user_id]);
$this->id = $id; if (empty($userCard)) {
throw new ServerErrorHttpException(json_encode($userCard->errors));
}
return array('fio' => $userCard->fio,
'photo' => $userCard->photo,
'gender' => $userCard->gender,
'level' => $userCard->level,
'years_of_exp' => $userCard->years_of_exp,
'specification' => $userCard->specification,
'position_name' => $userCard->position->name);
} }
public function checkReportePermission() /**
* @throws BadRequestHttpException
*/
public static function getProfile($id, $request)//: ?array
{ {
if ($this->isMyProfile() or $this->isMyEmployee()) { $searchModel = new ProfileSearchForm();
$searchModel->attributes = $request;
if ($id) {
return $searchModel->byId();
}
return $searchModel->byParams();
}
/**
* @throws BadRequestHttpException
*/
public static function getProfileWithReportPermission($user_card_id): ?array
{
if (UserCard::find()->where(['id' => $user_card_id])->exists()) {
$searchModel = new ProfileSearchForm();
$searchModel->id = $user_card_id;
$profile = $searchModel->byId();
self::addPermission($profile, $user_card_id);
return $profile;
}
throw new BadRequestHttpException(json_encode('There is no user with this id'));
}
private static function addPermission(&$profile, $user_card_id)
{
$searcherCardID = self::getSearcherCardID(Yii::$app->user->getId());
if (self::checkReportPermission($user_card_id, $searcherCardID)) {
$profile += ['report_permission' => '1'];
} else {
$profile += ['report_permission' => '0'];
}
}
private static function getSearcherCardID($user_id): int
{
return UserCard::findOne(['id_user' => $user_id])->id;
}
private static function checkReportPermission($user_card_id, $searcherCardID): bool
{
if (self::isMyProfile($user_card_id, $searcherCardID)
or self::isMyEmployee($user_card_id, $searcherCardID)) {
return true; return true;
} }
return false; return false;
} }
private function isMyProfile() private static function isMyProfile($user_card_id, $searcherCardID): bool
{ {
if ($this->id == $this->searcherID) { if ($user_card_id == $searcherCardID) {
return true; return true;
} }
return false; return false;
} }
private function isMyEmployee() private static function isMyEmployee($user_card_id, $searcherCardID): bool
{ {
if (!$this->amIManager()) { if (!self::amIManager($searcherCardID)) {
return false; return false;
} }
if ($this->isMyEmploee()) { if (self::isMyEmployer($user_card_id, $searcherCardID)) {
return true;
}
return false;
}
private function amIManager()
{
if (Manager::find()->where(['user_card_id' => $this->searcherID])->exists()) {
return true; return true;
} }
return false; return false;
} }
private function isMyEmploee() private static function amIManager($searcherCardID): bool
{ {
$manager = Manager::find()->where(['user_card_id' => $this->searcherID])->one(); if (Manager::find()->where(['user_card_id' => $searcherCardID])->exists()) {
return true;
}
return false;
}
private static function isMyEmployer($user_card_id, $searcherCardID): bool
{
$manager = Manager::find()->where(['user_card_id' => $searcherCardID])->one();
$exist = ManagerEmployee::find() $exist = ManagerEmployee::find()
->where(['manager_id' => $manager->id, 'user_card_id' => $this->id]) ->where(['manager_id' => $manager->id, 'user_card_id' => $user_card_id])
->exists(); ->exists();
if ($exist) { if ($exist) {
@ -64,7 +125,4 @@ class ProfileService
} }
return false; return false;
} }
} }

View File

@ -1,27 +0,0 @@
<?php
namespace common\services;
use common\models\UserCard;
use yii\web\ServerErrorHttpException;
class UserCardService
{
/**
* @throws ServerErrorHttpException
*/
public static function getUserCard($user_id): array
{
$userCard = UserCard::findOne(['id_user' => $user_id]);
if (empty($userCard)) {
throw new ServerErrorHttpException(json_encode($userCard->errors));
}
return array('fio' => $userCard->fio,
'photo' => $userCard->photo,
'gender' => $userCard->gender,
'level' => $userCard->level,
'years_of_exp' => $userCard->years_of_exp,
'specification' => $userCard->specification,
'position_name' => $userCard->position->name);
}
}

54
docs/api/interview.md Normal file
View File

@ -0,0 +1,54 @@
## Интервью
### Пригласить на собеседование
`https://guild.craft-group.xyz/api/interview-request/create-interview-request`
<p>
Для того, отправить приглашение профилю на собеседование, необходимо сделать
<b>POST</b> запрос на URL https://guild.craft-group.xyz/api/interview-request/create-interview-request
</p>
<p>
Возможные параметры:
</p>
<table>
<tr>
<th>
Параметры
</th>
<th>
Значение
</th>
</tr>
<tr>
<td>
email*
</td>
<td>
Почта пользователя, который хочет пригласить на собеседование.
</td>
</tr>
<tr>
<td>
profile_id*
</td>
<td>
Идентификатор профиля.
</td>
</tr>
<tr>
<td>
phone
</td>
<td>
Телефон.
</td>
</tr>
<tr>
<td>
comment
</td>
<td>
Дополнительные пожелания по собеседованию.
</td>
</tr>
</table>

View File

@ -7,191 +7,6 @@
Чтобы получить популярные навыки нужно сделать <b>GET</b> запрос на URL https://guild.craft-group.xyz/api/skills/skills-on-main-page Чтобы получить популярные навыки нужно сделать <b>GET</b> запрос на URL https://guild.craft-group.xyz/api/skills/skills-on-main-page
</p> </p>
## Профиль
### Список
`https://guild.craft-group.xyz/api/profile`
<p>
Для получения списка профилей необходимо отправить <b>GET</b> запрос на URL https://guild.craft-group.xyz/api/profile
</p>
<p>
Возможные параметры:
</p>
<table>
<tr>
<th>
Параметры
</th>
<th>
Значение
</th>
</tr>
<tr>
<td>
get-document-list
</td>
<td>
Количество профилей, которое вернет сервер при запросе.
</td>
</tr>
<tr>
<td>
offset
</td>
<td>
Количество записей на которое нужно отступить в списке профилей.
</td>
</tr>
<tr>
<td>
skills
</td>
<td>
Идентификаторы навыков по которым нужно отфильтровать профили.
</td>
</tr>
</table>
<p>
Пример запроса:
</p>
`https://guild.craft-group.xyz/api/profile?limit=5&offset=5&skills=1,2`
<p>
Возвращает <b>массив</b> объектов <b>Профилей</b>. <br>
Каждый объект <b>Профиля</b> имеет такой вид:
</p>
```json5
{
"id": "1",
"fio": "f23f",
"passport": "f23",
"photo": "''",
"email": "f",
"gender": "1",
"dob": "2021-09-17",
"status": "2",
"created_at": "2021-09-08 16:30:34",
"updated_at": "2021-09-09 08:41:02",
"resume": "",
"salary": "",
"position_id": "1",
"deleted_at": null,
"id_user": "1",
"city": "",
"link_vk": "",
"link_telegram": "",
"vc_text": "",
"level": "2", //
"vc_text_short": "",
"years_of_exp": "0",
"specification": "",
"skillValues": [ //Массив навыков привязанных к этому профилю
{
"id": "1",
"card_id": "1", //card_id из таблицы card_skill
"skill_id": "1",//skill_id из таблицы card_skill
"skill": {
"id": "1", //id из таблицы skill
"name": "SQL",
"category_id": "1"
}
},
//...
],
"achievements": [ //Массив достижений привязанных к этому профилю
{
"id": "7",
"user_card_id": "1",//user_card_id из таблицы achievement_user_card
"achievement_id": "1",//achievement_id из таблицы achievement_user_card
"achievement": {
"id": "1", //id из таблицы achievement
"slug": "newguy",
"title": "Новичок",
"img": "",
"description": "Ты начал у нас работу",
"status": "1" // 1 - Активно, 2 - Неактивно
}
},
//...
]
}
```
### Одна запись
`https://guild.craft-group.xyz/api/profile/{id}`
<p>
Для того, чтобы получить данные одной записи необходимо отправить <b>GET</b> запрос
на URL https://guild.craft-group.xyz/api/profile/{id} , где <b>id</b> это идентификатор
профиля.
</p>
<p>
Пример запроса:
</p>
`https://guild.craft-group.xyz/api/profile/6`
<p>
Возвращает объект <b>Профиля</b>. <br>
Как выглядит можно посмотреть выше.
</p>
### Пригласить на собеседование
`https://guild.craft-group.xyz/api/profile/add-to-interview`
<p>
Для того, отправить приглашение профилю на собеседование, необходимо сделать
<b>POST</b> запрос на URL https://guild.craft-group.xyz/api/profile/add-to-interview
</p>
<p>
Возможные параметры:
</p>
<table>
<tr>
<th>
Параметры
</th>
<th>
Значение
</th>
</tr>
<tr>
<td>
email*
</td>
<td>
Почта пользователя, который хочет пригласить на собеседование.
</td>
</tr>
<tr>
<td>
profile_id*
</td>
<td>
Идентификатор профиля.
</td>
</tr>
<tr>
<td>
phone
</td>
<td>
Телефон.
</td>
</tr>
<tr>
<td>
comment
</td>
<td>
Дополнительные пожелания по собеседованию.
</td>
</tr>
</table>
## Отчет ## Отчет
### Список ### Список
`https://guild.craft-group.xyz/api/reports` `https://guild.craft-group.xyz/api/reports`
@ -2406,7 +2221,7 @@
} }
``` ```
### Назначить сотрудника на задачу ### Назначить сотрудника на задачу
`https://guild.craft-group.xyz/api/task-user/get-task-users` `https://guild.craft-group.xyz/api/task-user/set-task-users`
<p> <p>
Для назначения исполнителя необходимо отправить <b>POST</b> запрос на URL https://guild.craft-group.xyz/api/task-user/set-task-user Для назначения исполнителя необходимо отправить <b>POST</b> запрос на URL https://guild.craft-group.xyz/api/task-user/set-task-user
</p> </p>

308
docs/api/profile.md Normal file
View File

@ -0,0 +1,308 @@
# Профиль
## Методы
<table>
<tr>
<th>
Метод
</th>
<th>
Описание
</th>
</tr>
<tr>
<td>
api/profile
</td>
<td>
Возвращает список профилей
</td>
</tr>
<tr>
<td>
api/profile/{id}
</td>
<td>
Возвращает один профиль
</td>
</tr>
<tr>
<td>
profile/profile-with-report-permission
</td>
<td>
Получить профиль с флагом прав на просмотр отчётов этого пользователя
</td>
</tr>
<tr>
<td>
profile/get-main-data
</td>
<td>
Получить получить основные данные профиля
</td>
</tr>
</table>
### Список
`https://guild.craft-group.xyz/api/profile`
<p>
Для получения списка профилей необходимо отправить <b>GET</b> запрос на URL https://guild.craft-group.xyz/api/profile
</p>
<p>
Возможные параметры:
</p>
<table>
<tr>
<th>
Параметры
</th>
<th>
Значение
</th>
</tr>
<tr>
<td>
get-document-list
</td>
<td>
Количество профилей, которое вернет сервер при запросе.
</td>
</tr>
<tr>
<td>
offset
</td>
<td>
Количество записей на которое нужно отступить в списке профилей.
</td>
</tr>
<tr>
<td>
skills
</td>
<td>
Идентификаторы навыков по которым нужно отфильтровать профили.
</td>
</tr>
</table>
<p>
Пример запроса:
</p>
`https://guild.craft-group.xyz/api/profile?limit=5&offset=5&skills=1,2`
<p>
Возвращает <b>массив</b> объектов <b>Профилей</b>. <br>
Каждый объект <b>Профиля</b> имеет такой вид:
</p>
```json5
{
"id": "1",
"fio": "f23f",
"passport": "f23",
"photo": "''",
"email": "f",
"gender": "1",
"dob": "2021-09-17",
"status": "2",
"created_at": "2021-09-08 16:30:34",
"updated_at": "2021-09-09 08:41:02",
"resume": "",
"salary": "",
"position_id": "1",
"deleted_at": null,
"id_user": "1",
"city": "",
"link_vk": "",
"link_telegram": "",
"vc_text": "",
"level": "2", //
"vc_text_short": "",
"years_of_exp": "0",
"specification": "",
"skillValues": [ //Массив навыков привязанных к этому профилю
{
"id": "1",
"card_id": "1", //card_id из таблицы card_skill
"skill_id": "1",//skill_id из таблицы card_skill
"skill": {
"id": "1", //id из таблицы skill
"name": "SQL",
"category_id": "1"
}
},
//...
],
"achievements": [ //Массив достижений привязанных к этому профилю
{
"id": "7",
"user_card_id": "1",//user_card_id из таблицы achievement_user_card
"achievement_id": "1",//achievement_id из таблицы achievement_user_card
"achievement": {
"id": "1", //id из таблицы achievement
"slug": "newguy",
"title": "Новичок",
"img": "",
"description": "Ты начал у нас работу",
"status": "1" // 1 - Активно, 2 - Неактивно
}
},
//...
]
}
```
### Одна запись
`https://guild.craft-group.xyz/api/profile/{id}`
<p>
Для того, чтобы получить данные одной записи необходимо отправить <b>GET</b> запрос
на URL https://guild.craft-group.xyz/api/profile/{id} , где <b>id</b> это идентификатор
профиля.
</p>
<p>
Пример запроса:
</p>
`https://guild.craft-group.xyz/api/profile/6`
<p>
Возвращает объект <b>Профиля</b>. <br>
Как выглядит можно посмотреть выше.
</p>
### Получить профиль с флагом прав на просмотр отчётов этого пользователя
`https://guild.craft-group.xyz/api/profile/profile-with-report-permission`
<p>
Для получения профиля пользователя с флагом прав на просмотр отчётов этого пользователя, необходимо сделать
<b>GET</b> запрос на URL https://guild.craft-group.xyz/api/profile/add-to-interview
</p>
<p>
Возможные параметры:
</p>
<table>
<tr>
<th>
Параметры
</th>
<th>
Значение
</th>
</tr>
<tr>
<td>
id
</td>
<td>
ID профиля пользователя
</td>
</tr>
</table>
## Основные данные пользователя
`https://guild.craft-group.xyz/api/profile/get-main-data?user_id=1`
<p>
Требуемые параметры:
</p>
<table>
<tr>
<th>
Параметры
</th>
<th>
Значение
</th>
</tr>
<tr>
<td>
user_id
</td>
<td>
Id профиля пользователя
</td>
</tr>
</table>
<p>
Возвращает объект <b>Пользователь</b>. <br>
Каждый объект <b>Пользователь</b> имеет такой вид:
</p>
```json5
{
"fio": "Тест менеджер для апи запроса",
"photo": null,
"gender": 1,
"level": 2,
"years_of_exp": null,
"specification": null,
"position_name": "Должность 1"
}
```
<p>
Возвращаемые параметры:
</p>
<table>
<tr>
<th>
Параметры
</th>
<th>
Значение
</th>
</tr>
<tr>
<td>
fio
</td>
<td>
ФИО
</td>
</tr>
<tr>
<td>
photo
</td>
<td>
Ссылка на фото
</td>
</tr>
<tr>
<td>
gender
</td>
<td>
Пол
</td>
</tr>
<tr>
<td>
level
</td>
<td>
Уровень
</td>
</tr>
<tr>
<td>
years_of_exp
</td>
<td>
Лет опыта
</td>
</tr>
<tr>
<td>
position_name
</td>
<td>
Должность
</td>
</tr>
</table>

975
docs/api/questionnaire.md Normal file
View File

@ -0,0 +1,975 @@
## Анкеты
## Методы
<table>
<tr>
<th>
Метод
</th>
<th>
Описание
</th>
</tr>
<tr>
<td>
questionnaire/questionnaires-list
</td>
<td>
Возвращает список анкет
</td>
</tr>
<tr>
<td>
questionnaire/questionnaire-completed
</td>
<td>
Завершение прохождение анкеты, проверка ответов
</td>
</tr>
<tr>
<td>
questionnaire/get-points-number
</td>
<td>
Число балов в анкете
</td>
</tr>
<tr>
<td>
questionnaire/get-question-number
</td>
<td>
Число вопросов в анкете
</td>
</tr>
<tr>
<td>
question/get-questions
</td>
<td>
Вопросы анкеты
</td>
</tr>
<tr>
<td>
answer/get-answers
</td>
<td>
Список возможных ответов на вопрос
</td>
</tr>
<tr>
<td>
user-response/set-response
</td>
<td>
Сохранить ответ пользователя
</td>
</tr>
<tr>
<td>
user-response/set-responses
</td>
<td>
Сохранить массив ответов пользователя
</td>
</tr>
<tr>
<td>
get
</td>
<td>
Возвращает менеджера
</td>
</tr>
</table>
### Список анкет
`https://guild.craft-group.xyz/api/user-questionnaire/questionnaires-list`
<p>
Для получения списка анкет необходимо отправить <b>GET</b> запрос на URL https://guild.craft-group.xyz/api/user-questionnaire/questionnaires-list
</p>
<p>
Требуемые параметры запроса:
</p>
<table>
<tr>
<th>
Параметры
</th>
<th>
Значение
</th>
</tr>
<tr>
<td>
user_id
</td>
<td>
ID пользователя(int)
</td>
</tr>
</table>
<p>
Пример запроса:
</p>
`https://guild.craft-group.xyz/api/user-questionnaire/questionnaires-list?user_id=1`
<p>
Возвращает <b>массив</b> объектов записи <b>Назначенная анкета</b>. <br>
Каждый объектимеет такой вид:
</p>
```json5
{
"user_id": 1,
"uuid": "d222f858-60fd-47fb-8731-dc9d5fc384c5",
"score": 11,
"status": 2,
"percent_correct_answers": 0.25,
"testing_date": "2022-03-17 11:14:22",
"questionnaire_title": "Кат1 Анкета 1 активна"
}
```
<p>
Возвращаемые параметры объекта анкета:
</p>
<table>
<tr>
<th>
Параметры
</th>
<th>
Значение
</th>
</tr>
<tr>
<td>
user_id
</td>
<td>
ID пользователя(int)
</td>
</tr>
<tr>
<td>
uuid
</td>
<td>
uuid анкеты пользователя
</td>
</tr>
<tr>
<td>
score
</td>
<td>
Полученные балы(int)
</td>
</tr>
<tr>
<td>
status
</td>
<td>
Статус: 0 - не активен; 1 - активен; 2 - завершён; 3 - на проверке;
</td>
</tr>
<tr>
<td>
percent_correct_answers
</td>
<td>
Процент правильных ответов(float)
</td>
</tr>
<tr>
<td>
testing_date
</td>
<td>
Дата тестирования
</td>
</tr><tr>
<td>
questionnaire_title
</td>
<td>
Название анкеты
</td>
</tr>
</table>
<p>
Передаваемые параметры объекта вопроса:
</p>
<table>
<tr>
<th>
Параметры
</th>
<th>
Значение
</th>
</tr>
<tr>
<td>
user_id
</td>
<td>
ID пользователя(int)
</td>
</tr>
<tr>
<td>
score
</td>
<td>
Полученные балы(int)
</td>
</tr>
<tr>
<td>
percent_correct_answers
</td>
<td>
Процент правильных ответов(float)
</td>
</tr>
</table>
<p>
Если пользователь не найден или у пользователя нет активных анкет будет отправлено следующее сообщение:
</p>
```json5
{
"name": "Not Found",
"message": "Active questionnaire not found",
"code": 0,
"status": 404,
"type": "yii\\web\\NotFoundHttpException"
}
```
### Проверить ответы в анкете
`https://guild.craft-group.xyz/api/user-questionnaire/questionnaire-completed`
<p>
Для выполнения проверки анкеты необходимо отправить <b>GET</b> запрос на URL https://guild.craft-group.xyz/api/user-questionnaire/questionnaire-completed
</p>
<p>
Требуемые параметры запроса:
</p>
<table>
<tr>
<th>
Параметры
</th>
<th>
Значение
</th>
</tr>
<tr>
<td>
user_questionnaire_uuid
</td>
<td>
UUID анкеты назначеной пользователю
</td>
</tr>
</table>
<p>
Пример запроса:
</p>
`https://guild.craft-group.xyz/api/user-questionnaire/questionnaire-completed?user_questionnaire_uuid=d222f858-60fd-47fb-8731-dc9d5fc384c5`
<p>
Возвращает <b>массив</b> объектов <b>Вопросов</b>. <br>
Каждый объект <b>Вопрос</b> имеет такой вид:
</p>
```json5
{
"id": 1,
"questionnaire_id": 1,
"user_id": 1,
"uuid": "d222f858-60fd-47fb-8731-dc9d5fc384c5",
"created_at": "2021-10-20 13:06:12",
"updated_at": {
"expression": "NOW()",
"params": []
},
"score": 4,
"status": 1,
"percent_correct_answers": 0.5,
"testing_date": null
}
```
### Число балов в анкете
`https://guild.craft-group.xyz/api/user-questionnaire/get-points-number?user_questionnaire_uuid=d222f858-60fd-47fb-8731-dc9d5fc384c5`
<p>
Для максимального числа балов в анкеты необходимо отправить <b>GET</b> запрос на URL https://guild.craft-group.xyz/api/user-questionnaire/get-points-number
</p>
<p>
Требуемые параметры запроса:
</p>
<table>
<tr>
<th>
Параметры
</th>
<th>
Значение
</th>
</tr>
<tr>
<td>
user_questionnaire_uuid
</td>
<td>
UUID анкеты назначеной пользователю
</td>
</tr>
</table>
<p>
Пример запроса:
</p>
`https://guild.craft-group.xyz/api/user-questionnaire/get-points-number?user_questionnaire_uuid=d222f858-60fd-47fb-8731-dc9d5fc384c5`
<p>
Возвращает максимально возможное число балов за анкету b>. <br>
Объект <b>Ответа</b> имеет такой вид:
</p>
```json5
{
"sum_point": "61"
}
```
### Число вопросов в анкете
`https://guild.craft-group.xyz/api/user-questionnaire/get-question-number?user_questionnaire_uuid=d222f858-60fd-47fb-8731-dc9d5fc384c5`
<p>
Для числа вопросов в анкете необходимо отправить <b>GET</b> запрос на URL https://guild.craft-group.xyz/api/user-questionnaire/get-question-number
</p>
<p>
Требуемые параметры запроса:
</p>
<table>
<tr>
<th>
Параметры
</th>
<th>
Значение
</th>
</tr>
<tr>
<td>
user_questionnaire_uuid
</td>
<td>
UUID анкеты назначеной пользователю
</td>
</tr>
</table>
<p>
Пример запроса:
</p>
`https://guild.craft-group.xyz/api/user-questionnaire/get-question-number?user_questionnaire_uuid=d222f858-60fd-47fb-8731-dc9d5fc384c5`
<p>
Возвращает число вопросов в анкете b>. <br>
Объект <b>Ответа</b> имеет такой вид:
</p>
```json5
{
"question_number": "7"
}
```
### Вопросы анкеты
`https://guild.craft-group.xyz/api/question/get-questions`
<p>
Для получения вопросов анкеты необходимо отправить <b>GET</b> запрос на URL https://guild.craft-group.xyz/api/question/get-questions
</p>
<p>
Требуемые параметры запроса:
</p>
<table>
<tr>
<th>
Параметры
</th>
<th>
Значение
</th>
</tr>
<tr>
<td>
uuid
</td>
<td>
UUID анкеты назначеной пользователю
</td>
</tr>
</table>
<p>
Пример запроса:
</p>
`https://guild.craft-group.xyz/api/question/get-questions?uuid=d222f858-60fd-47fb-8731-dc9d5fc384c5`
<p>
Возвращает <b>массив</b> объектов <b>Вопросов</b>. <br>
Каждый объект <b>Вопрос</b> имеет такой вид:
</p>
```json5
{
"id": "4",
"question_type_id": "2",
"question_body": "Один ответ1",
"question_priority": null,
"next_question": null,
"time_limit": "00:22:00"
}
```
<p>
Передаваемые параметры объекта вопроса:
</p>
<table>
<tr>
<th>
Параметры
</th>
<th>
Значение
</th>
</tr>
<tr>
<td>
id
</td>
<td>
ID вопроса(int)
</td>
</tr>
<tr>
<td>
question_type_id
</td>
<td>
ID типа вопроса(int)
</td>
</tr>
<tr>
<td>
question_body
</td>
<td>
Вопрос(string)
</td>
</tr>
<tr>
<td>
question_priority
</td>
<td>
Приоритет вопроса(int)(не используется)
</td>
</tr>
<tr>
<td>
next_question
</td>
<td>
Следующий вопрос(int)(не используется)
</td>
</tr>
<tr>
<td>
time_limit
</td>
<td>
Ограничение времени на ответ(time)
</td>
</tr>
</table>
<p>
Если вопрос не найден или не предпологает передачу ответов будет отправлено следующее сообщение:
</p>
```json5
{
"name": "Not Found",
"message": "Questions not found",
"code": 0,
"status": 404,
"type": "yii\\web\\NotFoundHttpException"
}
```
### Ответы на вопрос
`https://guild.craft-group.xyz/api/answer/get-answers`
<p>
Для получения вариантов ответов на вопрос анкеты нужно сделать <b>GET</b> запрос на URL https://guild.craft-group.xyz/api/answer/get-answers
</p>
<p>
Требуемые параметры:
</p>
<table>
<tr>
<th>
Параметры
</th>
<th>
Значение
</th>
</tr>
<tr>
<td>
question_id
</td>
<td>
ID вопроса
</td>
</tr>
</table>
<p>
Пример запроса:
</p>
`https://guild.craft-group.xyz/api/answer/get-answers?question_id=7`
<p>
Возвращает <b>массив</b> объектов <b>Ответов</b>. <br>
Каждый объект <b>Ответа</b> имеет такой вид:
</p>
```json5
[
{
"id": "12",
"question_id": "7",
"answer_body": "Неск вар1 отв1 истина"
},
]
```
<p>
Передаваемые параметры объекта вопроса:
</p>
<table>
<tr>
<th>
Параметры
</th>
<th>
Значение
</th>
</tr>
<tr>
<td>
id
</td>
<td>
ID вопроса(int)
</td>
</tr>
<tr>
<td>
question_id
</td>
<td>
ID вопроса(int)
</td>
</tr>
<tr>
<td>
answer_body
</td>
<td>
Ответ(string)
</td>
</tr>
</table>
<p>
Если ответы не найдены или вопрос не предпологает их наличие(открытый вопрос) будет отправлено следующее сообщение:
</p>
```json5
{
"name": "Not Found",
"message": "Answer not found or question inactive",
"code": 0,
"status": 404,
"type": "yii\\web\\NotFoundHttpException"
}
```
### Один ответ пользователя
`https://guild.craft-group.xyz/api/user-response/set-response`
<p>
Для добавления ответа на вопрос от пользователя необходимо сделать <b>POST</b> запрос на URL https://guild.craft-group.xyz/api/user-response/set-response
</p>
<p>
Тело запроса содержит:
</p>
<table>
<tr>
<th>
Параметры
</th>
<th>
Значение
</th>
</tr>
<tr>
<td>
user_id
</td>
<td>
ID пользователя
</td>
</tr>
<tr>
<td>
question_id
</td>
<td>
ID вопроса(int)
</td>
</tr>
<tr>
<td>
response_body
</td>
<td>
Ответ пользователя(string 255)
</td>
</tr>
<tr>
<td>
user_questionnaire_uuid
</td>
<td>
UUID анкеты назначенной пользователю(string 36)
</td>
</tr>
</table>
<p>
Пример тела запроса:
</p>
```json5
{
"user_id": "1",
"question_id": "7",
"response_body": "oooooooooooo111111111",
"user_questionnaire_uuid": "d222f858-60fd-47fb-8731-dc9d5fc384c5"
}
```
`https://guild.craft-group.xyz/api/user-response/set-response`
<p>
Возвращает объект <b>Ответа</b>. <br>
Объект <b>Ответа</b> имеет такой вид:
</p>
```json5
{
"user_id": "1",
"question_id": "7",
"response_body": "oooooooooooo111111111",
"user_questionnaire_uuid": "d222f858-60fd-47fb-8731-dc9d5fc384c5",
"created_at": {
"expression": "NOW()",
"params": []
},
"updated_at": {
"expression": "NOW()",
"params": []
},
"id": 191,
"answer_flag": 0
}
```
<p>
Ответ содержит:
</p>
<table>
<tr>
<th>
Параметры
</th>
<th>
Значение
</th>
</tr>
<tr>
<td>
user_id
</td>
<td>
ID пользователя
</td>
</tr>
<tr>
<td>
question_id
</td>
<td>
ID вопроса(int)
</td>
</tr>
<tr>
<td>
response_body
</td>
<td>
Ответ пользователя(string 255)
</td>
</tr>
<tr>
<td>
user_questionnaire_uuid
</td>
<td>
UUID анкеты назначенной пользователю(string 36)
</td>
</tr>
<tr>
<td>
answer_flag
</td>
<td>
Флаг ответа(1 - верно, 0 - ложно). Если отправлен ответ на открытый вопрос, флаг ответа не будет возвращаться до момента проверки в админ панели.
</td>
</tr>
</table>
<p>
В случаии ошибки в запросе будет отправлено сообщение следующего вида:
</p>
```json5
{
"name": "Bad Request",
"message": "{\"question_id\":[\"\В\о\п\р\о\с is invalid.\"]}",
"code": 0,
"status": 400,
"type": "yii\\web\\BadRequestHttpException"
}
```
### Массив ответов пользователя
`https://guild.craft-group.xyz/api/user-response/set-responses`
<p>
Для добавления массива ответов на вопросы от пользователя необходимо сделать <b>POST</b> запрос на URL https://guild.craft-group.xyz/api/user-response/set-responses
</p>
<p>
Тело запроса содержит JSON c массивом ответов со следующими параметрами:
</p>
<table>
<tr>
<th>
Параметры
</th>
<th>
Значение
</th>
</tr>
<tr>
<td>
user_id
</td>
<td>
ID пользователя
</td>
</tr>
<tr>
<td>
question_id
</td>
<td>
ID вопроса(int)
</td>
</tr>
<tr>
<td>
response_body
</td>
<td>
Ответ пользователя(string 255)
</td>
</tr>
<tr>
<td>
user_questionnaire_uuid
</td>
<td>
UUID анкеты назначенной пользователю(string 36)
</td>
</tr>
</table>
<p>
Пример тела запроса:
</p>
```json5
{
"userResponses": [
{
"user_id": "1",
"question_id": "7",
"response_body": "oooooooooooo111111111",
"user_questionnaire_uuid": "d222f858-60fd-47fb-8731-dc9d5fc384c5"
},
{
"user_id": "1",
"question_id": "4",
"response_body": "oooooooooooo2222222",
"user_questionnaire_uuid": "d222f858-60fd-47fb-8731-dc9d5fc384c5"
}
]
}
```
<p>
Возвращает массив объектов <b>ОтветПользователя</b>. <br>
Пример:
</p>
```json5
[
{
"user_id": "1",
"question_id": "7",
"response_body": "oooooooooooo111111111",
"user_questionnaire_uuid": "d222f858-60fd-47fb-8731-dc9d5fc384c5",
"created_at": {
"expression": "NOW()",
"params": []
},
"updated_at": {
"expression": "NOW()",
"params": []
},
"id": 192,
"answer_flag": 0
},
{
"user_id": "1",
"question_id": "7",
"response_body": "oooooooooooo111111111",
"user_questionnaire_uuid": "d222f858-60fd-47fb-8731-dc9d5fc384c5",
"created_at": {
"expression": "NOW()",
"params": []
},
"updated_at": {
"expression": "NOW()",
"params": []
},
"id": 193,
"answer_flag": 0
}
]
```
<p>
Ответ содержит:
</p>
<table>
<tr>
<th>
Параметры
</th>
<th>
Значение
</th>
</tr>
<tr>
<td>
user_id
</td>
<td>
ID пользователя
</td>
</tr>
<tr>
<td>
question_id
</td>
<td>
ID вопроса(int)
</td>
</tr>
<tr>
<td>
response_body
</td>
<td>
Ответ пользователя(string 255)
</td>
</tr>
<tr>
<td>
user_questionnaire_uuid
</td>
<td>
UUID анкеты назначенной пользователю(string 36)
</td>
</tr>
<tr>
<td>
answer_flag
</td>
<td>
Флаг ответа(1 - верно, 0 - ложно)
</td>
</tr>
</table>
<p>
В случаии ошибки в запросе будет отправлено сообщение следующего вида:
</p>
```json5
{
"name": "Bad Request",
"message": "{\"question_id\":[\"\В\о\п\р\о\с is invalid.\"]}",
"code": 0,
"status": 400,
"type": "yii\\web\\BadRequestHttpException"
}
```

434
docs/api/reports.md Normal file
View File

@ -0,0 +1,434 @@
## Отчеты
## Методы
<table>
<tr>
<th>
Метод
</th>
<th>
Описание
</th>
</tr>
<tr>
<td>
api/reports
</td>
<td>
Список отчётов
</td>
</tr>
<tr>
<td>
api/reports/{id}
</td>
<td>
Один отчёт
</td>
</tr>
<tr>
<td>
find-by-date
</td>
<td>
Отчёт по дате
</td>
</tr>
<tr>
<td>
create
</td>
<td>
Создать отчёт
</td>
</tr>
<tr>
<td>
delete
</td>
<td>
Удалить отчёт
</td>
</tr>
<tr>
<td>
update
</td>
<td>
Изменить отчёт
</td>
</tr>
</table>
### Список
`https://guild.craft-group.xyz/api/reports`
<p>
Для получения списка отчетов необходимо отправить <b>GET</b> запрос на URL https://guild.craft-group.xyz/api/reports
</p>
<p>
Возможные параметры:
</p>
<table>
<tr>
<th>
Параметры
</th>
<th>
Значение
</th>
</tr>
<tr>
<td>
fromDate*
</td>
<td>
Дата (yyyy-mm-dd) начала поиска отчетов.
</td>
</tr>
<tr>
<td>
toDate
</td>
<td>
Дата (yyyy-mm-dd) окончания поиска отчетов.
</td>
</tr>
<tr>
<td>
limit
</td>
<td>
Количество отчетов, которое вернет сервер при запросе (по умолчанию 10).
</td>
</tr>
<tr>
<td>
offset
</td>
<td>
Количество записей на которое нужно отступить в списке отчетов.
</td>
</tr>
<tr>
<td>
user_id
</td>
<td>
Идентификатор карточки пользователя отчета.
</td>
</tr>
</table>
<p>
Пример запроса:
</p>
`https://guild.craft-group.xyz/api/reports/index?fromDate=2021-08-01&toDate=2021-08-31&user_id=2&limit=3&offset=2`
### Один отчет
`https://guild.craft-group.xyz/api/reports/{id}`
<p>
Для получения отчета необходимо отправить <b>GET</b> запрос на URL https://guild.craft-group.xyz/api/reports/{id}
</p>
<p>
Параметры:
</p>
<table>
<tr>
<th>
Параметры
</th>
<th>
Значение
</th>
</tr>
<tr>
<td>
id*
</td>
<td>
ID отчета.
</td>
</tr>
</table>
<p>
Пример запроса на просмотр отчета с ID 13:
</p>
`https://guild.craft-group.xyz/api/reports/13`
### Отчёт по дате
`https://guild.craft-group.xyz/api/reports/find-by-date`
<p>
Для получения отчета необходимо отправить <b>GET</b> запрос на URL https://guild.craft-group.xyz/api/reports/find-by-date
</p>
<p>
Требуемые параметры:
</p>
<table>
<tr>
<th>
Параметры
</th>
<th>
Значение
</th>
</tr>
<tr>
<td>
user_card_id*
</td>
<td>
ID профиля пользователя
</td>
</tr>
<tr>
<td>
date*
</td>
<td>
Дата в формате: Y-m-d
</td>
</tr>
</table>
<p>
Пример запроса :
</p>
`https://guild.craft-group.xyz/api/reports/find-by-date?user_card_id=17&date=2022-02-14`
<p>
Пример ответа:
</p>
```json5
[
{
"id": "1",
"created_at": "2022-02-14",
"today": null,
"difficulties": "",
"tomorrow": "",
"status": null,
"user_card_id": "17",
"task": [
{
"id": "1",
"report_id": "1",
"task": "dfghjkl",
"hours_spent": "2",
"created_at": "1644842433",
"status": "1",
"minutes_spent": "4"
}
]
},
{
"id": "2",
"created_at": "2022-02-14",
"today": "dxvxv",
"difficulties": "сложности возникли",
"tomorrow": "завтра",
"status": null,
"user_card_id": "17",
"task": [
{
"id": "2",
"report_id": "2",
"task": "54651513",
"hours_spent": "4",
"created_at": "1644842630",
"status": "1",
"minutes_spent": "2"
}
]
}
]
```
### Создать отчет
`https://guild.craft-group.xyz/api/reports/create`
<p>
Для того, отправить приглашение профилю на собеседование, необходимо сделать
<b>POST</b> запрос на URL https://guild.craft-group.xyz/api/reports/create
</p>
<p>
Возможные параметры:
</p>
<table>
<tr>
<th>
Параметры
</th>
<th>
Значение
</th>
</tr>
<tr>
<td>
created_at*
</td>
<td>
Дата (yyyy-mm-dd) создания.
</td>
</tr>
<tr>
<td>
user_card_id*
</td>
<td>
Идентификатор карточки пользователя.
</td>
</tr>
<tr>
<td>
tasks*
</td>
<td>
JSON массив содержащий объекты задач
<pre>
[{
"task" : "Рефакторинг",
"created_at": 1638260728,
"status": 1,
"minutes_spent": 26,
"hours_spent" : 3
}]
</pre>
</td>
</tr>
<tr>
<td>
difficulties
</td>
<td>
Сложности.
</td>
</tr>
<tr>
<td>
tomorrow
</td>
<td>
Планы на завтра.
</td>
</tr>
<tr>
<td>
status
</td>
<td>
Номер статуса.
</td>
</tr>
</table>
### Удалить отчет
`https://guild.craft-group.xyz/api/reports/delete`
<p>
Для удаления отчета необходимо отправить <b>GET</b> запрос на URL https://guild.craft-group.xyz/api/reports/delete
</p>
<p>
Возможные параметры:
</p>
<table>
<tr>
<th>
Параметры
</th>
<th>
Значение
</th>
</tr>
<tr>
<td>
id*
</td>
<td>
Идентификатор отчета.
</td>
</tr>
</table>
<p>
Пример запроса:
</p>
`https://guild.craft-group.xyz/api/reports/delete?id=17`
### Обновить отчет
`https://guild.craft-group.xyz/api/reports/update`
<p>
Для удаления отчета необходимо отправить <b>GET</b> запрос на URL https://guild.craft-group.xyz/api/reports/update
</p>
<p>
Возможные параметры:
</p>
<table>
<tr>
<th>
Параметры
</th>
<th>
Значение
</th>
</tr>
<tr>
<td>
id*
</td>
<td>
Идентификатор отчета.
</td>
</tr>
<tr>
<td>
created_at
</td>
<td>
Дата (yyyy-mm-dd) создания.
</td>
</tr>
<tr>
<td>
today
</td>
<td>
Сделанное сегодня.
</td>
</tr>
<tr>
<td>
difficulties
</td>
<td>
Сложности.
</td>
</tr>
<tr>
<td>
tomorrow
</td>
<td>
Планы на завтра.
</td>
</tr>
<tr>
<td>
status
</td>
<td>
Номер статуса.
</td>
</tr>
</table>
<p>
Пример запроса:
</p>
`https://guild.craft-group.xyz/api/reports/update?id=18&created_at=2021-09-17&today=0&difficulties=diff&tomorrow=new task&status=1`

6
docs/api/skills.md Normal file
View File

@ -0,0 +1,6 @@
## Навыки
### Популярные навыки
`https://guild.craft-group.xyz/api/skills/skills-on-main-page`
<p>
Чтобы получить популярные навыки нужно сделать <b>GET</b> запрос на URL https://guild.craft-group.xyz/api/skills/skills-on-main-page
</p>

200
docs/api/task-user.md Normal file
View File

@ -0,0 +1,200 @@
## Исполнители задачи
## Методы
<table>
<tr>
<th>
Метод
</th>
<th>
Описание
</th>
</tr>
<tr>
<td>
get-task-users
</td>
<td>
Список исплнителей задачи
</td>
</tr>
<tr>
<td>
set-task-users
</td>
<td>
Назначить исполнителя на задачу
</td>
</tr>
</table>
### Список исполнителей задачи
`https://guild.craft-group.xyz/api/task-user/get-task-users`
<p>
Для получения списка исполнителей необходимо отправить <b>GET</b> запрос на URL https://guild.craft-group.xyz/api/task-user/get-task-users
</p>
<p>
Требуемые параметры:
</p>
<table>
<tr>
<th>
Параметры
</th>
<th>
Значение
</th>
</tr>
<tr>
<td>
task_id
</td>
<td>
ID задачи
</td>
</tr>
</table>
<p>
Пример запроса:
</p>
`https://guild.craft-group.xyz/api/task-user/get-task-users?task_id=10`
<p>
Возвращает массив сотрудников проекта закреплённых за задачей. <br>
Каждый ответ имеет такой вид:
</p>
```json5
[
{
"id": 5,
"task_id": 10,
"project_user_id": 1
},
{
"id": 7,
"task_id": 10,
"project_user_id": 5
}
]
```
<p>
Параметры объекта <b>Исполнитель</b>:
</p>
<table>
<tr>
<th>
Параметры
</th>
<th>
Значение
</th>
</tr>
<tr>
<td>
id
</td>
<td>
ID исполнителя задачи(int)
</td>
</tr>
<tr>
<td>
task_id
</td>
<td>
ID задачи(int)
</td>
</tr>
<tr>
<td>
project_user_id
</td>
<td>
ID сотрудника на проекте(int)
</td>
</tr>
</table>
<p>
Если задача не найдена будет отправлено следующее сообщение:
</p>
```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`
<p>
Для назначения исполнителя необходимо отправить <b>POST</b> запрос на URL https://guild.craft-group.xyz/api/task-user/set-task-user
</p>
<p>
Требуемые параметры:
</p>
<table>
<tr>
<th>
Параметры
</th>
<th>
Значение
</th>
</tr>
<tr>
<td>
task_id
</td>
<td>
ID задачи
</td>
</tr>
<tr>
<td>
project_user_id
</td>
<td>
ID сотрудника на проекте
</td>
</tr>
</table>
<p>
Пример запроса:
</p>
`https://guild.craft-group.xyz/api/task-user/set-task-user`
<p>
Возвращает объект <b>Исполнителя задачи</b>.<br>
Каждый ответ имеет такой вид:
</p>
```json5
{
"task_id": "10",
"project_user_id": "5",
"id": 8
}
```
<p>
Если задача не найдена будет отправлено следующее сообщение:
</p>
```json5
{
"name": "Bad Request",
"message": "{\"task_id\":[\"\З\а\д\а\ч\а is invalid.\"]}",
"code": 0,
"status": 400,
"type": "yii\\web\\BadRequestHttpException"
}
```

View File

@ -236,7 +236,7 @@
} }
``` ```
## Обновить документ ## Обновить задачу
`https://guild.craft-group.xyz/api/task/update` `https://guild.craft-group.xyz/api/task/update`
<p> <p>

View File

@ -0,0 +1,33 @@
<?php
namespace frontend\modules\api\controllers;
use common\models\InterviewRequest;
use common\services\InterviewRequestService;
use Yii;
use yii\base\InvalidConfigException;
use yii\web\ServerErrorHttpException;
class InterviewRequestController extends ApiController
{
public function verbs(): array
{
return [
'create-interview-request' => ['post']
];
}
/**
* @throws InvalidConfigException
* @throws ServerErrorHttpException
*/
public function actionCreateInterviewRequest(): InterviewRequest
{
$InterviewRequestModel = InterviewRequestService::createInterviewRequest(Yii::$app->getRequest()->getBodyParams());
if ($InterviewRequestModel->errors) {
throw new ServerErrorHttpException(json_encode($InterviewRequestModel->errors));
}
return $InterviewRequestModel;
}
}

View File

@ -2,7 +2,6 @@
namespace frontend\modules\api\controllers; namespace frontend\modules\api\controllers;
use common\services\ManagerService; use common\services\ManagerService;
use yii\web\NotFoundHttpException; use yii\web\NotFoundHttpException;
@ -24,7 +23,7 @@ class ManagerController extends ApiController
{ {
$managers = ManagerService::getManagerList(); $managers = ManagerService::getManagerList();
if(empty($managers)) { if (empty($managers)) {
throw new NotFoundHttpException('Managers are not assigned'); throw new NotFoundHttpException('Managers are not assigned');
} }
@ -36,14 +35,13 @@ class ManagerController extends ApiController
*/ */
public function actionGetManagerEmployeesList($manager_id): array public function actionGetManagerEmployeesList($manager_id): array
{ {
if(empty($manager_id) or !is_numeric($manager_id)) if (empty($manager_id) or !is_numeric($manager_id)) {
{
throw new NotFoundHttpException('Incorrect manager ID'); throw new NotFoundHttpException('Incorrect manager ID');
} }
$managerEmployeesList = ManagerService::getManagerEmployeesList($manager_id); $managerEmployeesList = ManagerService::getManagerEmployeesList($manager_id);
if(empty($managerEmployeesList)) { if (empty($managerEmployeesList)) {
throw new NotFoundHttpException('Managers are not assigned or employees are not assigned to him'); throw new NotFoundHttpException('Managers are not assigned or employees are not assigned to him');
} }
@ -55,14 +53,13 @@ class ManagerController extends ApiController
*/ */
public function actionGetManager($manager_id): array public function actionGetManager($manager_id): array
{ {
if(empty($manager_id) or !is_numeric($manager_id)) if (empty($manager_id) or !is_numeric($manager_id)) {
{
throw new NotFoundHttpException('Incorrect manager ID'); throw new NotFoundHttpException('Incorrect manager ID');
} }
$manager = ManagerService::getManager($manager_id); $manager = ManagerService::getManager($manager_id);
if(empty($manager)) { if (empty($manager)) {
throw new NotFoundHttpException('There is no such manager'); throw new NotFoundHttpException('There is no such manager');
} }

View File

@ -2,117 +2,38 @@
namespace frontend\modules\api\controllers; namespace frontend\modules\api\controllers;
use common\behaviors\GsCors;
use common\classes\Debug;
use common\models\InterviewRequest;
use common\models\User;
use common\models\UserCard;
use common\services\ProfileService; use common\services\ProfileService;
use frontend\modules\api\models\ProfileSearchForm;
use kavalar\BotNotificationTemplateProcessor;
use kavalar\TelegramBotService;
use Yii;
use yii\filters\auth\CompositeAuth;
use yii\filters\auth\HttpBearerAuth;
use yii\filters\auth\QueryParamAuth;
use yii\filters\ContentNegotiator;
use yii\helpers\ArrayHelper;
use yii\web\BadRequestHttpException; use yii\web\BadRequestHttpException;
use yii\web\Response; use yii\web\ServerErrorHttpException;
class ProfileController extends ApiController class ProfileController extends ApiController
{ {
public function verbs(): array
public function behaviors()
{ {
$parent = parent::behaviors(); return [
$b = [ '' => ['get'],
[ 'profile-with-report-permission' => ['post', 'patch']
'class' => ContentNegotiator::className(),
'formats' => [
'application/json' => Response::FORMAT_JSON,
],
],
'authenticator' => [
'class' => CompositeAuth::class,
'authMethods' => [
HttpBearerAuth::class,
],
]
]; ];
return array_merge($parent, $b);
} }
public function actionIndex($id = null) public function actionIndex($id = null): ?array
{ {
$searchModel = new ProfileSearchForm(); return ProfileService::getProfile($id, \Yii::$app->request->get());
$searchModel->attributes = \Yii::$app->request->get();
if ($id) {
return $searchModel->byId();
}
return $searchModel->byParams();
} }
public function actionProfileWithReportPermission($id) /**
* @throws BadRequestHttpException
*/
public function actionProfileWithReportPermission($id): ?array
{ {
$searchModel = new ProfileSearchForm(); return ProfileService::getProfileWithReportPermission($id);
$searchModel->attributes = \Yii::$app->request->get();
$searcherUser = Yii::$app->user->getId();
$searcherProfileId = UserCard::findOne($searcherUser)->id;
if ($id && $searcherProfileId) {
if(!UserCard::find()->where(['id' => $id])->exists())
{
throw new BadRequestHttpException(json_encode('There is no user with this id'));
}
$profile = $searchModel->byId();
$profileService = new ProfileService($searcherProfileId, $id);
if($profileService->checkReportePermission()) {
$profile += ['report_permission' => '1'];
}
else {
$profile += ['report_permission' => '0'];
}
return $profile;
}
throw new BadRequestHttpException(json_encode('Missing required parameter'));
} }
public function actionAddToInterview() /**
* @throws ServerErrorHttpException
*/
public function actionGetMainData($user_id): array
{ {
if (\Yii::$app->request->isPost) { return ProfileService::getMainData($user_id);
$attributes = \Yii::$app->request->post();
$model = new InterviewRequest();
$model->attributes = $attributes;
$model->created_at = time();
$model->user_id = \Yii::$app->user->id;
if ($model->save()) {
\Yii::$app->telegram_bot->sendRenderedMessage('interview_request', $attributes);
return ['status' => 'success'];
}
\Yii::$app->response->statusCode = 400;
return ['status' => 'error', 'errors' => $model->errors];
}
} }
public function actionMe()
{
if(isset(\Yii::$app->user->id)){
$user = User::find()->with('userCard')->where(['id' => \Yii::$app->user->id])->one();
}
\Yii::$app->response->statusCode = 401;
return ['status' => 'error', 'errors' => 'No authorized'];
}
} }

View File

@ -31,7 +31,6 @@ class TaskController extends ApiController
if ($taskModel->errors) { if ($taskModel->errors) {
throw new ServerErrorHttpException(json_encode($taskModel->errors)); throw new ServerErrorHttpException(json_encode($taskModel->errors));
} }
return $taskModel; return $taskModel;
} }
@ -39,23 +38,19 @@ class TaskController extends ApiController
/** /**
* @throws NotFoundHttpException * @throws NotFoundHttpException
*/ */
public function actionGetTaskList($project_id = null): array public function actionGetTaskList($project_id = null): array
{ {
$tasks = array(); $tasks = array();
if ($project_id) if ($project_id) {
{ if (empty($project_id) or !is_numeric($project_id)) {
if(empty($project_id) or !is_numeric($project_id))
{
throw new NotFoundHttpException('Incorrect project ID'); throw new NotFoundHttpException('Incorrect project ID');
} }
$tasks = TaskService::getTaskListByProject($project_id); $tasks = TaskService::getTaskListByProject($project_id);
} } else {
else
{
$tasks = TaskService::getTaskList($project_id); $tasks = TaskService::getTaskList($project_id);
} }
if(empty($tasks)) { if (empty($tasks)) {
throw new NotFoundHttpException('The project does not exist or there are no tasks for it'); throw new NotFoundHttpException('The project does not exist or there are no tasks for it');
} }
return $tasks; return $tasks;
@ -66,13 +61,12 @@ class TaskController extends ApiController
*/ */
public function actionGetTask($task_id): Task public function actionGetTask($task_id): Task
{ {
if(empty($task_id) or !is_numeric($task_id)) if (empty($task_id) or !is_numeric($task_id)) {
{
throw new NotFoundHttpException('Incorrect task ID'); throw new NotFoundHttpException('Incorrect task ID');
} }
$task = TaskService::getTask($task_id); $task = TaskService::getTask($task_id);
if(empty($task)) { if (empty($task)) {
throw new NotFoundHttpException('The task does not exist'); throw new NotFoundHttpException('The task does not exist');
} }
@ -87,8 +81,7 @@ class TaskController extends ApiController
public function actionUpdate(): ?Task public function actionUpdate(): ?Task
{ {
$params = Yii::$app->request->getBodyParams(); $params = Yii::$app->request->getBodyParams();
if (empty ($params['task_id']) or !TaskService::taskExists($params['task_id'])) if (empty ($params['task_id']) or !TaskService::taskExists($params['task_id'])) {
{
throw new NotFoundHttpException('The task does not exist'); throw new NotFoundHttpException('The task does not exist');
} }

View File

@ -9,19 +9,8 @@ use yii\rest\Controller;
use yii\web\BadRequestHttpException; use yii\web\BadRequestHttpException;
use yii\web\NotFoundHttpException; use yii\web\NotFoundHttpException;
class TaskUserController extends Controller class TaskUserController extends ApiController
{ {
public function behaviors(): array
{
$behaviors = parent::behaviors();
$behaviors['authenticator']['authMethods'] = [
HttpBearerAuth::className(),
];
return $behaviors;
}
public function verbs(): array public function verbs(): array
{ {
return [ return [

View File

@ -1,24 +0,0 @@
<?php
namespace frontend\modules\api\controllers;
use common\services\UserCardService;
use yii\web\ServerErrorHttpException;
class UserCardController extends ApiController
{
public function verbs(): array
{
return [
'get-user-card' => ['get'],
];
}
/**
* @throws ServerErrorHttpException
*/
public function actionGetUserCard($user_id): array
{
return UserCardService::getUserCard($user_id);
}
}