feat(regions): trigger project move with job (#4010)

This commit is contained in:
Chuck Driesler
2025-03-07 09:18:12 +00:00
committed by GitHub
parent 92dd2e7b85
commit 9f83d1f74e
11 changed files with 311 additions and 123 deletions
@@ -2,24 +2,13 @@ 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 { getDb } 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,
copyProjectCommentsFactory,
copyProjectBlobs,
copyProjectModelsFactory,
copyProjectObjectsFactory,
copyProjectsFactory,
copyProjectVersionsFactory,
copyProjectWebhooksFactory,
copyWorkspaceFactory
} from '@/modules/workspaces/repositories/projectRegions'
import {
getWorkspaceFactory,
upsertWorkspaceFactory
@@ -28,32 +17,10 @@ import {
assignWorkspaceRegionFactory,
getAvailableRegionsFactory
} from '@/modules/workspaces/services/regions'
import {
updateProjectRegionFactory,
validateProjectRegionCopyFactory
} 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'
import { getStreamCommentCountFactory } from '@/modules/comments/repositories/comments'
import { getStreamWebhooksFactory } from '@/modules/webhooks/repositories/webhooks'
import {
getProjectObjectStorage,
getRegionObjectStorage
} from '@/modules/multiregion/utils/blobStorageSelector'
import { updateProjectRegionKeyFactory } from '@/modules/multiregion/services/projectRegion'
import {
deleteRegionKeyFromCacheFactory,
upsertProjectRegionKeyFactory
} from '@/modules/multiregion/repositories/projectRegion'
import { getGenericRedis } from '@/modules/shared/redis/redis'
import { getEventBus } from '@/modules/shared/services/eventBus'
import { scheduleJob } from '@/modules/multiregion/services/queue'
const { FF_MOVE_PROJECT_REGION_ENABLED } = getFeatureFlags()
@@ -105,57 +72,13 @@ export default {
context.resourceAccessRules
)
const sourceDb = await getProjectDbClient({ projectId: args.projectId })
const sourceObjectStorage = await getProjectObjectStorage({
projectId: args.projectId
return await scheduleJob({
type: 'move-project-region',
payload: {
projectId: args.projectId,
regionKey: args.regionKey
}
})
const targetDb = await (await getDb({ regionKey: args.regionKey })).transaction()
const targetObjectStorage = await getRegionObjectStorage({
regionKey: args.regionKey
})
const updateProjectRegion = updateProjectRegionFactory({
getProject: getProjectFactory({ 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 }),
copyProjectComments: copyProjectCommentsFactory({ sourceDb, targetDb }),
copyProjectWebhooks: copyProjectWebhooksFactory({ sourceDb, targetDb }),
copyProjectBlobs: copyProjectBlobs({
sourceDb,
sourceObjectStorage,
targetDb,
targetObjectStorage
}),
validateProjectRegionCopy: validateProjectRegionCopyFactory({
countProjectModels: getStreamBranchCountFactory({ db: sourceDb }),
countProjectVersions: getStreamCommitCountFactory({ db: sourceDb }),
countProjectObjects: getStreamObjectCountFactory({ db: sourceDb }),
countProjectAutomations: getProjectAutomationsTotalCountFactory({
db: sourceDb
}),
countProjectComments: getStreamCommentCountFactory({ db: sourceDb }),
getProjectWebhooks: getStreamWebhooksFactory({ db: sourceDb })
}),
updateProjectRegionKey: updateProjectRegionKeyFactory({
upsertProjectRegionKey: upsertProjectRegionKeyFactory({ db }),
cacheDeleteRegionKey: deleteRegionKeyFromCacheFactory({
redis: getGenericRedis()
}),
emitEvent: getEventBus().emit
})
})
return await withTransaction(updateProjectRegion(args), targetDb)
}
}
} as Resolvers