Files
speckle-server/packages/server/modules/workspaces/services/regions.ts
T
Chuck Driesler c382064585 feat(regions): move project branches and commits (#3843)
* feat(regions): repo functions for copying project branches and commits

* chore(regions): wire up move to resolver

* chore(regions): successful basic test of project region change

* fix(regions): sabrina carpenter please please please

* fix(regions): repair multiregion test setup

* chore(regions): appease ts

* chore(multiregion): update test multiregion config

* chore(multiregion): fix test docker config and test

* chore(multiregion): use transaction

* chore(multiregion): maybe this will work

* fix(multiregion): drop subs synchronously

* chore(multiregion): desperate test logs

* chore(multiregion): somehow that worked?

* chore(multiregion): add load-bearing log statement

* chore(multiregion): move services

* fix(multiregion): test drop waits

* chore(regions): fix import

* chore(regions): make test a bit more thorough for good measure

* fix(regions): speed up inserts

* fix(regions): ignore workspace conflict on move
2025-02-13 14:39:23 +00:00

72 lines
2.1 KiB
TypeScript

import { WorkspaceFeatureAccessFunction } from '@/modules/gatekeeper/domain/operations'
import { GetRegions } from '@/modules/multiregion/domain/operations'
import {
AssignWorkspaceRegion,
GetAvailableRegions,
GetDefaultRegion,
GetWorkspace,
UpsertRegionAssignment,
UpsertWorkspace
} 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
insertRegionWorkspace: UpsertWorkspace
}): 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 })
// Copy workspace into region db
await deps.insertRegionWorkspace({ workspace })
}