Skip to content

Add team invite candidate search#664

Merged
TThanos3000 merged 1 commit into
masterfrom
feature/team-invite-candidates-api
Jul 22, 2026
Merged

Add team invite candidate search#664
TThanos3000 merged 1 commit into
masterfrom
feature/team-invite-candidates-api

Conversation

@TThanos3000

Copy link
Copy Markdown
Collaborator

Что изменено

Добавлен безопасный поиск зарегистрированных пользователей, которых капитан может пригласить в команду конкретной заявки.

Новый endpoint:

GET /applications/<application_id>/team/invite-candidates/?q=<query>

Пример ответа:

[
  {
    "id": 123,
    "display_name": "Иван Иванов",
    "avatar": "https://..."
  }
]

Правила поиска

Параметр q:

  • обязателен;
  • очищается от пробелов;
  • должен содержать от 3 до 100 символов;
  • выдача ограничена 20 результатами.

Поиск выполняется без учета регистра:

  • по имени;
  • по фамилии;
  • по полному имени;
  • по полному имени в обратном порядке;
  • по началу email.

Email используется только для поиска и никогда не возвращается в ответе.

Фильтрация кандидатов

Возвращаются только:

  • активные пользователи;
  • пользователи с Registration в текущей PartnerProgram;
  • пользователи без конфликтующего активного участия в этой программе.

Исключаются:

  • капитан текущей Team;
  • accepted-участники текущей Team;
  • accepted-участники другой активной Team этой Program;
  • пользователи с pending-приглашением в текущую Team;
  • владельцы другой активной Application этой Program.

Исторические состояния не блокируют повторное приглашение:

  • declined;
  • revoked;
  • removed;
  • left;
  • терминальные Application.

Поиск не создает TeamInvite, не создает TeamMember и не резервирует место. Все проверки повторно выполняются транзакционно при создании приглашения.

Права доступа

Доступ разрешен:

  • капитану Team;
  • staff/superuser.

Результаты:

  • captain — 200;
  • staff — 200;
  • accepted member — 403;
  • manager — 403;
  • outsider — 404;
  • pending invitee — 404;
  • anonymous — 401.

Если Application недоступна для изменений, истек дедлайн или команда заполнена с учетом pending-приглашений, endpoint возвращает domain validation error.

Безопасность

Ответ содержит только:

  • id;
  • display_name;
  • avatar.

Не возвращаются:

  • email;
  • телефон;
  • дата рождения;
  • регистрационные ответы;
  • данные чужих Application;
  • данные чужих Team;
  • закрытые поля профиля.

Поиск работает только в контексте конкретной Team и не создает глобальный каталог пользователей.

Производительность

Фильтрация реализована через ORM Exists-подзапросы:

  • без N+1;
  • без загрузки всех пользователей в Python;
  • без лишнего distinct();
  • со стабильной сортировкой;
  • с ограничением выдачи.

Throttling

Добавлен отдельный scope:

team_invite_candidate_search

Ограничение:

20/min

Документация

Обновлена документация TeamInvite API и связанных domain/service правил.

Проверки

  • 25 новых selector/API тестов — успешно;
  • полный regression: 445 тестов — успешно;
  • makemigrations --check --dry-runNo changes detected;
  • migrate --plan — успешно;
  • manage.py check — успешно;
  • py_compile — успешно;
  • flake8 измененных файлов — успешно;
  • git diff --check — успешно.

Глобальный flake8 сохраняет 29 ранее существовавших ошибок в файлах, не относящихся к этому PR.

Не входит в PR

  • frontend;
  • глобальный поиск пользователей;
  • изменения моделей и миграций;
  • изменения Project, Submission и legacy Invite;
  • email и уведомления;
  • deploy-конфигурация.

@TThanos3000
TThanos3000 merged commit cdc81c8 into master Jul 22, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant