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
This commit is contained in:
@@ -2,22 +2,37 @@ 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 } from '@/modules/multiregion/utils/dbSelector'
|
||||
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 {
|
||||
copyProjectModelsFactory,
|
||||
copyProjectsFactory,
|
||||
copyProjectVersionsFactory,
|
||||
copyWorkspaceFactory
|
||||
} from '@/modules/workspaces/repositories/projectRegions'
|
||||
import {
|
||||
getWorkspaceFactory,
|
||||
upsertWorkspaceFactory
|
||||
} from '@/modules/workspaces/repositories/workspaces'
|
||||
import {
|
||||
assignRegionFactory,
|
||||
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 { getFeatureFlags, isTestEnv } from '@/modules/shared/helpers/envHelper'
|
||||
import { WorkspacesNotYetImplementedError } from '@/modules/workspaces/errors/workspace'
|
||||
|
||||
const { FF_MOVE_PROJECT_REGION_ENABLED } = getFeatureFlags()
|
||||
|
||||
export default {
|
||||
Workspace: {
|
||||
@@ -37,7 +52,7 @@ export default {
|
||||
|
||||
const regionDb = await getDb({ regionKey: args.regionKey })
|
||||
|
||||
const assignRegion = assignRegionFactory({
|
||||
const assignRegion = assignWorkspaceRegionFactory({
|
||||
getAvailableRegions: getAvailableRegionsFactory({
|
||||
getRegions: getRegionsFactory({ db }),
|
||||
canWorkspaceUseRegions: canWorkspaceUseRegionsFactory({
|
||||
@@ -53,5 +68,40 @@ export default {
|
||||
|
||||
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 }),
|
||||
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 })
|
||||
})
|
||||
|
||||
return await withTransaction(updateProjectRegion(args), targetDb)
|
||||
}
|
||||
}
|
||||
} as Resolvers
|
||||
|
||||
Reference in New Issue
Block a user