UNPKG

stackpress

Version:

Incept is a content management framework.

76 lines (75 loc) 2.89 kB
import Revisions from '../client/Revisions.js'; import { sequence } from '../sql/helpers.js'; import create from '../sql/schema.js'; export default async function push(server, database, cli) { const config = server.config('client') || {}; if (!config.revisions) { return; } const queries = []; const revisions = new Revisions(config.revisions, server.loader); const from = await revisions.last(-1); const to = await revisions.last(); cli?.verbose && cli.control.system('Updating database...'); if (!from && to) { cli?.verbose && cli.control.system(' with DROP/CREATE ...'); const models = Array.from(to.registry.model.values()); const order = sequence(models); for (const model of order) { queries.push(database.dialect.drop(model.snake)); } for (const model of order.reverse()) { const exists = models.find(map => map.name === model.name); if (exists) { const schema = create(exists); schema.engine = database; queries.push(...schema.query()); } } if (queries.length) { await database.transaction(async (connection) => { for (const query of queries) { cli?.verbose && cli.control.info(query.query); await connection.query(query); } }); } } else if (from && to) { cli?.verbose && cli.control.system(' with ALTER ...'); const previous = Array.from(from.registry.model.values()).map(model => create(model)); const current = Array.from(to.registry.model.values()).map(model => create(model)); const queries = []; for (const schema of current) { const name = schema.build().table; const before = previous.find(from => from.build().table === name); if (!before) { schema.engine = database; queries.push(...schema.query()); continue; } try { queries.push(...database.diff(before, schema).query()); } catch (e) { } } for (const schema of previous) { const name = schema.build().table; const after = current.find(to => to.build().table === name); if (!after) { queries.push(database.dialect.drop(name)); continue; } } if (queries.length) { await database.transaction(async (connection) => { for (const query of queries) { cli?.verbose && cli.control.info(query.query); await connection.query(query); } }); } } cli?.verbose && cli.control.success('Database Updated.'); } ;