Files
speckle-server/packages/server/modules/workspaces/services/join.ts
T
Chuck Driesler bbd5146e5a fix(workspaces): add pagination to workspace team members (#2644)
* fix(workspaces): a suggestion of paginated teams

* fix(workspaces): workspace team pagination (?)

* fix(workspaces): pagination based on acl createdAt

* fix(workspaces): fix some roles-related tests

* fix(workspaces): improve query and tests

* fix(workspaces): collaborators query without incorrect groupBy

* fix(workspaces): add default values to migration

* Fixed queries and fragments

* Merged main

* Remove comment

* chore(workspaces): update WorkspaceCollaboratorCollection mocks

* chore(workspaces): fix role test

* chore(workspaces); ope

* fix(workspaces): move workspace acl timestamps to separate table

* Merge?

* fix(workspaces) drop that table

* fix(workspaces): cursor

* fix(workspaceInvites): undo merge borkage

* fix(workspaces): rework workspace member pagination

* fix(workspaces): fix test

* fix(workspaces): test test

* fix(workspaces): literally garbage

---------

Co-authored-by: Mike Tasset <mike.tasset@gmail.com>
Co-authored-by: Gergő Jedlicska <gergo@jedlicska.com>
2024-08-29 21:17:37 +02:00

56 lines
1.9 KiB
TypeScript

import { FindEmailsByUserId } from '@/modules/core/domain/userEmails/operations'
import { EventBus } from '@/modules/shared/services/eventBus'
import {
GetWorkspaceWithDomains,
UpsertWorkspaceRole
} from '@/modules/workspaces/domain/operations'
import {
WorkspaceJoinNotAllowedError,
WorkspaceNotDiscoverableError,
WorkspaceNotJoinableError
} from '@/modules/workspaces/errors/workspace'
import { WorkspaceEvents } from '@/modules/workspacesCore/domain/events'
import { Roles } from '@speckle/shared'
export const joinWorkspaceFactory =
({
getUserEmails,
getWorkspaceWithDomains,
upsertWorkspaceRole,
emitWorkspaceEvent
}: {
getUserEmails: FindEmailsByUserId
getWorkspaceWithDomains: GetWorkspaceWithDomains
upsertWorkspaceRole: UpsertWorkspaceRole
emitWorkspaceEvent: EventBus['emit']
}) =>
async ({ userId, workspaceId }: { userId: string; workspaceId: string }) => {
const userEmails = await getUserEmails({ userId })
const workspace = await getWorkspaceWithDomains({ id: workspaceId })
if (!workspace?.discoverabilityEnabled) throw new WorkspaceNotDiscoverableError()
const workspaceDomains = workspace.domains.filter((domain) => domain.verified)
if (!workspaceDomains.length) throw new WorkspaceNotJoinableError()
const matchingEmail = userEmails.find((userEmail) => {
if (!userEmail.verified) return false
return workspaceDomains
.map((domain) => domain.domain)
.includes(userEmail.email.split('@')[1])
})
if (!matchingEmail) throw new WorkspaceJoinNotAllowedError()
const role = Roles.Workspace.Member
await upsertWorkspaceRole({ userId, workspaceId, role, createdAt: new Date() })
await emitWorkspaceEvent({
eventName: WorkspaceEvents.JoinedFromDiscovery,
payload: { userId, workspaceId }
})
await emitWorkspaceEvent({
eventName: WorkspaceEvents.RoleUpdated,
payload: { userId, workspaceId, role }
})
}