/* eslint-disable no-console */ require('dotenv').config(); const { PrismaClient } = require('@prisma/client'); const chalk = require('chalk'); const { execSync } = require('child_process'); const semver = require('semver'); if (process.env.SKIP_DB_CHECK) { console.log('Skipping database check.'); process.exit(0); } function getDatabaseType(url = process.env.DATABASE_URL) { const type = process.env.DATABASE_TYPE || (url && url.split(':')[0]); if (type === 'postgres') { return 'postgresql'; } else if (type === 'mongodb+srv') { return 'mongodb'; } return type; } const databaseType = getDatabaseType(); const prisma = new PrismaClient(); function success(msg) { console.log(chalk.greenBright(`✓ ${msg}`)); } function error(msg) { console.log(chalk.redBright(`✗ ${msg}`)); } async function checkEnv() { if (!process.env.DATABASE_URL) { throw new Error('DATABASE_URL is not defined.'); } else { success('DATABASE_URL is defined.'); } } async function checkConnection() { try { await prisma.$connect(); success('Database connection successful.'); } catch (e) { throw new Error('Unable to connect to the database.'); } } async function checkDatabaseVersion(databaseType) { let version; if (databaseType === 'mongodb') { const query = await prisma.$runCommandRaw({ buildInfo: 1, }); version = semver.valid(query.version); } else { const query = await prisma.$queryRaw`select version() as version`; version = semver.valid(semver.coerce(query[0].version)); } const minVersion = databaseType === 'postgresql' ? '9.4.0' : databaseType === 'mongodb' ? '3.0.0' : '5.7.0'; if (semver.lt(version, minVersion)) { throw new Error( `Database version is not compatible. Please upgrade ${databaseType} version to ${minVersion} or greater`, ); } success('Database version check successful.'); } async function checkV1Tables() { if (databaseType === 'mongodb') { // Ignore return; } try { await prisma.$queryRaw`select * from account limit 1`; error( 'Umami v1 tables detected. For how to upgrade from v1 to v2 go to https://umami.is/docs/migrate-v1-v2.', ); process.exit(1); } catch (e) { // Ignore } } async function applyMigration() { if (databaseType === 'mongodb') { console.log(execSync('prisma db push').toString()); } else { console.log(execSync('prisma migrate deploy').toString()); } success('Database is up to date.'); } (async () => { let err = false; for (let fn of [checkEnv, checkConnection, checkDatabaseVersion, checkV1Tables, applyMigration]) { try { fn.name === 'checkDatabaseVersion' ? await fn(databaseType) : await fn(); } catch (e) { error(e.message); err = true; } finally { await prisma.$disconnect(); if (err) { process.exit(1); } } } })();