From b693d0ba2b66b7e6a7b00b400f660dcd5d1af024 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carl-Gerhard=20Lindesva=CC=88rd?= Date: Tue, 15 Oct 2024 21:38:39 +0200 Subject: [PATCH] fix(dashboard): duplicate members --- .../organization/invites/create-invite.tsx | 12 +++++++----- .../onboarding/onboarding-tracking.tsx | 2 +- .../components/settings/members/columns.tsx | 13 ++++++++++--- packages/trpc/src/routers/onboarding.ts | 18 ++++++++++-------- packages/trpc/src/routers/organization.ts | 17 +++++++++++++++-- 5 files changed, 43 insertions(+), 19 deletions(-) diff --git a/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/settings/organization/invites/create-invite.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/settings/organization/invites/create-invite.tsx index 2ed0428f..bbf9ac6d 100644 --- a/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/settings/organization/invites/create-invite.tsx +++ b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/settings/organization/invites/create-invite.tsx @@ -67,11 +67,13 @@ export default function CreateInvite({ projects }: Props) { - Invite a user - - Invite users to your organization. They will recieve an email will - instructions. - +
+ Invite a user + + Invite users to your organization. They will recieve an email will + instructions. + +
mutation.mutate(values))} diff --git a/apps/dashboard/src/app/(onboarding)/onboarding/onboarding-tracking.tsx b/apps/dashboard/src/app/(onboarding)/onboarding/onboarding-tracking.tsx index 448a843f..4afc5ba2 100644 --- a/apps/dashboard/src/app/(onboarding)/onboarding/onboarding-tracking.tsx +++ b/apps/dashboard/src/app/(onboarding)/onboarding/onboarding-tracking.tsx @@ -104,7 +104,7 @@ const Tracking = ({ render={({ field, formState }) => { return (
- + ; projects: IServiceProject[]; }) { + const initial = useRef(row.original.access.map((item) => item.projectId)); const [access, setAccess] = useState( row.original.access.map((item) => item.projectId), ); - const mutation = api.organization.updateMemberAccess.useMutation(); + const mutation = api.organization.updateMemberAccess.useMutation({ + onError(error) { + toast.error(error.message); + setAccess(initial.current); + }, + }); return ( }) { onClick={() => { revoke.mutate({ organizationId: row.original.organizationId, - userId: row.original.id, + userId: row.original.userId!, + id: row.original.id, }); }} > diff --git a/packages/trpc/src/routers/onboarding.ts b/packages/trpc/src/routers/onboarding.ts index 6bbf3608..733ccc39 100644 --- a/packages/trpc/src/routers/onboarding.ts +++ b/packages/trpc/src/routers/onboarding.ts @@ -77,14 +77,16 @@ export const onboardingRouter = createTRPCRouter({ throw new Error('Organization slug is missing'); } - await db.member.create({ - data: { - email: user.email, - organizationId: organization.id, - role: 'org:admin', - userId: user.id, - }, - }); + if (input.organization) { + await db.member.create({ + data: { + email: user.email, + organizationId: organization.id, + role: 'org:admin', + userId: user.id, + }, + }); + } const project = await db.project.create({ data: { diff --git a/packages/trpc/src/routers/organization.ts b/packages/trpc/src/routers/organization.ts index 560c20b2..e27b493a 100644 --- a/packages/trpc/src/routers/organization.ts +++ b/packages/trpc/src/routers/organization.ts @@ -130,10 +130,18 @@ export const organizationRouter = createTRPCRouter({ z.object({ organizationId: z.string(), userId: z.string(), + id: z.string(), }), ) .mutation(async ({ input, ctx }) => { - if (ctx.session.userId === input.userId) { + const exists = await db.member.count({ + where: { + userId: input.userId, + organizationId: input.organizationId, + }, + }); + + if (ctx.session.userId === input.userId && exists === 1) { throw new Error('You cannot remove yourself from the organization'); } @@ -147,8 +155,9 @@ export const organizationRouter = createTRPCRouter({ } await db.$transaction([ - db.member.deleteMany({ + db.member.delete({ where: { + id: input.id, userId: input.userId, organizationId: input.organizationId, }, @@ -171,6 +180,10 @@ export const organizationRouter = createTRPCRouter({ }), ) .mutation(async ({ input, ctx }) => { + if (input.userId === ctx.session.userId) { + throw TRPCAccessError('You cannot update your own access'); + } + const access = await getOrganizationAccess({ userId: ctx.session.userId, organizationId: input.organizationSlug,