chore(server): cross-server-sync IoC Part 3 (#2909)
This commit is contained in:
committed by
GitHub
parent
f53bdd6505
commit
aab9bdcd66
@@ -7,8 +7,11 @@ import { cloneStream } from '@/modules/core/services/streams/clone'
|
||||
import { StreamRecord } from '@/modules/core/helpers/types'
|
||||
import { logger } from '@/logging/logging'
|
||||
import { createStreamReturnRecord } from '@/modules/core/services/streams/management'
|
||||
import { getOnboardingBaseProject } from '@/modules/cross-server-sync/services/onboardingProject'
|
||||
import { updateStream } from '@/modules/core/repositories/streams'
|
||||
import { getOnboardingBaseProjectFactory } from '@/modules/cross-server-sync/services/onboardingProject'
|
||||
import {
|
||||
getOnboardingBaseStream,
|
||||
updateStream
|
||||
} from '@/modules/core/repositories/streams'
|
||||
import { getUser } from '@/modules/core/services/users'
|
||||
import {
|
||||
ContextResourceAccessRules,
|
||||
@@ -30,7 +33,9 @@ export async function createOnboardingStream(
|
||||
)
|
||||
}
|
||||
|
||||
const sourceStream = await getOnboardingBaseProject()
|
||||
const sourceStream = await getOnboardingBaseProjectFactory({
|
||||
getOnboardingBaseStream
|
||||
})()
|
||||
// clone from base
|
||||
let newStream: Optional<StreamRecord> = undefined
|
||||
if (sourceStream) {
|
||||
|
||||
@@ -64,3 +64,6 @@ export type DownloadProject = (
|
||||
projectId: string
|
||||
project: StreamRecord
|
||||
}>
|
||||
|
||||
export type GetOnboardingBaseProject = () => Promise<StreamRecord | undefined>
|
||||
export type EnsureOnboardingProject = () => Promise<StreamRecord | undefined>
|
||||
|
||||
@@ -1,5 +1,24 @@
|
||||
import { moduleLogger, crossServerSyncLogger } from '@/logging/logging'
|
||||
import { ensureOnboardingProject } from '@/modules/cross-server-sync/services/onboardingProject'
|
||||
import {
|
||||
createCommentReplyAndNotify,
|
||||
createCommentThreadAndNotify
|
||||
} from '@/modules/comments/services/management'
|
||||
import { getStreamBranchByName } from '@/modules/core/repositories/branches'
|
||||
import { getObject } from '@/modules/core/repositories/objects'
|
||||
import {
|
||||
getOnboardingBaseStream,
|
||||
getStream,
|
||||
getStreamCollaborators,
|
||||
markOnboardingBaseStream
|
||||
} from '@/modules/core/repositories/streams'
|
||||
import { getFirstAdmin, getUser } from '@/modules/core/repositories/users'
|
||||
import { createBranchAndNotify } from '@/modules/core/services/branch/management'
|
||||
import { createCommitByBranchId } from '@/modules/core/services/commit/management'
|
||||
import { createObject } from '@/modules/core/services/objects'
|
||||
import { createStreamReturnRecord } from '@/modules/core/services/streams/management'
|
||||
import { downloadCommitFactory } from '@/modules/cross-server-sync/services/commit'
|
||||
import { ensureOnboardingProjectFactory } from '@/modules/cross-server-sync/services/onboardingProject'
|
||||
import { downloadProjectFactory } from '@/modules/cross-server-sync/services/project'
|
||||
import { SpeckleModule } from '@/modules/shared/helpers/typeHelper'
|
||||
|
||||
const crossServerSyncModule: SpeckleModule = {
|
||||
@@ -8,6 +27,29 @@ const crossServerSyncModule: SpeckleModule = {
|
||||
},
|
||||
finalize() {
|
||||
crossServerSyncLogger.info('⬇️ Ensuring base onboarding stream asynchronously...')
|
||||
const ensureOnboardingProject = ensureOnboardingProjectFactory({
|
||||
getOnboardingBaseStream,
|
||||
getFirstAdmin,
|
||||
downloadProject: downloadProjectFactory({
|
||||
downloadCommit: downloadCommitFactory({
|
||||
getStream,
|
||||
getStreamBranchByName,
|
||||
getStreamCollaborators,
|
||||
getUser,
|
||||
createCommitByBranchId,
|
||||
createObject,
|
||||
getObject,
|
||||
createCommentThreadAndNotify,
|
||||
createCommentReplyAndNotify
|
||||
}),
|
||||
createStreamReturnRecord,
|
||||
getUser,
|
||||
getStreamBranchByName,
|
||||
createBranchAndNotify
|
||||
}),
|
||||
markOnboardingBaseStream
|
||||
})
|
||||
|
||||
void ensureOnboardingProject().catch((err) =>
|
||||
crossServerSyncLogger.error(err, 'Error ensuring onboarding stream')
|
||||
)
|
||||
|
||||
@@ -1,23 +1,14 @@
|
||||
import { crossServerSyncLogger } from '@/logging/logging'
|
||||
import {
|
||||
createCommentReplyAndNotify,
|
||||
createCommentThreadAndNotify
|
||||
} from '@/modules/comments/services/management'
|
||||
import { getStreamBranchByName } from '@/modules/core/repositories/branches'
|
||||
import { getObject } from '@/modules/core/repositories/objects'
|
||||
import {
|
||||
getOnboardingBaseStream,
|
||||
getStream,
|
||||
getStreamCollaborators,
|
||||
markOnboardingBaseStream
|
||||
} from '@/modules/core/repositories/streams'
|
||||
import { getFirstAdmin, getUser } from '@/modules/core/repositories/users'
|
||||
import { createBranchAndNotify } from '@/modules/core/services/branch/management'
|
||||
import { createCommitByBranchId } from '@/modules/core/services/commit/management'
|
||||
import { createObject } from '@/modules/core/services/objects'
|
||||
import { createStreamReturnRecord } from '@/modules/core/services/streams/management'
|
||||
import { downloadCommitFactory } from '@/modules/cross-server-sync/services/commit'
|
||||
import { downloadProjectFactory } from '@/modules/cross-server-sync/services/project'
|
||||
import { getFirstAdmin } from '@/modules/core/repositories/users'
|
||||
import {
|
||||
DownloadProject,
|
||||
EnsureOnboardingProject,
|
||||
GetOnboardingBaseProject
|
||||
} from '@/modules/cross-server-sync/domain/operations'
|
||||
import {
|
||||
getOnboardingStreamCacheBustNumber,
|
||||
getOnboardingStreamUrl
|
||||
@@ -32,70 +23,64 @@ const getMetadata = () => {
|
||||
return { url, cacheBustNumber, version }
|
||||
}
|
||||
|
||||
export async function getOnboardingBaseProject() {
|
||||
const metadata = getMetadata()
|
||||
if (!metadata) {
|
||||
return undefined
|
||||
export const getOnboardingBaseProjectFactory =
|
||||
(deps: {
|
||||
getOnboardingBaseStream: typeof getOnboardingBaseStream
|
||||
}): GetOnboardingBaseProject =>
|
||||
async () => {
|
||||
const metadata = getMetadata()
|
||||
if (!metadata) {
|
||||
return undefined
|
||||
}
|
||||
|
||||
return await deps.getOnboardingBaseStream(metadata.version)
|
||||
}
|
||||
|
||||
return await getOnboardingBaseStream(metadata.version)
|
||||
}
|
||||
export const ensureOnboardingProjectFactory =
|
||||
(deps: {
|
||||
getOnboardingBaseStream: typeof getOnboardingBaseStream
|
||||
getFirstAdmin: typeof getFirstAdmin
|
||||
downloadProject: DownloadProject
|
||||
markOnboardingBaseStream: typeof markOnboardingBaseStream
|
||||
}): EnsureOnboardingProject =>
|
||||
async () => {
|
||||
const logger = crossServerSyncLogger
|
||||
logger.info('Ensuring onboarding project is present...')
|
||||
|
||||
export async function ensureOnboardingProject() {
|
||||
const logger = crossServerSyncLogger
|
||||
logger.info('Ensuring onboarding project is present...')
|
||||
const metadata = getMetadata()
|
||||
if (!metadata) {
|
||||
logger.info('No base onboarding stream configured through env vars...')
|
||||
return undefined
|
||||
}
|
||||
|
||||
const metadata = getMetadata()
|
||||
if (!metadata) {
|
||||
logger.info('No base onboarding stream configured through env vars...')
|
||||
return undefined
|
||||
const [existingStream, admin] = await Promise.all([
|
||||
deps.getOnboardingBaseStream(metadata.version),
|
||||
deps.getFirstAdmin()
|
||||
])
|
||||
if (existingStream) {
|
||||
logger.info('Onboarding stream already exists, skipping...')
|
||||
return existingStream
|
||||
}
|
||||
if (!admin) {
|
||||
logger.info('No admin user found, skipping onboarding stream creation...')
|
||||
return undefined
|
||||
}
|
||||
|
||||
logger.info('Onboarding stream not found, pulling from target server...')
|
||||
|
||||
const res = await deps.downloadProject(
|
||||
{
|
||||
projectUrl: metadata.url,
|
||||
authorId: admin.id,
|
||||
syncComments: true
|
||||
},
|
||||
{ logger }
|
||||
)
|
||||
|
||||
logger.info('Marking stream as onboarding base...')
|
||||
await deps.markOnboardingBaseStream(res.projectId, metadata.version)
|
||||
|
||||
logger.info('Onboarding base stream created successfully!')
|
||||
|
||||
return res.project
|
||||
}
|
||||
|
||||
const [existingStream, admin] = await Promise.all([
|
||||
getOnboardingBaseStream(metadata.version),
|
||||
getFirstAdmin()
|
||||
])
|
||||
if (existingStream) {
|
||||
logger.info('Onboarding stream already exists, skipping...')
|
||||
return existingStream
|
||||
}
|
||||
if (!admin) {
|
||||
logger.info('No admin user found, skipping onboarding stream creation...')
|
||||
return undefined
|
||||
}
|
||||
|
||||
logger.info('Onboarding stream not found, pulling from target server...')
|
||||
|
||||
const downloadProject = downloadProjectFactory({
|
||||
downloadCommit: downloadCommitFactory({
|
||||
getStream,
|
||||
getStreamBranchByName,
|
||||
getStreamCollaborators,
|
||||
getUser,
|
||||
createCommitByBranchId,
|
||||
createObject,
|
||||
getObject,
|
||||
createCommentThreadAndNotify,
|
||||
createCommentReplyAndNotify
|
||||
}),
|
||||
createStreamReturnRecord,
|
||||
getUser,
|
||||
getStreamBranchByName,
|
||||
createBranchAndNotify
|
||||
})
|
||||
const res = await downloadProject(
|
||||
{
|
||||
projectUrl: metadata.url,
|
||||
authorId: admin.id,
|
||||
syncComments: true
|
||||
},
|
||||
{ logger }
|
||||
)
|
||||
|
||||
logger.info('Marking stream as onboarding base...')
|
||||
await markOnboardingBaseStream(res.projectId, metadata.version)
|
||||
|
||||
logger.info('Onboarding base stream created successfully!')
|
||||
|
||||
return res.project
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user