86c113b29b
* 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): move project objects * chore(regions): add tests for object move * feat(regions): move project automations * chore(regions): add tests for moving automations * chore(regions): more tests for moving automate data * fix(regions): speed up inserts * fix(regions): simplify postgres usage * chore(regions): repair build * fix(regions): improve queries * chore(regions): again
118 lines
4.9 KiB
TypeScript
118 lines
4.9 KiB
TypeScript
import { db } from '@/db/knex'
|
|
import { Resolvers } from '@/modules/core/graph/generated/graphql'
|
|
import { getWorkspacePlanFactory } from '@/modules/gatekeeper/repositories/billing'
|
|
import { canWorkspaceUseRegionsFactory } from '@/modules/gatekeeper/services/featureAuthorization'
|
|
import { getDb, getProjectDbClient } from '@/modules/multiregion/utils/dbSelector'
|
|
import { getRegionsFactory } from '@/modules/multiregion/repositories'
|
|
import { authorizeResolver } from '@/modules/shared'
|
|
import {
|
|
getDefaultRegionFactory,
|
|
upsertRegionAssignmentFactory
|
|
} from '@/modules/workspaces/repositories/regions'
|
|
import {
|
|
copyProjectAutomationsFactory,
|
|
copyProjectModelsFactory,
|
|
copyProjectObjectsFactory,
|
|
copyProjectsFactory,
|
|
copyProjectVersionsFactory,
|
|
copyWorkspaceFactory
|
|
} from '@/modules/workspaces/repositories/projectRegions'
|
|
import {
|
|
getWorkspaceFactory,
|
|
upsertWorkspaceFactory
|
|
} from '@/modules/workspaces/repositories/workspaces'
|
|
import {
|
|
assignWorkspaceRegionFactory,
|
|
getAvailableRegionsFactory
|
|
} from '@/modules/workspaces/services/regions'
|
|
import { updateProjectRegionFactory } from '@/modules/workspaces/services/projectRegions'
|
|
import { Roles } from '@speckle/shared'
|
|
import { getProjectFactory } from '@/modules/core/repositories/projects'
|
|
import { getStreamBranchCountFactory } from '@/modules/core/repositories/branches'
|
|
import { getStreamCommitCountFactory } from '@/modules/core/repositories/commits'
|
|
import { withTransaction } from '@/modules/shared/helpers/dbHelper'
|
|
import { getStreamObjectCountFactory } from '@/modules/core/repositories/objects'
|
|
import { getProjectAutomationsTotalCountFactory } from '@/modules/automate/repositories/automations'
|
|
import { getFeatureFlags, isTestEnv } from '@/modules/shared/helpers/envHelper'
|
|
import { WorkspacesNotYetImplementedError } from '@/modules/workspaces/errors/workspace'
|
|
|
|
const { FF_MOVE_PROJECT_REGION_ENABLED } = getFeatureFlags()
|
|
|
|
export default {
|
|
Workspace: {
|
|
defaultRegion: async (parent) => {
|
|
const getDefaultRegion = getDefaultRegionFactory({ db })
|
|
return await getDefaultRegion({ workspaceId: parent.id })
|
|
}
|
|
},
|
|
WorkspaceMutations: {
|
|
setDefaultRegion: async (_parent, args, ctx) => {
|
|
await authorizeResolver(
|
|
ctx.userId,
|
|
args.workspaceId,
|
|
Roles.Workspace.Admin,
|
|
ctx.resourceAccessRules
|
|
)
|
|
|
|
const regionDb = await getDb({ regionKey: args.regionKey })
|
|
|
|
const assignRegion = assignWorkspaceRegionFactory({
|
|
getAvailableRegions: getAvailableRegionsFactory({
|
|
getRegions: getRegionsFactory({ db }),
|
|
canWorkspaceUseRegions: canWorkspaceUseRegionsFactory({
|
|
getWorkspacePlan: getWorkspacePlanFactory({ db })
|
|
})
|
|
}),
|
|
upsertRegionAssignment: upsertRegionAssignmentFactory({ db }),
|
|
getDefaultRegion: getDefaultRegionFactory({ db }),
|
|
getWorkspace: getWorkspaceFactory({ db }),
|
|
insertRegionWorkspace: upsertWorkspaceFactory({ db: regionDb })
|
|
})
|
|
await assignRegion({ workspaceId: args.workspaceId, regionKey: args.regionKey })
|
|
|
|
return await ctx.loaders.workspaces!.getWorkspace.load(args.workspaceId)
|
|
}
|
|
},
|
|
WorkspaceProjectMutations: {
|
|
moveToRegion: async (_parent, args, context) => {
|
|
if (!FF_MOVE_PROJECT_REGION_ENABLED && !isTestEnv()) {
|
|
throw new WorkspacesNotYetImplementedError()
|
|
}
|
|
|
|
await authorizeResolver(
|
|
context.userId,
|
|
args.projectId,
|
|
Roles.Stream.Owner,
|
|
context.resourceAccessRules
|
|
)
|
|
|
|
const sourceDb = await getProjectDbClient({ projectId: args.projectId })
|
|
const targetDb = await (await getDb({ regionKey: args.regionKey })).transaction()
|
|
|
|
const updateProjectRegion = updateProjectRegionFactory({
|
|
getProject: getProjectFactory({ db: sourceDb }),
|
|
countProjectModels: getStreamBranchCountFactory({ db: sourceDb }),
|
|
countProjectVersions: getStreamCommitCountFactory({ db: sourceDb }),
|
|
countProjectObjects: getStreamObjectCountFactory({ db: sourceDb }),
|
|
countProjectAutomations: getProjectAutomationsTotalCountFactory({
|
|
db: sourceDb
|
|
}),
|
|
getAvailableRegions: getAvailableRegionsFactory({
|
|
getRegions: getRegionsFactory({ db }),
|
|
canWorkspaceUseRegions: canWorkspaceUseRegionsFactory({
|
|
getWorkspacePlan: getWorkspacePlanFactory({ db })
|
|
})
|
|
}),
|
|
copyWorkspace: copyWorkspaceFactory({ sourceDb, targetDb }),
|
|
copyProjects: copyProjectsFactory({ sourceDb, targetDb }),
|
|
copyProjectModels: copyProjectModelsFactory({ sourceDb, targetDb }),
|
|
copyProjectVersions: copyProjectVersionsFactory({ sourceDb, targetDb }),
|
|
copyProjectObjects: copyProjectObjectsFactory({ sourceDb, targetDb }),
|
|
copyProjectAutomations: copyProjectAutomationsFactory({ sourceDb, targetDb })
|
|
})
|
|
|
|
return await withTransaction(updateProjectRegion(args), targetDb)
|
|
}
|
|
}
|
|
} as Resolvers
|