Files
speckle-server/packages/server/modules/workspaces/services/workspaceJoinRequests.ts
T

170 lines
4.5 KiB
TypeScript

import { WorkspaceNotFoundError } from '@/modules/workspaces/errors/workspace'
import { GetUser } from '@/modules/core/domain/users/operations'
import { NotFoundError } from '@/modules/shared/errors'
import {
CreateWorkspaceJoinRequest,
DenyWorkspaceJoinRequest,
GetWorkspace,
GetWorkspaceJoinRequest,
SendWorkspaceJoinRequestApprovedEmail,
SendWorkspaceJoinRequestDeniedEmail,
SendWorkspaceJoinRequestReceivedEmail,
UpdateWorkspaceJoinRequestStatus
} from '@/modules/workspaces/domain/operations'
export const dismissWorkspaceJoinRequestFactory =
({
getWorkspace,
updateWorkspaceJoinRequestStatus
}: {
getWorkspace: GetWorkspace
updateWorkspaceJoinRequestStatus: UpdateWorkspaceJoinRequestStatus
}) =>
async ({ userId, workspaceId }: { userId: string; workspaceId: string }) => {
const workspace = await getWorkspace({ workspaceId })
if (!workspace) {
throw new WorkspaceNotFoundError()
}
await updateWorkspaceJoinRequestStatus({
userId,
workspaceId,
status: 'dismissed'
})
return true
}
export const requestToJoinWorkspaceFactory =
({
createWorkspaceJoinRequest,
sendWorkspaceJoinRequestReceivedEmail,
getUserById,
getWorkspace
}: {
createWorkspaceJoinRequest: CreateWorkspaceJoinRequest
sendWorkspaceJoinRequestReceivedEmail: SendWorkspaceJoinRequestReceivedEmail
getUserById: GetUser
getWorkspace: GetWorkspace
}) =>
async ({ userId, workspaceId }: { userId: string; workspaceId: string }) => {
const requester = await getUserById(userId)
if (!requester) {
throw new NotFoundError('User not found')
}
const workspace = await getWorkspace({ workspaceId })
if (!workspace) {
throw new WorkspaceNotFoundError('Workspace not found')
}
await createWorkspaceJoinRequest({
workspaceJoinRequest: {
userId,
workspaceId,
status: 'pending'
}
})
await sendWorkspaceJoinRequestReceivedEmail({
workspace,
requester
})
return true
}
export const approveWorkspaceJoinRequestFactory =
({
updateWorkspaceJoinRequestStatus,
sendWorkspaceJoinRequestApprovedEmail,
getUserById,
getWorkspace,
getWorkspaceJoinRequest
}: {
updateWorkspaceJoinRequestStatus: UpdateWorkspaceJoinRequestStatus
sendWorkspaceJoinRequestApprovedEmail: SendWorkspaceJoinRequestApprovedEmail
getUserById: GetUser
getWorkspace: GetWorkspace
getWorkspaceJoinRequest: GetWorkspaceJoinRequest
}) =>
async ({ userId, workspaceId }: { userId: string; workspaceId: string }) => {
const requester = await getUserById(userId)
if (!requester) {
throw new NotFoundError('User not found')
}
const workspace = await getWorkspace({ workspaceId })
if (!workspace) {
throw new WorkspaceNotFoundError('Workspace not found')
}
const request = await getWorkspaceJoinRequest({
userId,
workspaceId,
status: 'pending'
})
if (!request) {
throw new NotFoundError('Workspace join request not found')
}
await updateWorkspaceJoinRequestStatus({
userId,
workspaceId,
status: 'approved'
})
await sendWorkspaceJoinRequestApprovedEmail({
workspace,
requester
})
return true
}
export const denyWorkspaceJoinRequestFactory =
({
updateWorkspaceJoinRequestStatus,
sendWorkspaceJoinRequestDeniedEmail,
getUserById,
getWorkspace,
getWorkspaceJoinRequest
}: {
updateWorkspaceJoinRequestStatus: UpdateWorkspaceJoinRequestStatus
sendWorkspaceJoinRequestDeniedEmail: SendWorkspaceJoinRequestDeniedEmail
getUserById: GetUser
getWorkspace: GetWorkspace
getWorkspaceJoinRequest: GetWorkspaceJoinRequest
}): DenyWorkspaceJoinRequest =>
async ({ userId, workspaceId }) => {
const requester = await getUserById(userId)
if (!requester) {
throw new NotFoundError('User not found')
}
const workspace = await getWorkspace({ workspaceId })
if (!workspace) {
throw new WorkspaceNotFoundError('Workspace not found')
}
const request = await getWorkspaceJoinRequest({
userId,
workspaceId,
status: 'pending'
})
if (!request) {
throw new NotFoundError('Workspace join request not found')
}
await updateWorkspaceJoinRequestStatus({
userId,
workspaceId,
status: 'denied'
})
await sendWorkspaceJoinRequestDeniedEmail({
workspace,
requester
})
return true
}