Контекст
В текущем контроллере TeamsInvitationsController методы getAll, getOne, update и decline помечены как @Deprecated. Нам нужно реализовать их полноценную работу, убрав статус deprecated и обеспечив корректную логику обработки данных.
Цель
Реализовать полноценный RESTful-интерфейс для управления приглашениями в команде.
Технические требования
- Локация логики: Весь код должен жить в
InvationsService.
- Структура данных:
- Инвайты хранятся как
inv:code:{code} (JSON).
- Индексы (для быстрого поиска):
team:invites:{teamId} (Set) и user:invites:{email} (Set).
- Безопасность: Можешь реализовать гвард -
TeamOwnerGuard, пока лучше просто проверять, что данный пользователь, через декоратор @GetUserId() полученный - имеет доступ к инвайтам в эту команду.
1. Реализация GET /teams/:slug/invitations
- Сервис:
getInvitations(slug: string).
- Логика:
- Найти
team.id по slug.
- Получить список всех кодов через
SMEMBERS team:invites:{teamId}.
- Выбрать данные через
MGET по списку ключей inv:code:{code}.
- Отфильтровать
null значения (если Redis протух, а индекс остался — это "мусор", его нужно игнорировать).
2. Реализация GET /teams/:slug/invitations/:code
- Сервис:
getInvitation(code: string).
- Логика:
GET из Redis по ключу inv:code:{code}.
3. Реализация PATCH /teams/:slug/invitations/:code
- DTO:
UpdateInvitationDto (разрешить только поле role).
- Логика:
- Получить текущий объект
invitation из Redis.
- Обновить поле
role.
- Сохранить обратно с тем же
TTL (используй TTL ключа, чтобы не сбросить время жизни).
4. Реализация DELETE /teams/:slug/invitations/:code
- Сервис:
removeInvitation(teamId: string, code: string, email: string).
- Логика: Используй
MULTI/EXEC для атомарного удаления:
DEL inv:code:{code}
SREM team:invites:{teamId} {code}
SREM user:invites:{email} {code}
Важные указания для джуна
- Атомарность: Все операции записи/удаления инвайтов должны выполняться через
MULTI/EXEC, чтобы индексы не рассинхронизировались с данными.
- Ошибка 404: Если
MGET вернул пустой массив или GET вернул null — выбрасывай NotFoundException.
- Семантика: В путях используй
:code (уникальный ключ приглашения), а не :invitationId, так как мы работаем с Redis-ключами по коду.
Если возникнут вопросы по работе с SREM или SMEMBERS — читай документацию ioredis или спрашивай меня в комментариях к тикету.
Контекст
В текущем контроллере
TeamsInvitationsControllerметодыgetAll,getOne,updateиdeclineпомечены как@Deprecated. Нам нужно реализовать их полноценную работу, убрав статус deprecated и обеспечив корректную логику обработки данных.Цель
Реализовать полноценный RESTful-интерфейс для управления приглашениями в команде.
Технические требования
InvationsService.inv:code:{code}(JSON).team:invites:{teamId}(Set) иuser:invites:{email}(Set).TeamOwnerGuard, пока лучше просто проверять, что данный пользователь, через декоратор @GetUserId() полученный - имеет доступ к инвайтам в эту команду.1. Реализация
GET /teams/:slug/invitationsgetInvitations(slug: string).team.idпоslug.SMEMBERS team:invites:{teamId}.MGETпо списку ключейinv:code:{code}.nullзначения (если Redis протух, а индекс остался — это "мусор", его нужно игнорировать).2. Реализация
GET /teams/:slug/invitations/:codegetInvitation(code: string).GETиз Redis по ключуinv:code:{code}.3. Реализация
PATCH /teams/:slug/invitations/:codeUpdateInvitationDto(разрешить только полеrole).invitationиз Redis.role.TTL(используйTTLключа, чтобы не сбросить время жизни).4. Реализация
DELETE /teams/:slug/invitations/:coderemoveInvitation(teamId: string, code: string, email: string).MULTI/EXECдля атомарного удаления:DEL inv:code:{code}SREM team:invites:{teamId} {code}SREM user:invites:{email} {code}Важные указания для джуна
MULTI/EXEC, чтобы индексы не рассинхронизировались с данными.MGETвернул пустой массив илиGETвернулnull— выбрасывайNotFoundException.:code(уникальный ключ приглашения), а не:invitationId, так как мы работаем с Redis-ключами по коду.Если возникнут вопросы по работе с
SREMилиSMEMBERS— читай документациюioredisили спрашивай меня в комментариях к тикету.