2c122a138d
* 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>
67 lines
2.0 KiB
TypeScript
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 })
|
|
}
|