Backend - the-tender-team/tender-parsing GitHub Wiki

📘 API Документация: Аутентификация и управление пользователями

🔐 POST /register

Описание

Регистрация нового пользователя.

Тело запроса (JSON)

{
  "username": "string",
  "password": "string"
}

Ответ

  • 200 OK
{
  "msg": "Регистрация успешна"
}

Ошибки

  • 400: Пользователь уже существует

🔐 POST /login

Описание

Авторизация пользователя по логину и паролю.

Тело запроса (JSON)

{
  "username": "string",
  "password": "string"
}

Ответ

  • 200 OK
{
  "msg": "Вход выполнен"
}

Ошибки

  • 401: Неверные данные

🔐 POST /login/form

Описание

Альтернативная форма логина (OAuth2-совместимая). Используется для авторизации через form-data. Использовалась для работы со Swagger UI. Для фронта использовать только обычную ручку '/login'

Параметры запроса (x-www-form-urlencoded)

  • username: логин
  • password: пароль

Ответ

  • 200 OK
{
  "access_token": "jwt_token_string",
  "token_type": "bearer"
}

🙋 GET /me

Описание

Получить информацию о текущем авторизованном пользователе.

Ответ

{
  "username": "example_user",
  "role": "user | admin | owner"
}

🔁 POST /change-password

Описание

Изменение пароля текущего пользователя.

Тело запроса

{
  "old_password": "string",
  "new_password": "string"
}

Ответ

{
  "msg": "Пароль успешно изменён"
}

Ошибки

  • 401: Старый пароль неверен
  • 404: Пользователь не найден

📘 API Документация: Парсинг, просмотр и анализ тендеров


🛠️ POST /parse

Описание

Запускает парсинг сайта госзакупок с заданными фильтрами. Только для admin и owner.

  • Тело запроса:
{
  "pageStart": 1,
  "pageEnd": 5,
  "priceFrom": 1000.0,
  "priceTo": 50000.0,
  "terminationGrounds": [1, 2, 3],
  "sortBy": 1,
  "sortAscending": true,
  "searchString": "тестовый строковый критерий",
  "contractDateFrom": "01.01.2025",
  "contractDateTo": "01.02.2025",
  "publishDateFrom": "01.01.2025",
  "publishDateTo": "01.02.2025",
  "updateDateFrom": "01.01.2025",
  "updateDateTo": "01.02.2025",
  "executionDateStart": "01.01.2025",
  "executionDateEnd": "01.02.2025",
}
  • Параметры:
    • pageStart, pageEnd (числа)
      Диапазон страниц (включительно), по которым нужно собрать данные. По умолчанию выводится только первая страница. Максимум можно выводить 10 страниц.

    • priceFrom, priceTo (числа)
      Цена в рублях. Если не указано, поиск по цене не ограничивается. Вовзращает ValueError если priceFrom > priceTo.

    • terminationGrounds (список)
      Основания расторжения контракта. Допустимые значения:

      • 1 - Судебный акт,
      • 2 - Односторонний отказ заказчика от исполнения контракта в соответствии с гражданским законодательством,
      • 3 - Односторонний отказ поставщика (подрядчика, исполнителя) от исполнения контракта в соответствии с гражданским законодательством.

      Если входящий список пуст, то используются все элементы. Если список превышает 3 элемента или имеет недопустимые элементы возвращается ValueError.

    • sortBy (число)
      Тип сортировки. Числа соответствуют:

      1 → UPDATE_DATE(Дата обновления)

      2 → PUBLISH_DATE(Дата размещения)

      3 → PRICE(Цена)

      4 → RELEVANCE(Релевантность)

      Если число не входит в диапазон от 1 до 4(включительно), возвращается ValueError

    • sortAscending (булево)
      true (сортировать по возрастанию) или false (по убыванию). По умолчанию false.

    • searchString (строка)
      Поисковая строка для фильтрации результатов. По умолчанию пустая строка - результаты не фильтруются.

    • contractDateFrom, contractDateTo (даты в формате DD-MM-YYYY) Дата заключения контракта от и до. Если не указывать, даты не ограничиваются. Возвращает ValueError, если дата от позже даты до

    • publishDateFrom, publishDateTo (даты в формате DD-MM-YYYY) Дата размещения контракта от и до. Если не указывать, даты не ограничиваются. Возвращает ValueError, если дата от позже даты до

    • updateDateFrom, updateDateTo (даты в формате DD-MM-YYYY) Дата обновления контракта от и до. Если не указывать, даты не ограничиваются. Возвращает ValueError, если дата от позже даты до

    • executionDateStart, executionDateEnd (даты в формате DD-MM-YYYY) Дата исполнения контракта от и до. Если не указывать, даты не ограничиваются. Возвращает ValueError, если дата от позже даты до

