From 88a5dec733d4114846858da5b9875a04fda0d9d2 Mon Sep 17 00:00:00 2001 From: murilo Date: Thu, 26 Mar 2026 09:55:16 -0300 Subject: [PATCH 1/2] fix(invite): fix duplicate invite insert on db --- .../admin/create-and-send-invite/index.ts | 3 +-- src/core/domain/exceptions/invites.ts | 7 +++++++ src/core/use-cases/email/send-invite/index.ts | 19 ++++++++++--------- src/core/use-cases/email/send-invite/types.ts | 3 +-- 4 files changed, 19 insertions(+), 13 deletions(-) create mode 100644 src/core/domain/exceptions/invites.ts diff --git a/src/adapters/inbound/http/controllers/admin/create-and-send-invite/index.ts b/src/adapters/inbound/http/controllers/admin/create-and-send-invite/index.ts index c743605..4916259 100644 --- a/src/adapters/inbound/http/controllers/admin/create-and-send-invite/index.ts +++ b/src/adapters/inbound/http/controllers/admin/create-and-send-invite/index.ts @@ -41,8 +41,7 @@ export class CreateAndSendInviteController { const response = await this.createInviteTokenUseCase.execute(payload) await this.sendEmailUseCase.execute({ - email: payload.email, - organization_id: response.inviteToken.organization_id + invite_token: response.inviteToken.token }) return reply.status(201).send(response) diff --git a/src/core/domain/exceptions/invites.ts b/src/core/domain/exceptions/invites.ts new file mode 100644 index 0000000..893d5cc --- /dev/null +++ b/src/core/domain/exceptions/invites.ts @@ -0,0 +1,7 @@ +import { ControllerError } from "@/adapters/inbound/http/middlewares/general-error-handler"; + +export class InviteNotFound extends ControllerError { + constructor(public status = 404) { + super('Invite not found.') + } +} \ No newline at end of file diff --git a/src/core/use-cases/email/send-invite/index.ts b/src/core/use-cases/email/send-invite/index.ts index 59b69f4..a2adb77 100644 --- a/src/core/use-cases/email/send-invite/index.ts +++ b/src/core/use-cases/email/send-invite/index.ts @@ -1,28 +1,29 @@ import { AdminRepository } from '@/adapters/outbound/prisma/repositories/admin-repositories' import { SendInviteUseCasePayload, SendInviteUseCaseReturn } from './types' import { ResendRepository } from '@/shared/infra/email/resend' +import { InviteNotFound } from '@/core/domain/exceptions/invites' export class SendInviteUseCase { constructor( private readonly adminRepository: AdminRepository, private readonly resendRepository: ResendRepository - ) {} + ) { } async execute({ - email, - organization_id + invite_token, }: SendInviteUseCasePayload): Promise { const expires_at = new Date(Date.now() + 1000 * 60 * 60 * 72) - const invite = await this.adminRepository.createAndSendInvite({ - email, - organization_id - }) + const invite = await this.adminRepository.getInviteByToken(invite_token) + + if (!invite) { + throw new InviteNotFound() + } await this.resendRepository.sendInviteEmail({ - to: email, + to: invite.email, token: invite.token, - organization_id, + organization_id: invite.organization_id, expires_at }) diff --git a/src/core/use-cases/email/send-invite/types.ts b/src/core/use-cases/email/send-invite/types.ts index 813db17..79afb29 100644 --- a/src/core/use-cases/email/send-invite/types.ts +++ b/src/core/use-cases/email/send-invite/types.ts @@ -1,6 +1,5 @@ export interface SendInviteUseCasePayload { - email: string - organization_id: string + invite_token: string } export interface SendInviteUseCaseReturn { From ac9b1edaab771a71db29a58f1576013c15709d18 Mon Sep 17 00:00:00 2001 From: murilo Date: Thu, 26 Mar 2026 11:08:52 -0300 Subject: [PATCH 2/2] fix(invite): use invite's expires_at instead of default expiration --- src/core/use-cases/email/send-invite/index.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/core/use-cases/email/send-invite/index.ts b/src/core/use-cases/email/send-invite/index.ts index a2adb77..18bc732 100644 --- a/src/core/use-cases/email/send-invite/index.ts +++ b/src/core/use-cases/email/send-invite/index.ts @@ -12,8 +12,6 @@ export class SendInviteUseCase { async execute({ invite_token, }: SendInviteUseCasePayload): Promise { - const expires_at = new Date(Date.now() + 1000 * 60 * 60 * 72) - const invite = await this.adminRepository.getInviteByToken(invite_token) if (!invite) { @@ -24,7 +22,7 @@ export class SendInviteUseCase { to: invite.email, token: invite.token, organization_id: invite.organization_id, - expires_at + expires_at: invite.expires_at }) return {