c382064585
* 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
72 lines
2.1 KiB
TypeScript
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 })
|
|
}
|