Ответ

{
  "msg": "Сохранено 50 тендеров"
}

Ошибки

  • 403: Недостаточно прав
  • 502: Ошибка загрузки страницы с zakupki.gov.ru

📄 GET /tenders

Описание

Получить актуальную таблицу тендеров для текущего пользователя.

  • admin и owner получают свою последнюю таблицу
  • user — закреплённую таблицу, либо последнюю при первом входе

Ответ

[
  {
    "title": "...",
    "link": "...",
    "customer": "...",
    "price": "...",
    "contractNumber": "...",
    "purchaseObjects": "...",
    "contractDate": "...",
    "executionDate": "...",
    "publishDate": "...",
    "updateDate": "...",
    "parsedAt": "...",
    "parsedBy": "admin_user"
  },
  ...
]

🔄 POST /tenders/pull-latest

Описание

Для пользователя с ролью user: вручную подтянуть самую последнюю таблицу, созданную любым админом.

Ответ

{
  "msg": "Получена последняя таблица от admin_username"
}

Ошибки

  • 404: Нет таблиц в базе

🤖 POST /tenders/{tender_id}/analyze

Описание

Проанализировать конкретный тендер с помощью LLM (YandexGPT). Анализ сохраняется в БД и повторно не выполняется.

Параметры пути

  • tender_id — ID тендера

Ответ

{
  "analysis": "В результате анализа выявлены риски...",
  "cached": false
}

Если анализ уже был сделан:

{
  "analysis": "Ранее сохранённый результат анализа...",
  "cached": true
}

Ошибки

  • 404: Тендер не найден
  • 500: Ошибка вызова YandexGPT

📘 API Документация: Управление заявками на получение роли администратора

✉️ POST /admin-request

Описание

Подача заявки на получение роли администратора. Доступно только для пользователей с ролью user.

Ответ

  • 200 OK
{
  "msg": "Заявка подана"
}

Ошибки

  • 400: Заявка уже подана и ожидает рассмотрения
  • 403: Недостаточно прав (если роль не user)

🔍 GET /admin-request-status/{username}

Описание

Получить статус заявки на получение прав администратора для указанного пользователя.
Доступ разрешён только самому пользователю, который подавал заявку.


Параметры пути

  • username — имя пользователя, чью заявку нужно проверить

Ответ

{
  "status": "pending | approved | rejected",
  "created_at": "2025-05-16T14:32:10.000Z"
}

Ошибки

  • 403 Forbidden — если пользователь пытается запросить статус чужой заявки
{
  "detail": "Недостаточно прав"
}
  • 404 Not Found — если заявка для указанного пользователя не найдена
{
  "detail": "Заявка не найдена"
}

📄 GET /admin-requests

Описание

Получить список всех заявок от пользователей. Доступно только владельцу (owner).

Ответ

  • 200 OK: Массив объектов-заявок
[
  {
    "id": 1,
    "username": "ivan123",
    "status": "pending",
    "created_at": "2025-05-16T13:00:00+00:00"
  },
  ...
]

✅ POST /admin-requests/approve/{username}

Описание

Одобрить заявку от пользователя и выдать ему роль admin. Доступно только владельцу (owner).

Параметры пути

  • username: имя пользователя, чью заявку нужно одобрить

Ответ

{
  "msg": "Пользователь ivan123 теперь админ"
}

Ошибки

  • 404: Заявка или пользователь не найдены
  • 403: Недостаточно прав

❌ POST /admin-requests/reject/{username}

Описание

Отклонить заявку пользователя и сбросить ему роль user. Доступно только владельцу (owner).

Параметры пути

  • username: имя пользователя, чью заявку нужно отклонить

Ответ

{
  "msg": "Заявка от пользователя ivan123 отклонена"
}

Ошибки

  • 404: Заявка или пользователь не найдены
  • 403: Недостаточно прав