Open DyadyaRodya opened 1 year ago
Нужные
@app.route('/_xhr/login', methods=['POST'])
{
"username":"test",
"password":"P@ssw0rd"
}
ответы
{'message': 'Successful login'}, 200 ок
{'message': 'Wrong credentials'}, 401 не ок
{'message': 'Bad request'}, 400 в запросе не было каких-то кредов
@app.route('/_xhr/register', methods=['POST'])
{
"username":"Должен быть строкой из ascii или цифр",
"password":"Строка. Длина не менее 12, должны быть хотя бы по одной: буквы нижнего и верхнего регистра, цифра, спец-символ из !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~ ",
"name":"Строка букв плюс могут быть дефисы `-` и пробелы ` ` для случая сложных имен и фамилий. впереди идущие и конечные пробелы удаляются, сдвоенные пробелы сжимаются до одного (в базу попадут именно очищенные)",
"surname":"как и name"
}
ответы
{'message': 'Username already in use'}, 400 - занято
{'message': 'Failed creds validation'}, 400 - передали в кредах что-то не то
{'message': 'Successful register'}, 201 - ок и пока сразу происходит логин
{'message': 'Wrong credentials'}, 401 - такое трудно представить, если прошла проверка, но почему-то вдруг фейл при регистрации
{'message': 'Bad request'}, 400 - передали не все креды
@app.route('/_xhr/logout', methods=['POST'])
@login_required
{}
ответ
{'message': 'Successful logout'}, 200
Добавлены по приколу (потом там может появиться что-то осмылсленное:
@app.route('/')
@app.route('/users', methods=['GET'])
@login_required
ответ
{"data":
{"users":
[
{"_id": "6390e4ae0a37bfbcbf2f2d6b", "name": "\u0420\u043e\u0434\u0438\u043e\u043d", "surname": "\u0428\u0430\u0440\u0430\u0444\u0438\u0435\u0432", "username": "admin007", "password_hash": "тут хэш зачем-то, но я его уберу потом", "projects": [], "is_admin": true}
]
}
}
@app.route('/me', methods=['GET'])
@login_required
ответ как на /user/<string:username>
новые эндпоинты - возможно будут правиться с учетом фильтров поиска и видимости для админа-неадмина/участника-неучастника проекта
@app.route('/_xhr/users/<string:user_id>', methods=['GET'])
@login_required
ответ
{
"data":{
"user":{
"id":"63965928d4b95bfb17e7db42",
"name":"\u041f\u0440\u043e\u0441\u0442\u043e",
"surname":"\u0420\u0430\u0431\u043e\u0442\u043d\u0438\u043a",
"username":"worker",
"projects":[
"6396594fd4b95bfb17e7db47"
],
"is_admin":false
}
}
} 200
или {"data": {"user": null}} 404
@app.route('/_xhr/users', methods=['GET'])
@login_required
get-parameters: username (priority), username_match (if username not given)
ответ на username
{
"data":{
"user":{
"id":"63965928d4b95bfb17e7db42",
"name":"\u041f\u0440\u043e\u0441\u0442\u043e",
"surname":"\u0420\u0430\u0431\u043e\u0442\u043d\u0438\u043a",
"username":"worker",
"projects":[
"6396594fd4b95bfb17e7db47"
],
"is_admin":false
}
}
} 200
или {"data": {"user": null}} 404
ответ на username_match (аналог поиска WHERE username LIKE "%{username_match}%"
{
"data":{
"users":[
{
"id":"63964108d7f6f8defe58e077",
"name":"\u0420\u0443\u043a\u043e",
"surname":"\u0412\u043e\u0434\u0438\u0442\u0435\u043b\u044c",
"username":"head",
"projects":[
"63965880d4b95bfb17e7db40"
],
"is_admin":false
},
{
"id":"63965928d4b95bfb17e7db42",
"name":"\u041f\u0440\u043e\u0441\u0442\u043e",
"surname":"\u0420\u0430\u0431\u043e\u0442\u043d\u0438\u043a",
"username":"worker",
"projects":[
"6396594fd4b95bfb17e7db47"
],
"is_admin":false
}
]
}
} 200 или
{"data": {"users": []}} 404
!!!!были изменены!!!! совершенно аналогичные эндпоинты для проекта (вместо поиска по username - поиск по title смотри https://github.com/meyakovenkoj/sup-project/issues/39#issuecomment-1362290591
@app.route('/_xhr/projects/<string:project_id>', methods=['GET'])
@login_required
@app.route('/_xhr/projects', methods=['GET']) параметры title(приоритетный) и title_match(если нет title) (эти параметры перед поиском в базе очищаются и эскейпятся как title в комменте ниже, чтобы поиск мог их найти)
@login_required
еще эндпоинты для управления проектом
создание проекта (может только админ)
@app.route('/_xhr/project', methods=['POST'])
@login_required
в запросе json
{"title":"Строка букв, цифр, и символов ```-+_'"%^* []{}/,.;:()<>#@```. Аналогично имени и фамилии (смотри /_xhr/register) Чистится от лишних пробелов. Перед сохранением в базу символы важные для html будут обработаны и заэскейпены библиотечным методом фласка, чтобы избежать HTML Injection или XSS"}
ответы
_json_response({'message': 'Bad request'}, 400) - не задали title, нет json
_json_response({'message': "You do not have admin rights"}, 405) - проект пытался создать не админ
_json_response({'message': 'Failed title validation'}, 400) - что-то не то в title
_json_response({'message': 'Title already in use'}, 400) - после очистки title найден в базе
{
"message":"Project created",
"data":{
"project":{
"id":"63963ac9bd5afd8bf420a642",
"title":"\u0422\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a </div></div><script>alert(111);</script>",
"head":null,
"created":"2022-12-11",
"participants":[
],
"tasks":[
],
"status":"open"
}
}
} 201 - проект создан
_json_response({'message': 'Project not created'}, 400) - ошибочная (невозвоможная ситуация - после всех проверок почему-то не создался проект)
добавление (изменение) управляющего проекта (может только админ)
@app.route('/_xhr/project/head', methods=['POST'])
@login_required
в запросе
{"user_id":"63964108d7f6f8defe58e077", "project_id": "63963ac9bd5afd8bf420a642"} - это id проекта и юзера (из таблиц User и Project соответственно)
ответы
({'message': "You do not have admin rights"}, 405) - ты не админ
({'message': 'No such user'}, 400) - такого юзера нет
({'message': 'No such project'}, 400) -нет такого проекта
({'message': 'Bad request'}, 400) - плохой json, нет user_id и/или project_id
{
"message": "Project head updated",
"data": {
"project": {
"id": "63963ac9bd5afd8bf420a642",
"title": "Тестовый заголовок </div></div><script>alert(111);</script>",
"head": "6396594fd4b95bfb17e7db47",
"created": "2022-12-11",
"participants": [
"6396594fd4b95bfb17e7db47",
{
"id": "63965880d4b95bfb17e7db40",
"role": "head",
"user": {
"id": "63964108d7f6f8defe58e077",
"name": "Руко",
"surname": "Водитель",
"username": "head",
"projects": [
"63965880d4b95bfb17e7db40"
],
"is_admin": false
},
"project": "63963ac9bd5afd8bf420a642",
"subscriptions": []
}
],
"tasks": [],
"status": "open"
}
}
} 200 - назначили юзера управляющим (если он не был в проекте - докинули в проект автоматически)
добавление юзера в проект (может лишь руководитель проекта или админ)
@app.route('/_xhr/project/participant', methods=['POST'])
@login_required
в запросе
{"user_id":"639639fe84e41fc472316856", "project_id": "63963ac9bd5afd8bf420a642"}
ответы
({'message': 'No such user'}, 400) - такого юзера нет
({'message': 'No such project'}, 400) -нет такого проекта
({'message': 'Bad request'}, 400) - плохой json, нет user_id и/или project_id
({'message': "You do not have head or admin rights"}, 405) - ты не админ и не руководитель
{
"message": "User added to project",
"data": {
"project": {
"id": "63963ac9bd5afd8bf420a642",
"title": "Тестовый заголовок </div></div><script>alert(111);</script>",
"head": {
"id": "63977d845c1f5e0fdd9f7487",
"role": "worker",
"user": {
"id": "639639fe84e41fc472316856",
"name": "Админ",
"surname": "Админов-Иванов оглы",
"username": "admin008",
"projects": [
"63977d845c1f5e0fdd9f7487"
],
"is_admin": false
},
"project": "63963ac9bd5afd8bf420a642",
"subscriptions": []
},
"created": "2022-12-11",
"participants": [
"63965880d4b95bfb17e7db40",
"6396594fd4b95bfb17e7db47",
{
"id": "63977d845c1f5e0fdd9f7487",
"role": "worker",
"user": {
"id": "639639fe84e41fc472316856",
"name": "Админ",
"surname": "Админов-Иванов оглы",
"username": "admin008",
"projects": [
"63977d845c1f5e0fdd9f7487"
],
"is_admin": false
},
"project": "63963ac9bd5afd8bf420a642",
"subscriptions": []
}
],
"tasks": [],
"status": "open"
}
}
} 201 - юзер добавлен в проект
{
"message": "User already participant",
"data": {
"project": {
"id": "63963ac9bd5afd8bf420a642",
"title": "Тестовый заголовок </div></div><script>alert(111);</script>",
"head": {
"id": "63977d845c1f5e0fdd9f7487",
"role": "worker",
"user": {
"id": "639639fe84e41fc472316856",
"name": "Админ",
"surname": "Админов-Иванов оглы",
"username": "admin008",
"projects": [
"63977d845c1f5e0fdd9f7487"
],
"is_admin": false
},
"project": "63963ac9bd5afd8bf420a642",
"subscriptions": []
},
"created": "2022-12-11",
"participants": [
"63965880d4b95bfb17e7db40",
"6396594fd4b95bfb17e7db47",
{
"id": "63977d845c1f5e0fdd9f7487",
"role": "worker",
"user": {
"id": "639639fe84e41fc472316856",
"name": "Админ",
"surname": "Админов-Иванов оглы",
"username": "admin008",
"projects": [
"63977d845c1f5e0fdd9f7487"
],
"is_admin": false
},
"project": "63963ac9bd5afd8bf420a642",
"subscriptions": []
}
],
"tasks": [],
"status": "open"
}
}
} 200 - юзер уже есть в проекте (отличие в статусе и message
изменение статуса проекта проверяются роль юзера (админ может все 3 действия, руководитель может только finish) и статус проекта (проверяется соответствие действия автомату состояний) P.S. finished состояние с картинки - это closed на бэке и в БД
@app.route('/_xhr/projects/<string:project_id>/<string:action>', methods=['POST'])
@login_required
action == reopen | close | archive
ответы
({'message': 'Unknown action'}, 400) - в строке action что-то не то
({'message': 'Project not found'}, 404) - проекта нет
({'message': 'You cannot perform this action'}, 405) - не прошла проверка прав или проверка автомата состояний
{
"message": "ok",
"data": {
"project": {
"id": "63963ac9bd5afd8bf420a642",
"title": "Тестовый заголовок </div></div><script>alert(111);</script>",
"head": "6396594fd4b95bfb17e7db47",
"created": "2022-12-11",
"participants": [
"63965880d4b95bfb17e7db40",
"6396594fd4b95bfb17e7db47",
"63977d845c1f5e0fdd9f7487"
],
"tasks": [],
"status": "archived" // one of open, closed, archived
}
}
} 200 - статус обновлен
по идее при закрытии руководителем должны рассылаться уведомления и либо по таймеру проект закроется, либо все отчитаются о получении
новые ручки для тасок
создать
@task_view.route('/_xhr/tasks', methods=['POST'])
@login_required
в запросе
{
"title":"может быть не уникальным даже в рамках одного проекта, работает так же, как и у проекта",
"description":"просто строка, перед записью будет escape как у title, но лишние пробелы не удаляются",
"task_type":"строка, одна из bug, task, feature или story",
"project_id":"id проекта"
}
ответы
json_response({'message': 'Project not found or you cannot create tasks in this project'}, 404) - нет проекта или юзер не в проекте
json_response({'message': 'Unknown task_type'}, 400) - нет такого типа
json_response({'message': 'Failed data validation'}, 400) - title или описание не прошли валидацию
json_response({'message': 'Bad request'}, 400) - нет json, нет нужных полей в json
json_response({'message': 'Task not created'}, 400) - ошибочная (невозможная) ситуация
{
"message": "Task created",
"data": {
"task": {
"id": "63a318fb71d82c68e2b96f73",
"title": "test1",
"author": "639a4d4027cf6cdc443bd0dd",
"created": "2022-12-21 00:00:00",
"changed": null,
"executor": null,
"accepted": null,
"description": "blabla",
"checker": null,
"status": "new",
"subscribers": [
"63a318fb71d82c68e2b96f74"
],
"project": "639a4ca427cf6cdc443bd0db",
"comments": [],
"files": [],
"task_type": "feature"
}
}
}, 201 - таска создана (автор сразу подписан)
закинуть файл в задачу
@task_view.route('/_xhr/tasks/<string:task_id>/attach', methods=['POST'])
@login_required
в запросе
через FormData отправлен файл, сам файл лежит по ключу file
ответы
json_response({'message': 'Need to send file!'}, 403) - нет файла по ключу file
json_response({'message': 'File cannot be empty!'}, 403) - пустой файл
json_response({'message': 'File name cannot be empty!'}, 403) - имя файла пустое
json_response({'message': 'Task not found'}, 404) - нет таски
json_response({'message': 'Task not found or you cannot update tasks in this project'}, 404) - либо таски нет, либо человека нет в проекте, где таска
json_response({'message': 'Upload failed'}, 400) - ошибочная (невозможная) ситуация
{
"message": "File uploaded",
"data": {
"task": {
"id": "639a6f3ce3a6516d5c1fb157",
"title": "Что-то сломалось",
"author": "639a4d4027cf6cdc443bd0dd",
"created": "2022-12-15 00:00:00",
"changed": null,
"executor": null,
"accepted": null,
"description": "Не знаю, что",
"checker": null,
"status": 1,
"subscribers": [
"639a6f3ee3a6516d5c1fb158"
],
"project": "639a4ca427cf6cdc443bd0db",
"comments": [],
"files": [
"attachments/639a4ca427cf6cdc443bd0db/639a6f3ce3a6516d5c1fb157/test.txt"
],
"task_type": 1
}
}
}, 200 - файл загружен (здесь в поле files по сути ссылки, по которым можно получить файл (надо быть в проекте), то есть
https://v1517237.hosted-by-vdsina.ru/attachments/639a4ca427cf6cdc443bd0db/639a6f3ce3a6516d5c1fb157/test.txt
получить файл
@task_view.route('/attachments/<string:project_id>/<string:task_id>/<string:filename>', methods=['GET'])
@login_required
json_response({'message': 'No such task or project or you do not have such rights'}, 404) - нет таски, проекта или ты не в проекте
другой 404 (дефолтный ответ 404) - ответ фласка, когда такого файла нет (верхняя проверка будет раньше)
200 и файл - всё ок
user подписывается/отписывается
@task_view.route('/_xhr/tasks/<string:task_id>/subscribe', methods=['POST'])
@login_required
({'message': 'Task not found or you cannot update tasks in this project'}, 404) - нет таски или user не в проекте
({'message': 'Failed subscription'}, 400) - ошибка (невозможная) подписки
({
"message": "Subscribed",
"data": {
"task": {
"id": "639a6f3ce3a6516d5c1fb157",
"title": "Что-то сломалось",
"author": "639a4d4027cf6cdc443bd0dd",
"created": "2022-12-15 00:00:00",
"changed": null,
"executor": null,
"accepted": null,
"description": "Не знаю, что",
"checker": null,
"status": "new",
"subscribers": [
"63a30bcfc5c163798fd7b265",
"63a3183171d82c68e2b96f6c"
],
"project": "639a4ca427cf6cdc443bd0db",
"comments": [],
"files": [
"attachments/639a4ca427cf6cdc443bd0db/639a6f3ce3a6516d5c1fb157/test.txt"
],
"task_type": "bug"
}
}
}, 200) - подписан (или уже был)
@task_view.route('/_xhr/tasks/<string:task_id>/unsubscribe', methods=['POST'])
@login_required
({'message': 'Task not found or you cannot update tasks in this project'}, 404) - нет такой таски или юзер не в таске
({'message': 'User not subscriber'}, 400) - юзер не был подписан
({'message': 'Failed unsubscription'}, 400) - (невозможная) ошибка
{
"message": "Unsubscribed",
"data": {
"task": {
"id": "639a6f3ce3a6516d5c1fb157",
"title": "Что-то сломалось",
"author": "639a4d4027cf6cdc443bd0dd",
"created": "2022-12-15 00:00:00",
"changed": null,
"executor": null,
"accepted": null,
"description": "Не знаю, что",
"checker": null,
"status": "new",
"subscribers": [
"63a30bcfc5c163798fd7b265"
],
"project": "639a4ca427cf6cdc443bd0db",
"comments": [],
"files": [
"attachments/639a4ca427cf6cdc443bd0db/639a6f3ce3a6516d5c1fb157/test.txt"
],
"task_type": "bug"
}
}
}, 200 - отписан
удалить файлы таски
@task_view.route('/_xhr/tasks/<string:task_id>/delete_files', methods=['POST'])
@login_required
в запросе json со списком файлов для удаления (путь обязательно начиная с attachments)
{"files":[
"attachments/639a4ca427cf6cdc443bd0db/639a6f3ce3a6516d5c1fb157/test(1).txt",
"attachments/639a4ca427cf6cdc443bd0db/639a6f3ce3a6516d5c1fb157/test.txt"
]}
ответы
{'message': 'Task not found or you cannot update tasks in this project'}, 404 - нет такой таски или юзер не в проекте
{'message': 'Bad request'}, 400 - нет json или нет списка files в json
{
"message": "Files deleted",
"data": {
"task": {
"id": "639a6f3ce3a6516d5c1fb157",
"title": "Что-то сломалось",
"author": "639a4d4027cf6cdc443bd0dd",
"created": "2022-12-15 00:00:01",
"changed": "2022-12-21 20:47:23",
"executor": null,
"accepted": null,
"description": "Не знаю, что",
"checker": null,
"status": "new",
"subscribers": [
"63a30bcfc5c163798fd7b265"
],
"project": "639a4ca427cf6cdc443bd0db",
"comments": [],
"files": [
"attachments/639a4ca427cf6cdc443bd0db/639a6f3ce3a6516d5c1fb157/test.txt"
],
"task_type": "bug"
}
}
}, 200 - файлы из списка удалены или их уже и так не было (в ответе таска с текущим списком файлов, которые реально есть)
endpoint для управления статусом таски реализует примерно вот это (на бэке и в бд Finished == ready и Checking == verification) при этом в closed таску можно перевести из любого состояния, reopen могут все (если таска закрыта), только руководитель может назначить tester'а и executor'а (executor'а он также может переназначить в любом из [new, reopened, open, correction] состояний), только executor может перевести в ready, только tester может подтвердить или послать на доработку
class TaskStatus(IntEnum): (наружу отдаются имена)
new = 1
open = 2
reopened = 3
ready = 4
verification = 5
closed = 6
correction = 7
class TaskAction(IntEnum): (это action, который надо указать в строке запроса)
set_executor = 1
set_tester = 2
reopen = 3
verify = 4 (подтвердить - таска закроется)
request_correction = 5 (послать на доработку)
finish = 6
close = 7
@task_view.route('/_xhr/tasks/<string:task_id>/status/<string:action>', methods=['POST'])
@login_required
на входе
если set_executor или set_tester - нужен json {"pp_id":"639a4d7527cf6cdc443bd0df"}
иначе пусто
({'message': 'Unknown action'}, 400) - нет такого действия
({'message': 'Unknown project participant'}, 400) - если это назначение исполнителя/проверяющего, но такого projectparticipant нет
({'message': 'You need to give project participant in json pp_id for such action'}, 400) - если это назначение исполнителя/проверяющего, но не дали json или pp_id
({'message': 'Task not found'}, 404) - такой таски нет
({'message': 'You cannot perform this action'}, 405) - права (юзер должен быть в проекте и при этом для действия подходит статус, роль и назначение - см выше)
{
"message": "ok",
"data": {
"task": {
"id": "639a6f3ce3a6516d5c1fb157",
"title": "Что-то сломалось",
"author": "639a4d4027cf6cdc443bd0dd",
"created": "2022-12-15 00:00:01",
"changed": "2022-12-22 02:18:36",
"executor": "639a4d7527cf6cdc443bd0df",
"accepted": null,
"description": "Не знаю, что",
"checker": null,
"status": "open",
"subscribers": [
"63a30bcfc5c163798fd7b265",
"63a38ed6fb33b8b870675782",
"63a393cb5f2f0417306717da"
],
"project": "639a4ca427cf6cdc443bd0db",
"comments": [],
"files": [
"attachments/639a4ca427cf6cdc443bd0db/639a6f3ce3a6516d5c1fb157/test.txt"
],
"task_type": "bug"
}
}
}, 200 - статус изменен, исполнитель/тестер назначен. если менялся статус - будет уведомление людям в почту, если менялся исполнитель/тестер - будет уведомление в почту
поиск тасок
@task_view.route('/_xhr/tasks', methods=['GET'])
@login_required
опциональные get параметры title (приоритет), title_match (второй по приоритету)
могут быть не заданы
если title - поиск тасок с этим заголовком, фильт, что они из доступных юзеру проектов
если title_match - поиск тасок с похожим заголовком (как like '%title_match%' в sql), фильтр, что они из доступных юзеру проектов
если не заданы - таски, где юзер назначен на исполнение или проверку
{
"data": {
"tasks": [
{
"id": "63a318fb71d82c68e2b96f73",
"title": "test1",
"author": "639a4d4027cf6cdc443bd0dd",
"created": "2022-12-21 00:00:01",
"changed": null,
"executor": null,
"accepted": null,
"description": "blabla",
"checker": null,
"status": "new",
"subscribers": [
"63a318fb71d82c68e2b96f74"
],
"project": "639a4ca427cf6cdc443bd0db",
"comments": [],
"files": [],
"task_type": "feature"
},
{
"id": "63a3197a060f405bb2e9f5c5",
"title": "test1",
"author": "639a4d4027cf6cdc443bd0dd",
"created": "2022-12-21 00:00:01",
"changed": null,
"executor": null,
"accepted": null,
"description": "blabla",
"checker": null,
"status": "new",
"subscribers": [],
"project": "639a4ca427cf6cdc443bd0db",
"comments": [],
"files": [],
"task_type": "feature"
},
{
"id": "63a319b28b374497de7c88a8",
"title": "test1",
"author": "639a4d4027cf6cdc443bd0dd",
"created": "2022-12-21 17:35:30",
"changed": null,
"executor": null,
"accepted": null,
"description": "blabla",
"checker": null,
"status": "new",
"subscribers": [
"63a319b28b374497de7c88a9"
],
"project": "639a4ca427cf6cdc443bd0db",
"comments": [],
"files": [],
"task_type": "feature"
}
]
}
}200 - всегда (если залогинен естественно @login_required иначе отдаст 401)
поменял эндпоинты поиска проектов
@project_view.route('/_xhr/projects', methods=['GET'])
@login_required
get-параметры title(приоритетный) и title_match(если нет title) (эти параметры перед поиском в базе очищаются и эскейпятся как title в комменте ниже, чтобы поиск мог их найти) - проекты фильтруются на то, чтобы юзер был там или у юзера были права админа
без параметров - проекты где юзер участник
{'message': 'Project not found or you are do not have rights for it'}, 404 - при строгом поиске по title проект не найден или юзер не админ и не в проекте
{
"data": {
"project": {
"id": "639a4ca427cf6cdc443bd0db",
"title": "Тестовый заголовок проекта <1>",
"head": "639a4d4027cf6cdc443bd0dd",
"created": "2022-12-15",
"participants": [
"639a4d4027cf6cdc443bd0dd",
"639a4d7527cf6cdc443bd0df"
],
"tasks": [
"639a6b4f518bb5868adcfb1b",
"639a6f3ce3a6516d5c1fb157",
"63a318fb71d82c68e2b96f73",
"63a319b28b374497de7c88a8"
],
"status": "open"
}
}
} если поиск по title -200 проект есть и юзер в нем или админ, 404 и тогда "project" будет null - у админа что такого проекта нет
{
"data": {
"projects": [
{
"id": "639a4ca427cf6cdc443bd0db",
"title": "Тестовый заголовок проекта <1>",
"head": "639a4d4027cf6cdc443bd0dd",
"created": "2022-12-15",
"participants": [
"639a4d7527cf6cdc443bd0df",
"639a4d4027cf6cdc443bd0dd"
],
"tasks": [
"639a6b4f518bb5868adcfb1b",
"639a6f3ce3a6516d5c1fb157",
"63a318fb71d82c68e2b96f73",
"63a319b28b374497de7c88a8"
],
"status": "open"
}
]
}
} остальные случаи - 200 - если в списке есть хоть один проект 404 если список пуст
@project_view.route('/_xhr/projects/<string:project_id>', methods=['GET'])
@login_required
{'message': 'Project not found or you are do not have rights for it'}, 404 - у не админа если проекта нет или он не в нем
{
"data": {
"project": {
"id": "639a4ca427cf6cdc443bd0db",
"title": "Тестовый заголовок проекта <1>",
"head": "639a4d4027cf6cdc443bd0dd",
"created": "2022-12-15",
"participants": [
"639a4d4027cf6cdc443bd0dd",
"639a4d7527cf6cdc443bd0df"
],
"tasks": [
"639a6b4f518bb5868adcfb1b",
"639a6f3ce3a6516d5c1fb157",
"63a318fb71d82c68e2b96f73",
"63a319b28b374497de7c88a8"
],
"status": "open"
}
}
} 200 - проект есть и юзер в нем или админ, если проекта нет - у админа 404 project: null
comments
@task_view.route('/_xhr/tasks/<string:task_id>/comment', methods=['POST'])
@login_required
тело
{"text":"то же что и decription у таски"}
ответы
({'message': 'Commenting failed.'}, 400 - какая-то ошибка (невозможно)
{'message': 'Failed text validation.'}, 400 - дали не строку
{'message': 'No such task or you are not in project.'}, 404 - нет такой таски или человек не в проекте
{'message': 'Bad request'}, 400 - нет json или в json нет text
{
"message": "ok",
"data": {
"task": {
"id": "639a6f3ce3a6516d5c1fb157",
"title": "Что-то сломалось",
"author": "639a4d4027cf6cdc443bd0dd",
"created": "2022-12-15 00:00:01",
"changed": "2022-12-22 03:51:29",
"executor": "639a4d4027cf6cdc443bd0dd",
"accepted": null,
"description": "Не знаю, что",
"checker": null,
"status": "open",
"subscribers": [
"63a30bcfc5c163798fd7b265",
"63a38ed6fb33b8b870675782",
"63a393cb5f2f0417306717da"
],
"project": "639a4ca427cf6cdc443bd0db",
"comments": [
{
"id": "63a3ce46be1c2287b5714a94",
"text": "test text",
"author": "639a4bcb27cf6cdc443bd0d2",
"task": "639a6f3ce3a6516d5c1fb157",
"created": "2022-12-22 06:25:58",
"edited": null
},
{
"id": "63a3ce88fdf60ec9a8bc79a0",
"text": "test text",
"author": "639a4bcb27cf6cdc443bd0d2",
"task": "639a6f3ce3a6516d5c1fb157",
"created": "2022-12-22 06:27:04",
"edited": null
},
{
"id": "63a3cef258cb5fb44b7daf94",
"text": "test text </>",
"author": "639a4bcb27cf6cdc443bd0d2",
"task": "639a6f3ce3a6516d5c1fb157",
"created": "2022-12-22 06:28:50",
"edited": null
},
{
"id": "63a3cf595fa9adf61eef3424",
"text": "test text </>",
"author": "639a4bcb27cf6cdc443bd0d2",
"task": "639a6f3ce3a6516d5c1fb157",
"created": "2022-12-22 06:30:33",
"edited": null
}
],
"files": [
"attachments/639a4ca427cf6cdc443bd0db/639a6f3ce3a6516d5c1fb157/test.txt"
],
"task_type": "bug"
}
}
} 201 - создан коммент
@task_view.route('/_xhr/comment/<string:comment_id>/edit', methods=['POST'])
@login_required
тело
{"text":"то же что и decription у таски"}
ответы
{'message': 'Editing failed.'}, 400 - непонятная ошибка
{'message': 'Failed text validation.'}, 400 - текст не строка
{'message': 'No such comment or you are not author.'}, 404 - такого коммента нет или автор другой
{'message': 'Bad request'}, 400 нет json или нет text в json
{
"message": "ok",
"data": {
"task": {
"id": "639a6f3ce3a6516d5c1fb157",
"title": "Что-то сломалось",
"author": "639a4d4027cf6cdc443bd0dd",
"created": "2022-12-15 00:00:01",
"changed": "2022-12-22 03:51:29",
"executor": "639a4d4027cf6cdc443bd0dd",
"accepted": null,
"description": "Не знаю, что",
"checker": null,
"status": "open",
"subscribers": [
"63a30bcfc5c163798fd7b265",
"63a38ed6fb33b8b870675782",
"63a393cb5f2f0417306717da"
],
"project": "639a4ca427cf6cdc443bd0db",
"comments": [
{
"id": "63a3ce46be1c2287b5714a94",
"text": "test text",
"author": "639a4bcb27cf6cdc443bd0d2",
"task": "639a6f3ce3a6516d5c1fb157",
"created": "2022-12-22 06:25:58",
"edited": null
},
{
"id": "63a3ce88fdf60ec9a8bc79a0",
"text": "test text",
"author": "639a4bcb27cf6cdc443bd0d2",
"task": "639a6f3ce3a6516d5c1fb157",
"created": "2022-12-22 06:27:04",
"edited": null
},
{
"id": "63a3cef258cb5fb44b7daf94",
"text": "test text </>",
"author": "639a4bcb27cf6cdc443bd0d2",
"task": "639a6f3ce3a6516d5c1fb157",
"created": "2022-12-22 06:28:50",
"edited": null
},
{
"id": "63a3cf595fa9adf61eef3424",
"text": "test text2 </>",
"author": "639a4bcb27cf6cdc443bd0d2",
"task": "639a6f3ce3a6516d5c1fb157",
"created": "2022-12-22 06:30:33",
"edited": "2022-12-22 06:34:54"
}
],
"files": [
"attachments/639a4ca427cf6cdc443bd0db/639a6f3ce3a6516d5c1fb157/test.txt"
],
"task_type": "bug"
}
}
} 200 - поправили коммент
@task_view.route('/_xhr/comment/<string:comment_id>/delete', methods=['POST'])
@login_required
ответы
{'message': 'Something went wrong.'}, 400 - непонятная ошибка
{'message': 'Remove failed.'}, 400 сбой при удалении
{'message': 'No such comment or you are not author.'}, 404 - такого коммента нет или автор другой
{
"message": "ok",
"data": {
"task": {
"id": "639a6f3ce3a6516d5c1fb157",
"title": "Что-то сломалось",
"author": "639a4d4027cf6cdc443bd0dd",
"created": "2022-12-15 00:00:01",
"changed": "2022-12-22 03:51:29",
"executor": "639a4d4027cf6cdc443bd0dd",
"accepted": null,
"description": "Не знаю, что",
"checker": null,
"status": "open",
"subscribers": [
"63a30bcfc5c163798fd7b265",
"63a38ed6fb33b8b870675782",
"63a393cb5f2f0417306717da"
],
"project": "639a4ca427cf6cdc443bd0db",
"comments": [
{
"id": "63a3ce46be1c2287b5714a94",
"text": "test text",
"author": "639a4bcb27cf6cdc443bd0d2",
"task": "639a6f3ce3a6516d5c1fb157",
"created": "2022-12-22 06:25:58",
"edited": null
},
{
"id": "63a3ce88fdf60ec9a8bc79a0",
"text": "test text",
"author": "639a4bcb27cf6cdc443bd0d2",
"task": "639a6f3ce3a6516d5c1fb157",
"created": "2022-12-22 06:27:04",
"edited": null
},
{
"id": "63a3cef258cb5fb44b7daf94",
"text": "test text </>",
"author": "639a4bcb27cf6cdc443bd0d2",
"task": "639a6f3ce3a6516d5c1fb157",
"created": "2022-12-22 06:28:50",
"edited": null
}
],
"files": [
"attachments/639a4ca427cf6cdc443bd0db/639a6f3ce3a6516d5c1fb157/test.txt"
],
"task_type": "bug"
}
}
} 200 -удалили
правка таски
@task_view.route('/_xhr/tasks/<string:task_id>/edit', methods=['POST'])
@login_required
в теле json
{"description":"правила те же", "title":"правила те же","task_type":"тот же набор"} - должно быть хотя бы 1 из полей (подразумевается, что остальные не меняются)
ответы
{'message': 'Task not found or you cannot update tasks in this project'}, 404 - нет таски или юзер не в проекте
{'message': 'Unknown task_type'}, 400 - task_type плохой
{'message': 'Failed data validation'}, 400 - title или description не отвалидировались
{'message': 'Task not edited'}, 400 - непонятный сбой
{'message': 'Bad request'}, 400 - нет json или в нем не было хотя бы 1 из нужных полей
{
"message": "Task updated",
"data": {
"task": {
"id": "639a6f3ce3a6516d5c1fb157",
"title": "Что-то сломалось",
"author": "639a4d4027cf6cdc443bd0dd",
"created": "2022-12-15 00:00:01",
"changed": "2022-12-22 07:22:38",
"executor": "639a4d4027cf6cdc443bd0dd",
"accepted": null,
"description": "Не знаю, что именно",
"checker": null,
"status": "open",
"subscribers": [
"63a30bcfc5c163798fd7b265",
"63a38ed6fb33b8b870675782",
"63a393cb5f2f0417306717da"
],
"project": "639a4ca427cf6cdc443bd0db",
"comments": [
{
"id": "63a3ce46be1c2287b5714a94",
"text": "test text",
"author": "639a4bcb27cf6cdc443bd0d2",
"task": "639a6f3ce3a6516d5c1fb157",
"created": "2022-12-22 06:25:58",
"edited": null
},
{
"id": "63a3ce88fdf60ec9a8bc79a0",
"text": "test text2 </>",
"author": "639a4bcb27cf6cdc443bd0d2",
"task": "639a6f3ce3a6516d5c1fb157",
"created": "2022-12-22 06:27:04",
"edited": "2022-12-22 06:40:44"
}
],
"files": [
"attachments/639a4ca427cf6cdc443bd0db/639a6f3ce3a6516d5c1fb157/test.txt"
],
"task_type": "bug"
}
}
} 200 - обновилось
получить таску
@task_view.route('/_xhr/tasks/<string:task_id>', methods=['GET'])
@login_required
ответы
{'message': 'No such task or you are not in project.'}, 404 - нет такой таски или юзер не в проекте
{
"data": {
"task": {
"id": "639a6f3ce3a6516d5c1fb157",
"title": "Что-то сломалось",
"author": "639a4d4027cf6cdc443bd0dd",
"created": "2022-12-15 00:00:01",
"changed": "2022-12-22 08:03:43",
"executor": "639a4d4027cf6cdc443bd0dd",
"accepted": null,
"description": "Не знаю, что именно",
"checker": "639a4d4027cf6cdc443bd0dd",
"status": "verification",
"subscribers": [
"63a30bcfc5c163798fd7b265",
"63a38ed6fb33b8b870675782",
"63a393cb5f2f0417306717da"
],
"project": "639a4ca427cf6cdc443bd0db",
"comments": [
{
"id": "63a3ce46be1c2287b5714a94",
"text": "test text",
"author": "639a4bcb27cf6cdc443bd0d2",
"task": "639a6f3ce3a6516d5c1fb157",
"created": "2022-12-22 06:25:58",
"edited": null
},
{
"id": "63a3ce88fdf60ec9a8bc79a0",
"text": "test text2 </>",
"author": "639a4bcb27cf6cdc443bd0d2",
"task": "639a6f3ce3a6516d5c1fb157",
"created": "2022-12-22 06:27:04",
"edited": "2022-12-22 06:40:44"
},
{
"id": "63a436d947209e12e2e784fe",
"text": "comment",
"author": "63a40ef4eedd77ff42b5153d",
"task": "639a6f3ce3a6516d5c1fb157",
"created": "2022-12-22 13:52:09",
"edited": null
}
],
"files": [
"attachments/639a4ca427cf6cdc443bd0db/639a6f3ce3a6516d5c1fb157/test.txt"
],
"task_type": "bug"
}
}
} 200 - окей
Сюда буду собирать эндпоинты