diff --git a/packages/server/modules/workspaces/repositories/workspaceJoinRequests.ts b/packages/server/modules/workspaces/repositories/workspaceJoinRequests.ts index dac1d1393..c0c1fcf8d 100644 --- a/packages/server/modules/workspaces/repositories/workspaceJoinRequests.ts +++ b/packages/server/modules/workspaces/repositories/workspaceJoinRequests.ts @@ -23,7 +23,11 @@ const tables = { export const createWorkspaceJoinRequestFactory = ({ db }: { db: Knex }): CreateWorkspaceJoinRequest => async ({ workspaceJoinRequest }) => { - const res = await tables.workspaceJoinRequests(db).insert(workspaceJoinRequest, '*') + const res = await tables + .workspaceJoinRequests(db) + .insert(workspaceJoinRequest, '*') + .onConflict() + .ignore() return res[0] } diff --git a/packages/server/modules/workspaces/services/workspaceJoinRequests.ts b/packages/server/modules/workspaces/services/workspaceJoinRequests.ts index d69ba35f2..ef6c97b22 100644 --- a/packages/server/modules/workspaces/services/workspaceJoinRequests.ts +++ b/packages/server/modules/workspaces/services/workspaceJoinRequests.ts @@ -19,7 +19,7 @@ import { SendWorkspaceJoinRequestReceivedEmail, UpdateWorkspaceJoinRequestStatus } from '@/modules/workspaces/domain/operations' -import { ensureError, Roles } from '@speckle/shared' +import { Roles } from '@speckle/shared' import { FindEmailsByUserId } from '@/modules/core/domain/userEmails/operations' import { userEmailsCompliantWithWorkspaceDomains } from '@/modules/workspaces/domain/logic' import { EventBus } from '@/modules/shared/services/eventBus' @@ -84,23 +84,17 @@ export const requestToJoinWorkspaceFactory = throw new WorkspaceProtectedError() } - try { - await createWorkspaceJoinRequest({ - workspaceJoinRequest: { - userId, - workspaceId, - status: 'pending' - } - }) - } catch (e) { - if (e instanceof Error && e.message.includes('duplicate key')) { - // This is a duplicate request, so confirm its existence without resending the email - return true + const joinRequest = await createWorkspaceJoinRequest({ + workspaceJoinRequest: { + userId, + workspaceId, + status: 'pending' } - throw ensureError( - e, - 'Unknown error when attempting to create a new workspace join request' - ) + }) + + if (!joinRequest || joinRequest.status !== 'pending') { + // The request was already created, so don't send the email again + return true } await sendWorkspaceJoinRequestReceivedEmail({