Files
speckle-server/packages/server/modules/cross-server-sync/services/onboardingProject.ts
T
Dimitrie Stefanescu 882391b5e1 Onboarding Speedup (#1855)
* feat(onboarding): ensures an onboarding project is always cloned when a user goes through onboarding; simplifies some of the logic & updates project naming

* feat(onboarding): improves onboarding stream cloning performance by optimising object duplication (local tests: from 25s to 270ms)

* feat(onboarding): minor changes logging + comments

* feat(onboarding): removes comments
2023-11-08 13:03:10 +00:00

71 lines
1.9 KiB
TypeScript

import { crossServerSyncLogger } from '@/logging/logging'
import {
getOnboardingBaseStream,
markOnboardingBaseStream
} from '@/modules/core/repositories/streams'
import { getFirstAdmin } from '@/modules/core/repositories/users'
import { downloadProject } from '@/modules/cross-server-sync/services/project'
import {
getOnboardingStreamCacheBustNumber,
getOnboardingStreamUrl
} from '@/modules/shared/helpers/envHelper'
const getMetadata = () => {
const url = getOnboardingStreamUrl()
const cacheBustNumber = getOnboardingStreamCacheBustNumber()
if (!url) return null
const version = `${url}:::${cacheBustNumber}`
return { url, cacheBustNumber, version }
}
export async function getOnboardingBaseProject() {
const metadata = getMetadata()
if (!metadata) {
return undefined
}
return await getOnboardingBaseStream(metadata.version)
}
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 [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 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
}