From dceb8842d3a11485d9fdce7ae4d6ac983e37fda9 Mon Sep 17 00:00:00 2001 From: Moritz Rengert <42251569+moritzrengert@users.noreply.github.com> Date: Thu, 13 Jul 2023 11:58:30 +0200 Subject: [PATCH] Fix prevent duplicate team invite (#536) * check for existing invites * add success / error toast on invite * add toast on member / invite removal --- .../settings/members/EditMemberships.tsx | 17 ++++++++++++++--- apps/web/lib/members.ts | 2 +- .../pages/api/v1/teams/[teamId]/invite/index.ts | 5 +++++ 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/apps/web/app/environments/[environmentId]/settings/members/EditMemberships.tsx b/apps/web/app/environments/[environmentId]/settings/members/EditMemberships.tsx index c25166a1b7..1a8405c4e2 100644 --- a/apps/web/app/environments/[environmentId]/settings/members/EditMemberships.tsx +++ b/apps/web/app/environments/[environmentId]/settings/members/EditMemberships.tsx @@ -152,10 +152,16 @@ export function EditMemberships({ environmentId }: EditMembershipsProps) { } const handleDeleteMember = async () => { + let result = false; if (activeMember.accepted) { - await removeMember(team.teamId, activeMember.userId); + result = await removeMember(team.teamId, activeMember.userId); } else { - await deleteInvite(team.teamId, activeMember.inviteId); + result = await deleteInvite(team.teamId, activeMember.inviteId); + } + if (result) { + toast.success("Member removed successfully"); + } else { + toast.error("Something went wrong"); } setDeleteMemberModalOpen(false); mutateTeam(); @@ -173,7 +179,12 @@ export function EditMemberships({ environmentId }: EditMembershipsProps) { const handleAddMember = async (data) => { // TODO: handle http 409 user is already part of the team - await addMember(team.teamId, data); + const add = await addMember(team.teamId, data); + if (add) { + toast.success("Member invited successfully"); + } else { + toast.error("Something went wrong"); + } mutateTeam(); }; diff --git a/apps/web/lib/members.ts b/apps/web/lib/members.ts index d0c44a7f97..414dd1f901 100644 --- a/apps/web/lib/members.ts +++ b/apps/web/lib/members.ts @@ -78,7 +78,7 @@ export const addMember = async (teamId: string, data: { name: string; email: str headers: { "Content-Type": "application/json" }, body: JSON.stringify(data), }); - return result.status === 200; + return result.status === 201; } catch (error) { console.error(error); return false; diff --git a/apps/web/pages/api/v1/teams/[teamId]/invite/index.ts b/apps/web/pages/api/v1/teams/[teamId]/invite/index.ts index d2284cc0db..185ff45037 100644 --- a/apps/web/pages/api/v1/teams/[teamId]/invite/index.ts +++ b/apps/web/pages/api/v1/teams/[teamId]/invite/index.ts @@ -35,6 +35,11 @@ export default async function handle(req: NextApiRequest, res: NextApiResponse) let { email, name, role } = req.body; email = email.toLowerCase(); + const existingInvite = await prisma.invite.findFirst({ where: { email, teamId } }); + if (existingInvite) { + return res.status(409).json({ message: "Invite already exists" }); + } + const user = await prisma.user.findUnique({ where: { email } }); if (user) {