UNPKG

@directus/api

Version:

Directus is a real-time API and App dashboard for managing SQL database content

63 lines (62 loc) 2.58 kB
import { useEnv } from '@directus/env'; import getDatabase, { hasDatabaseConnection, isInstalled, validateDatabaseConnection, } from '../../../database/index.js'; import runMigrations from '../../../database/migrations/run.js'; import installDatabase from '../../../database/seeds/run.js'; import { useLogger } from '../../../logger/index.js'; import { SettingsService } from '../../../services/settings.js'; import { getSchema } from '../../../utils/get-schema.js'; import { createAdmin } from '../../../utils/create-admin.js'; import { email } from 'zod'; export default async function bootstrap({ skipAdminInit }) { const logger = useLogger(); logger.info('Initializing bootstrap...'); const env = useEnv(); const database = getDatabase(); await waitForDatabase(database); if ((await isInstalled()) === false) { logger.info('Installing Directus system tables...'); await installDatabase(database); logger.info('Running migrations...'); await runMigrations(database, 'latest'); const schema = await getSchema(); if (skipAdminInit == null) { await createAdmin(schema); } else { logger.info('Skipping creation of default Admin user and role...'); } const settingsService = new SettingsService({ schema }); if (env['PROJECT_NAME'] && typeof env['PROJECT_NAME'] === 'string' && env['PROJECT_NAME'].length > 0) { await settingsService.upsertSingleton({ project_name: env['PROJECT_NAME'] }); } if (email().safeParse(env['PROJECT_OWNER']).success) { await settingsService.setOwner({ project_owner: env['PROJECT_OWNER'], org_name: null, project_usage: null, product_updates: false, }); } } else { logger.info('Database already initialized, skipping install'); logger.info('Running migrations...'); await runMigrations(database, 'latest'); } await database.destroy(); logger.info('Done'); process.exit(0); } async function waitForDatabase(database) { const tries = 5; const secondsBetweenTries = 5; for (let i = 0; i < tries; i++) { if (await hasDatabaseConnection(database)) { return true; } await new Promise((resolve) => setTimeout(resolve, secondsBetweenTries * 1000)); } // This will throw and exit the process if the database is not available await validateDatabaseConnection(database); return database; }