Приглашения
Система приглашений позволяет добавлять пользователей в организации и команды.
Модель
Invitation
├── email (приглашённый пользователь)
├── roleId (роль, которая будет назначена)
├── organizationId? (опционально)
├── teamId? (опционально)
├── token (уникальный JWT-токен)
├── status: pending | accepted | declined | cancelled | expired
└── expiresAt (срок действия)API Endpoints
| Метод | Путь | Auth | Описание |
|---|---|---|---|
POST | /api/invitations | Да | Создать приглашение |
GET | /api/invitations/my | Да | Мои ожидающие приглашения |
GET | /api/invitations/pending | Нет | Найти ожидающие (?teamSlug=&orgSlug=) |
POST | /api/invitations/:id/accept | Да | Принять приглашение |
POST | /api/invitations/:id/decline | Да | Отклонить приглашение |
DELETE | /api/invitations/:id/cancel | Да | Отменить приглашение |
Процесс приглашения
- Создание: Пользователь с правом
members.inviteсоздаёт приглашение на email - Доставка: Если пользователь с таким email уже существует — он получает уведомление. Если нет — отправляется email со ссылкой
- Анонимный flow: Неавторизованный пользователь переходит по ссылке → видит данные приглашения через
GET /invitations/pending/:token→ регистрируется → приглашение автоматически принимается - Принятие: Пользователь добавляется в организацию/команду с указанной ролью, добавляется в чат команды
- Уведомления: Пригласитель получает уведомление о принятии
Фронтенд
Store приглашений
typescript
const store = useInvitationsStore()
const { myInvitations } = storeToRefs(store)
await store.fetchMy()
await store.create({ email, roleId, organizationId?, teamId? })
await store.accept(id)
await store.decline(id)
await store.cancel(id)Ключевые детали реализации
- Приглашения используют JWT-токены для безопасной анонимной ссылки
- При регистрации пользователя все ожидающие приглашения на его email автоматически принимаются
- Нельзя пригласить пользователя, который уже является участником
- Приглашения имеют срок действия (
expiresAt)