Приглашения

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

Кто может приглашать

Для приглашения требуется право manage_team, поэтому отправлять приглашения могут только owner и администраторы. См. Роли и права.

Отправка приглашения

Dashboard → Settings → Team (/dashboard/settings?tab=team)

  1. Введите email-адрес приглашаемого.
  2. Выберите роль: admin, member или viewer. (owner никогда не является назначаемым; недопустимое значение откатывается до member.)
  3. Отправьте приглашение.

Что происходит на бэкенде:

  • Email нормализуется (обрезаются пробелы, приводится к нижнему регистру) и проверяется.
  • Если этот человек уже является участником команды, приглашение отклоняется с ошибкой.
  • Проверяется лимит мест: активные участники плюс ожидающие приглашения должны быть ниже лимита плана владельца (max_team_members). Если команда заполнена, вам предлагается обновить план. См. Места и биллинг.
  • Создаётся (или обновляется) ожидающее приглашение для пары (team, email), и отправляется письмо с уникальной ссылкой.

Приглашения upsert-ятся по email: повторное приглашение того же адреса обновляет токен, роль и срок действия и сбрасывает приглашение в состояние pending — вы никогда не накапливаете дублирующиеся приглашения для одного человека.

Жизненный цикл приглашения

Состояние Значение
pending Отправлено, ещё не принято и не отклонено, срок не истёк
accepted Приглашённый присоединился к команде
declined Приглашённый отклонил ссылку
expired Срок действия ссылки (по умолчанию 7 дней / 168 часов) истёк

Принять можно только приглашения, которые находятся в состоянии pending и не истекли. Истёкшие или уже обработанные ссылки показывают «This invitation is invalid or has expired.»

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

  • Ссылка приглашения несёт секретный токен; в базе данных хранится только его SHA-256 хеш, поэтому утёкшую строку базы данных нельзя превратить обратно в рабочую ссылку.
  • Принятие требует авторизации под приглашённым email. Ссылка, пересланная или украденная кем-то другим, не может быть использована — при принятии проверяется, что email вашей сессии совпадает с приглашённым адресом.
  • Токены истекают через 7 дней по умолчанию.

Процесс принятия

  1. Приглашённый переходит по ссылке: GET /team/invite/{token}.
  2. Страница приглашения показывает название команды и детали приглашения.
    • Если приглашённый не авторизован, ему предлагается сначала войти (или зарегистрироваться) с приглашённым email.
    • Если он авторизован, но под другим email, в принятии отказывается с сообщением, указывающим правильный адрес.
  3. Приглашённый принимает приглашение: POST /team/invite/{token}/accept.
  4. В рамках одной транзакции:
    • Подтверждается, что команда всё ещё существует.
    • Повторно проверяется лимит мест (защищает от заполнения команды между отправкой и принятием).
    • Создаётся строка участия с приглашённой ролью (ограниченной до admin/member/viewer).
    • Активная команда пользователя переключается на эту команду.
    • Приглашение помечается как accepted.
  5. Приглашённый попадает на дашборд, работая теперь внутри новой команды.

Если на момент принятия команда заполнена, приглашённый видит: «This team has reached its member limit. Ask the owner to upgrade the plan.»

Отклонение

Приглашённый может отклонить приглашение со страницы приглашения: POST /team/invite/{token}/decline. Это помечает приглашение как declined и не требует авторизации.

Управление участниками после присоединения

Владельцы и администраторы могут управлять участниками из Dashboard → Settings → Team:

  • Сменить роль — Установить участнику роль admin, member или viewer. Вы не можете изменить собственную роль, и роль владельца здесь изменить нельзя (используйте передачу владения).
  • Удалить участника — Удалить участника, не являющегося владельцем. Он автоматически перенаправляется обратно на свою персональную команду, чтобы никогда не оставаться заблокированным. Себя таким способом удалить нельзя (используйте «Leave team»); владельца удалить нельзя.

Выход и передача

  • Выйти из команды — Любой участник, кроме владельца, может выйти (POST /dashboard/settings/team/leave); его активная команда возвращается к персональной команде. Владелец не может выйти — он должен сначала передать владение.
  • Передать владение — Владелец передаёт владение существующему участнику (POST /dashboard/settings/team/transfer, требует transfer_ownership). В рамках одной транзакции новый владелец становится owner, а прежний владелец становится admin, сохраняя инвариант «ровно один владелец». Цель уже должна быть участником команды.

Дальнейшие шаги