Files
speckle-server/packages/server/modules/cli/commands/stream/clone.ts
T
Daniel Gak Anagrov 399c998fd7 feat(multiregion): apply prepared transactions to projects (#5322)
* 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

* fix: mr comments

* feat: removed test

---------

Co-authored-by: Charles Driesler <chuck@speckle.systems>
2025-09-04 13:07:19 +02:00

89 lines
3.2 KiB
TypeScript

import { cliLogger as logger } from '@/observability/logging'
import {
getBatchedStreamCommentsFactory,
getCommentLinksFactory,
insertCommentLinksFactory,
insertCommentsFactory
} from '@/modules/comments/repositories/comments'
import {
getBatchedStreamBranchesFactory,
insertBranchesFactory
} from '@/modules/core/repositories/branches'
import {
getBatchedBranchCommitsFactory,
getBatchedStreamCommitsFactory,
insertBranchCommitsFactory,
insertCommitsFactory,
insertStreamCommitsFactory
} from '@/modules/core/repositories/commits'
import {
createStreamFactory,
getStreamFactory
} from '@/modules/core/repositories/streams'
import { getUserFactory } from '@/modules/core/repositories/users'
import { cloneStreamFactory } from '@/modules/core/services/streams/clone'
import type { CommandModule } from 'yargs'
import { asMultiregionalOperation, replicateFactory } from '@/modules/shared/command'
import { storeProjectRoleFactory } from '@/modules/core/repositories/projects'
import { db } from '@/db/knex'
const command: CommandModule<
unknown,
{ sourceStreamId: string; targetUserId: string }
> = {
command: 'clone <sourceStreamId> <targetUserId>',
describe: 'Clone a source stream to the account of the target user',
builder: {
sourceStreamId: {
describe: 'ID of the stream that will be cloned',
type: 'string'
},
targetUserId: {
describe: 'ID of the user who will be marked as the author of the cloned stream',
type: 'string'
}
},
handler: async (argv) => {
const { sourceStreamId, targetUserId } = argv
logger.info(
`Cloning stream ${sourceStreamId} into the account of user ${targetUserId}...`
)
const { id } = await asMultiregionalOperation(
({ emit, mainDb, allDbs }) => {
const cloneStream = cloneStreamFactory({
getStream: getStreamFactory({ db: mainDb }),
getUser: getUserFactory({ db: mainDb }),
newProjectDb: mainDb,
sourceProjectDb: mainDb,
createStream: replicateFactory(allDbs, createStreamFactory),
insertCommits: insertCommitsFactory({ db: mainDb }),
getBatchedStreamCommits: getBatchedStreamCommitsFactory({ db: mainDb }),
insertStreamCommits: insertStreamCommitsFactory({ db: mainDb }),
getBatchedStreamBranches: getBatchedStreamBranchesFactory({ db: mainDb }),
insertBranches: insertBranchesFactory({ db: mainDb }),
getBatchedBranchCommits: getBatchedBranchCommitsFactory({ db: mainDb }),
insertBranchCommits: insertBranchCommitsFactory({ db: mainDb }),
getBatchedStreamComments: getBatchedStreamCommentsFactory({ db: mainDb }),
insertComments: insertCommentsFactory({ db: mainDb }),
getCommentLinks: getCommentLinksFactory({ db: mainDb }),
insertCommentLinks: insertCommentLinksFactory({ db: mainDb }),
emitEvent: emit,
storeProjectRole: storeProjectRoleFactory({ db: mainDb })
})
return cloneStream(targetUserId, sourceStreamId)
},
{
name: 'Clone Stream',
dbs: [db], // Cloning does not support multiregion
logger
}
)
logger.info('Cloning successful! New stream ID: ' + id)
}
}
export = command