Feat: Request to join workspace (#3871)

This commit is contained in:
Mike
2025-01-24 14:05:53 +01:00
committed by GitHub
parent 7343ed6ba1
commit e798fc4e8a
19 changed files with 521 additions and 159 deletions
@@ -6,6 +6,7 @@ import { getUserFactory } from '@/modules/core/repositories/users'
import { renderEmail } from '@/modules/emails/services/emailRendering'
import { sendEmail } from '@/modules/emails/services/sending'
import { commandFactory } from '@/modules/shared/command'
import { getEventBus } from '@/modules/shared/services/eventBus'
import { getPaginatedItemsFactory } from '@/modules/shared/services/paginatedItems'
import {
ApproveWorkspaceJoinRequest,
@@ -30,6 +31,8 @@ import {
import { WorkspaceJoinRequestStatus } from '@/modules/workspacesCore/domain/types'
import { WorkspaceJoinRequestGraphQLReturn } from '@/modules/workspacesCore/helpers/graphTypes'
const eventBus = getEventBus()
export default {
Workspace: {
adminWorkspacesJoinRequests: async (parent, args, ctx) => {
@@ -78,7 +81,8 @@ export default {
approve: async (_parent, args) => {
const approveWorkspaceJoinRequest = commandFactory<ApproveWorkspaceJoinRequest>({
db,
operationFactory: ({ db }) => {
eventBus,
operationFactory: ({ db, emit }) => {
const updateWorkspaceJoinRequestStatus =
updateWorkspaceJoinRequestStatusFactory({
db
@@ -98,7 +102,8 @@ export default {
getWorkspaceJoinRequest: getWorkspaceJoinRequestFactory({
db
}),
upsertWorkspaceRole: upsertWorkspaceRoleFactory({ db })
upsertWorkspaceRole: upsertWorkspaceRoleFactory({ db }),
emit
})
}
})
@@ -21,6 +21,8 @@ import {
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'
import { WorkspaceEvents } from '@/modules/workspacesCore/domain/events'
export const dismissWorkspaceJoinRequestFactory =
({
@@ -104,7 +106,8 @@ export const approveWorkspaceJoinRequestFactory =
getUserById,
getWorkspace,
getWorkspaceJoinRequest,
upsertWorkspaceRole
upsertWorkspaceRole,
emit
}: {
updateWorkspaceJoinRequestStatus: UpdateWorkspaceJoinRequestStatus
sendWorkspaceJoinRequestApprovedEmail: SendWorkspaceJoinRequestApprovedEmail
@@ -112,6 +115,7 @@ export const approveWorkspaceJoinRequestFactory =
getWorkspace: GetWorkspace
getWorkspaceJoinRequest: GetWorkspaceJoinRequest
upsertWorkspaceRole: UpsertWorkspaceRole
emit: EventBus['emit']
}) =>
async ({ userId, workspaceId }: { userId: string; workspaceId: string }) => {
const requester = await getUserById(userId)
@@ -142,6 +146,8 @@ export const approveWorkspaceJoinRequestFactory =
const role = Roles.Workspace.Member
await upsertWorkspaceRole({ userId, workspaceId, role, createdAt: new Date() })
await emit({ eventName: WorkspaceEvents.Updated, payload: { workspace } })
await sendWorkspaceJoinRequestApprovedEmail({
workspace,
requester
@@ -245,7 +245,8 @@ const { FF_WORKSPACES_MODULE_ENABLED } = getFeatureFlags()
getUserById: async () => null,
getWorkspace: async () => null,
getWorkspaceJoinRequest: async () => undefined,
upsertWorkspaceRole: async () => Promise.resolve()
upsertWorkspaceRole: async () => Promise.resolve(),
emit: async () => Promise.resolve()
})({ workspaceId: createRandomString(), userId: createRandomString() })
)
@@ -261,7 +262,8 @@ const { FF_WORKSPACES_MODULE_ENABLED } = getFeatureFlags()
getUserById: async () => user as unknown as UserWithOptionalRole,
getWorkspace: async () => null,
getWorkspaceJoinRequest: async () => undefined,
upsertWorkspaceRole: async () => Promise.resolve()
upsertWorkspaceRole: async () => Promise.resolve(),
emit: async () => Promise.resolve()
})({ workspaceId: createRandomString(), userId: createRandomString() })
)
@@ -285,7 +287,8 @@ const { FF_WORKSPACES_MODULE_ENABLED } = getFeatureFlags()
getUserById: async () => user as unknown as UserWithOptionalRole,
getWorkspace: async () => workspace as unknown as Workspace,
getWorkspaceJoinRequest: async () => undefined,
upsertWorkspaceRole: async () => Promise.resolve()
upsertWorkspaceRole: async () => Promise.resolve(),
emit: async () => Promise.resolve()
})({ workspaceId: createRandomString(), userId: createRandomString() })
)
@@ -343,7 +346,8 @@ const { FF_WORKSPACES_MODULE_ENABLED } = getFeatureFlags()
getUserById: async () => user as unknown as UserWithOptionalRole,
getWorkspace: async () => workspace as unknown as Workspace,
getWorkspaceJoinRequest: async () => request,
upsertWorkspaceRole
upsertWorkspaceRole,
emit: async () => Promise.resolve()
})({ workspaceId: workspace.id, userId: user.id })
).to.equal(true)