66 lines
1.6 KiB
JavaScript
66 lines
1.6 KiB
JavaScript
|
const { DocumentTypes } = require("../db/constants")
|
||
|
const { getGlobalDB } = require("../tenancy")
|
||
|
|
||
|
exports.MIGRATION_DBS = {
|
||
|
GLOBAL_DB: "GLOBAL_DB",
|
||
|
}
|
||
|
|
||
|
exports.MIGRATIONS = {
|
||
|
USER_EMAIL_VIEW_CASING: "user_email_view_casing",
|
||
|
}
|
||
|
|
||
|
const DB_LOOKUP = {
|
||
|
[exports.MIGRATION_DBS.GLOBAL_DB]: [
|
||
|
exports.MIGRATIONS.USER_EMAIL_VIEW_CASING,
|
||
|
],
|
||
|
}
|
||
|
|
||
|
const getMigrationsDoc = async db => {
|
||
|
// get the migrations doc
|
||
|
try {
|
||
|
return await db.get(DocumentTypes.MIGRATIONS)
|
||
|
} catch (err) {
|
||
|
if (err.status && err.status === 404) {
|
||
|
return { _id: DocumentTypes.MIGRATIONS }
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
exports.migrateIfRequired = async (migrationDb, migrationName, migrateFn) => {
|
||
|
let db
|
||
|
if (migrationDb === exports.MIGRATION_DBS.GLOBAL_DB) {
|
||
|
db = getGlobalDB()
|
||
|
} else {
|
||
|
throw new Error(`Unrecognised migration db [${migrationDb}]`)
|
||
|
}
|
||
|
|
||
|
if (!DB_LOOKUP[migrationDb].includes(migrationName)) {
|
||
|
throw new Error(
|
||
|
`Unrecognised migration name [${migrationName}] for db [${migrationDb}]`
|
||
|
)
|
||
|
}
|
||
|
return tryMigrate(db, migrationName, migrateFn)
|
||
|
}
|
||
|
|
||
|
const tryMigrate = async (db, migrationName, migrateFn) => {
|
||
|
try {
|
||
|
const doc = await getMigrationsDoc(db)
|
||
|
|
||
|
// exit if the migration has been performed
|
||
|
if (doc[migrationName]) {
|
||
|
return
|
||
|
}
|
||
|
|
||
|
console.log(`Performing migration: ${migrationName}`)
|
||
|
await migrateFn()
|
||
|
console.log(`Migration complete: ${migrationName}`)
|
||
|
|
||
|
// mark as complete
|
||
|
doc[migrationName] = Date.now()
|
||
|
await db.put(doc)
|
||
|
} catch (err) {
|
||
|
console.error(`Error performing migration: ${migrationName}: `, err)
|
||
|
throw err
|
||
|
}
|
||
|
}
|