meyakovenkoj / sup-project

Система управления проектами
MIT License
1 stars 0 forks source link

таска вместо swagger'a #39

Open DyadyaRodya opened 1 year ago

DyadyaRodya commented 1 year ago

Сюда буду собирать эндпоинты

DyadyaRodya commented 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}
        ]
    }
}
DyadyaRodya commented 1 year ago
@app.route('/me', methods=['GET'])
@login_required
ответ как на /user/<string:username>
DyadyaRodya commented 1 year ago

новые эндпоинты - возможно будут правиться с учетом фильтров поиска и видимости для админа-неадмина/участника-неучастника проекта

@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
DyadyaRodya commented 1 year ago

еще эндпоинты для управления проектом

создание проекта (может только админ)
@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 &lt;/div&gt;&lt;/div&gt;&lt;script&gt;alert(111);&lt;/script&gt;",
            "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": "Тестовый заголовок &lt;/div&gt;&lt;/div&gt;&lt;script&gt;alert(111);&lt;/script&gt;",
      "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 - назначили юзера управляющим (если он не был в проекте - докинули в проект автоматически)
DyadyaRodya commented 1 year ago

добавление юзера в проект (может лишь руководитель проекта или админ)

@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": "Тестовый заголовок &lt;/div&gt;&lt;/div&gt;&lt;script&gt;alert(111);&lt;/script&gt;",
      "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": "Тестовый заголовок &lt;/div&gt;&lt;/div&gt;&lt;script&gt;alert(111);&lt;/script&gt;",
      "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
DyadyaRodya commented 1 year ago

изменение статуса проекта проверяются роль юзера (админ может все 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": "Тестовый заголовок &lt;/div&gt;&lt;/div&gt;&lt;script&gt;alert(111);&lt;/script&gt;",
      "head": "6396594fd4b95bfb17e7db47",
      "created": "2022-12-11",
      "participants": [
        "63965880d4b95bfb17e7db40",
        "6396594fd4b95bfb17e7db47",
        "63977d845c1f5e0fdd9f7487"
      ],
      "tasks": [],
      "status": "archived" // one of open, closed, archived
    }
  }
} 200 - статус обновлен

по идее при закрытии руководителем должны рассылаться уведомления и либо по таймеру проект закроется, либо все отчитаются о получении

DyadyaRodya commented 1 year ago

новые ручки для тасок

создать
@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 и файл - всё ок
DyadyaRodya commented 1 year ago

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 - отписан
DyadyaRodya commented 1 year ago
удалить файлы таски
@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 - файлы из списка удалены или их уже и так не было (в ответе таска с текущим списком файлов, которые реально есть)
DyadyaRodya commented 1 year ago

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 - статус изменен, исполнитель/тестер назначен. если менялся статус - будет уведомление людям в почту, если менялся исполнитель/тестер - будет уведомление в почту
DyadyaRodya commented 1 year ago

поиск тасок

@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)
DyadyaRodya commented 1 year ago

поменял эндпоинты поиска проектов

@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": "Тестовый заголовок проекта &lt;1&gt;",
      "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": "Тестовый заголовок проекта &lt;1&gt;",
        "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": "Тестовый заголовок проекта &lt;1&gt;",
      "head": "639a4d4027cf6cdc443bd0dd",
      "created": "2022-12-15",
      "participants": [
        "639a4d4027cf6cdc443bd0dd",
        "639a4d7527cf6cdc443bd0df"
      ],
      "tasks": [
        "639a6b4f518bb5868adcfb1b",
        "639a6f3ce3a6516d5c1fb157",
        "63a318fb71d82c68e2b96f73",
        "63a319b28b374497de7c88a8"
      ],
      "status": "open"
    }
  }
} 200 - проект есть и юзер в нем или админ, если проекта нет - у админа 404 project: null
DyadyaRodya commented 1 year ago

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 &lt;/&gt;",
          "author": "639a4bcb27cf6cdc443bd0d2",
          "task": "639a6f3ce3a6516d5c1fb157",
          "created": "2022-12-22 06:28:50",
          "edited": null
        },
        {
          "id": "63a3cf595fa9adf61eef3424",
          "text": "test text &lt;/&gt;",
          "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 &lt;/&gt;",
          "author": "639a4bcb27cf6cdc443bd0d2",
          "task": "639a6f3ce3a6516d5c1fb157",
          "created": "2022-12-22 06:28:50",
          "edited": null
        },
        {
          "id": "63a3cf595fa9adf61eef3424",
          "text": "test text2 &lt;/&gt;",
          "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 &lt;/&gt;",
          "author": "639a4bcb27cf6cdc443bd0d2",
          "task": "639a6f3ce3a6516d5c1fb157",
          "created": "2022-12-22 06:28:50",
          "edited": null
        }
      ],
      "files": [
        "attachments/639a4ca427cf6cdc443bd0db/639a6f3ce3a6516d5c1fb157/test.txt"
      ],
      "task_type": "bug"
    }
  }
} 200 -удалили
DyadyaRodya commented 1 year ago

правка таски

@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 &lt;/&gt;",
          "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 - обновилось
DyadyaRodya commented 1 year ago

получить таску

@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 &lt;/&gt;",
          "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 - окей