882391b5e1
* 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
71 lines
1.9 KiB
TypeScript
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
|
|
}
|