Files
speckle-server/packages/server/modules/workspaces/graph/resolvers/workspaceJoinRequests.ts
T
Alessandro Magionami 6d0f08b7b5 feat(workspaces): approve join request (#3833)
* feat(workspaces): approve join request

* chore(workspaces): add missing dep to resolver call

* chore(workspaces): use commandFactory
2025-01-16 16:46:59 +01:00

98 lines
3.7 KiB
TypeScript

import { db } from '@/db/knex'
import { Resolvers } from '@/modules/core/graph/generated/graphql'
import { getServerInfoFactory } from '@/modules/core/repositories/server'
import { findEmailsByUserIdFactory } from '@/modules/core/repositories/userEmails'
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 { getPaginatedItemsFactory } from '@/modules/shared/services/paginatedItems'
import { ApproveWorkspaceJoinRequest } from '@/modules/workspaces/domain/operations'
import {
countAdminWorkspaceJoinRequestsFactory,
getAdminWorkspaceJoinRequestsFactory,
getWorkspaceJoinRequestFactory,
updateWorkspaceJoinRequestStatusFactory
} from '@/modules/workspaces/repositories/workspaceJoinRequests'
import { getWorkspaceFactory } from '@/modules/workspaces/repositories/workspaces'
import { sendWorkspaceJoinRequestApprovedEmailFactory } from '@/modules/workspaces/services/workspaceJoinRequestEmails/approved'
import { approveWorkspaceJoinRequestFactory } from '@/modules/workspaces/services/workspaceJoinRequests'
import { WorkspaceJoinRequestStatus } from '@/modules/workspacesCore/domain/types'
import { WorkspaceJoinRequestGraphQLReturn } from '@/modules/workspacesCore/helpers/graphTypes'
export default {
Workspace: {
adminWorkspacesJoinRequests: async (parent, args, ctx) => {
const { filter, cursor, limit } = args
return await getPaginatedItemsFactory<
{
limit: number
cursor?: string
filter: {
workspaceId: string
userId: string
status?: WorkspaceJoinRequestStatus | null
}
},
WorkspaceJoinRequestGraphQLReturn
>({
getItems: getAdminWorkspaceJoinRequestsFactory({ db }),
getTotalCount: countAdminWorkspaceJoinRequestsFactory({ db })
})({
filter: {
workspaceId: parent.id,
status: filter?.status ?? undefined,
userId: ctx.userId! // This is the worskpace admin, not the request userId
},
cursor: cursor ?? undefined,
limit
})
}
},
WorkspaceJoinRequest: {
user: async (parent, _args, ctx) => {
return await ctx.loaders.users.getUser.load(parent.userId)
},
workspace: async (parent, _args, ctx) => {
return await ctx.loaders.workspaces!.getWorkspace.load(parent.workspaceId)
}
},
Mutation: {
workspaceJoinRequestMutations: () => ({})
},
WorkspaceJoinRequestMutations: {
approve: async (_parent, args) => {
const approveWorkspaceJoinRequest = commandFactory<ApproveWorkspaceJoinRequest>({
db,
operationFactory: ({ db }) => {
const updateWorkspaceJoinRequestStatus =
updateWorkspaceJoinRequestStatusFactory({
db
})
const sendWorkspaceJoinRequestApprovedEmail =
sendWorkspaceJoinRequestApprovedEmailFactory({
renderEmail,
sendEmail,
getServerInfo: getServerInfoFactory({ db }),
getUserEmails: findEmailsByUserIdFactory({ db })
})
return approveWorkspaceJoinRequestFactory({
updateWorkspaceJoinRequestStatus,
sendWorkspaceJoinRequestApprovedEmail,
getUserById: getUserFactory({ db }),
getWorkspace: getWorkspaceFactory({ db }),
getWorkspaceJoinRequest: getWorkspaceJoinRequestFactory({
db
})
})
}
})
return await approveWorkspaceJoinRequest({
userId: args.input.userId,
workspaceId: args.input.workspaceId
})
}
}
} as Resolvers