Files
speckle-server/packages/server/modules/workspaces/services/regions.ts
T
Daniel Gak Anagrov 2c122a138d feat(workspaces): apply prepared transactions to workspaces (#5383)
* feat(multiregion): replace user replication

* chore(multiregion): optimise replication

* maybe it's this

* postgres is fun

* once more

* chore(multiregion): only replicate test user creation during multiregion tests

* feat: improved replicate_query logic

* fix: minor

* fix: starting issue

* feat: included user create and delete specs to multiregion

* feat: removed console logs

* fix: user defaults

* fix: multiregion test helper

* fix: update scenarios for users

* refactor(multiregion): swap replicateQuery concept to asMultiregionOperation (#5301)

feat(multiregion): introduced asMultregionOperator, refactor test to user builder classes

* chore: renamings

* fix: remove comments

* feat: remove user replication

* refactor: simplified spec usages

* chore: comments

* chore: branches and favs

* chore: more tests

* chore: more tests

* fix linting

* fix tests

* feat: dropping replication

* refactor: moved project delete to service

* fix: comment

* feat: updateStreamFactory and updateProjectFacotry

* deleteProjectFactory + replicateFactory

* deleteWorkspaceFactory

* fix: selector

* fix: tests

* fix tests, finished createStreamFactory

* feat: simplify changes

* fix: remove comment

* fix: minor strucutres

* fix: moveProjectToRegion

* fix: moved branch creation outside of multiregion scope

* fix: branch creation

* fix: tests

* fix: ci tests

* fix: removed log form test

* fix: on specs, no random regionKeys

* review fixes

* feat: workspace replciation

* fix: mr comments

* feat: removed test

* fix: worksapce test creation

* fix: mr issues

* updated mutations

* feat: drop workspace random defaults

---------

Co-authored-by: Charles Driesler <chuck@speckle.systems>
2025-09-11 10:08:26 +02:00

67 lines
2.0 KiB
TypeScript

import type { WorkspaceFeatureAccessFunction } from '@/modules/gatekeeper/domain/operations'
import type { GetRegions } from '@/modules/multiregion/domain/operations'
import type {
AssignWorkspaceRegion,
GetAvailableRegions,
GetDefaultRegion,
GetWorkspace,
UpsertRegionAssignment
} from '@/modules/workspaces/domain/operations'
import { WorkspaceRegionAssignmentError } from '@/modules/workspaces/errors/regions'
export const getAvailableRegionsFactory =
(deps: {
getRegions: GetRegions
canWorkspaceUseRegions: WorkspaceFeatureAccessFunction
}): GetAvailableRegions =>
async (params) => {
const { workspaceId } = params
const canUseMultiRegion = await deps.canWorkspaceUseRegions({ workspaceId })
if (!canUseMultiRegion) {
return []
}
return await deps.getRegions()
}
export const assignWorkspaceRegionFactory =
(deps: {
getAvailableRegions: GetAvailableRegions
upsertRegionAssignment: UpsertRegionAssignment
getDefaultRegion: GetDefaultRegion
getWorkspace: GetWorkspace
}): AssignWorkspaceRegion =>
async (params) => {
const { workspaceId, regionKey } = params
const workspace = await deps.getWorkspace({ workspaceId })
if (!workspace) {
throw new WorkspaceRegionAssignmentError('Workspace not found', {
info: { params }
})
}
const availableRegions = await deps.getAvailableRegions({ workspaceId })
if (!availableRegions.find((region) => region.key === regionKey)) {
throw new WorkspaceRegionAssignmentError(
'Specified region not available for workspace',
{
info: { params }
}
)
}
const existingRegion = await deps.getDefaultRegion({ workspaceId })
if (existingRegion) {
throw new WorkspaceRegionAssignmentError(
'Workspace already has a region assigned',
{
info: { params }
}
)
}
// Set up region
await deps.upsertRegionAssignment({ workspaceId, regionKey })
}