From 40e68112db313213604331392b33788fc101cf0f Mon Sep 17 00:00:00 2001 From: Leo Lamprecht Date: Fri, 10 Jan 2025 17:58:20 +0100 Subject: [PATCH] Use prod DB as basis for migrations (#25) --- src/commands/migration.ts | 46 +++++++++++++++++++-------------------- src/utils/model.ts | 10 ++++----- tests/utils/model.test.ts | 6 ++--- 3 files changed, 31 insertions(+), 31 deletions(-) diff --git a/src/commands/migration.ts b/src/commands/migration.ts index 75a2aba..be7c30e 100644 --- a/src/commands/migration.ts +++ b/src/commands/migration.ts @@ -24,7 +24,7 @@ export const MIGRATION_FLAGS = { reset: { type: 'boolean', short: 'r', default: false }, sql: { type: 'boolean', short: 's', default: false }, apply: { type: 'boolean', short: 'a', default: false }, - prod: { type: 'boolean', short: 'p', default: false }, + local: { type: 'boolean', short: 'l', default: false }, } satisfies NonNullable[0]>['options']; type Flags = BaseFlags & Partial>; @@ -74,30 +74,30 @@ const applyMigrationStatements = async ( statements: Array<{ statement: string }>, slug: string, ): Promise => { - if (flags.prod) { - spinner.info('Applying migration to production database'); - - await fetch(`https://data.ronin.co/?data-selector=${slug}`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - Authorization: `Bearer ${appTokenOrSessionToken}`, - }, - body: JSON.stringify({ - nativeQueries: statements.map((query) => ({ - query: query.statement, - mode: 'write', - })), - }), - }); + if (flags.local) { + spinner.info('Applying migration to local database'); + + await db.query(statements.map(({ statement }) => statement)); + fs.writeFileSync('.ronin/db.sqlite', await db.getContents()); return; } - spinner.info('Applying migration to local database'); - - await db.query(statements.map(({ statement }) => statement)); - fs.writeFileSync('.ronin/db.sqlite', await db.getContents()); + spinner.info('Applying migration to production database'); + + await fetch(`https://data.ronin.co/?data-selector=${slug}`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + Authorization: `Bearer ${appTokenOrSessionToken}`, + }, + body: JSON.stringify({ + nativeQueries: statements.map((query) => ({ + query: query.statement, + mode: 'write', + })), + }), + }); }; /** @@ -119,7 +119,7 @@ const create = async ( spinner.text = 'Comparing models'; const [existingModels, definedModels] = await Promise.all([ - getModels(db, appToken ?? sessionToken, slug, flags.prod), + getModels(db, appToken ?? sessionToken, slug, flags.local), getModelDefinitions(), ]); @@ -217,7 +217,7 @@ const apply = async ( db, appToken ?? sessionToken, slug, - flags.prod, + flags.local, ); const protocol = await new Protocol().load(migrationFilePath); const statements = protocol.getSQLStatements(existingModels); diff --git a/src/utils/model.ts b/src/utils/model.ts index 54249fe..0e50ef0 100644 --- a/src/utils/model.ts +++ b/src/utils/model.ts @@ -11,7 +11,7 @@ import type { Row } from '@ronin/engine/types'; * @param db - The database instance to query from. * @param token - Optional authentication token for production API requests. * @param spaceId - Optional space ID for production API requests. - * @param isProduction - Optional flag to determine if production API should be used. + * @param isLocal - Optional flag to determine if production API should be used. * * @returns Promise resolving to an array of formatted Model objects. * @@ -21,13 +21,15 @@ export const getModels = async ( db: Database, token?: string, spaceId?: string, - isProduction?: boolean, + isLocal = true, ): Promise> => { const transaction = new Transaction([{ get: { models: null } }]); let rawResults: Array>; - if (isProduction) { + if (isLocal) { + rawResults = (await db.query(transaction.statements)).map((r) => r.rows); + } else { try { const nativeQueries = transaction.statements.map((statement) => ({ query: statement.statement, @@ -51,8 +53,6 @@ export const getModels = async ( } catch (error) { throw new Error(`Failed to fetch remote models: ${(error as Error).message}`); } - } else { - rawResults = (await db.query(transaction.statements)).map((r) => r.rows); } const results = transaction.formatResults(rawResults, false); diff --git a/tests/utils/model.test.ts b/tests/utils/model.test.ts index a77fc78..03f111e 100644 --- a/tests/utils/model.test.ts +++ b/tests/utils/model.test.ts @@ -56,7 +56,7 @@ describe('models', () => { method: 'POST', }); - const models = await getModels(db, '', 'updated-bsql-ip', true); + const models = await getModels(db, '', 'updated-bsql-ip', false); expect(models).toStrictEqual([]); expect(models).toHaveLength(0); @@ -77,7 +77,7 @@ describe('models', () => { method: 'POST', }); - const models = await getModels(db, '', 'updated-bsql-ip', true); + const models = await getModels(db, '', 'updated-bsql-ip', false); expect(models).toStrictEqual([]); expect(models).toHaveLength(0); @@ -92,7 +92,7 @@ describe('models', () => { }); try { - await getModels(db, '', '', true); + await getModels(db, '', '', false); } catch (err) { const error = err as Error; expect(error).toBeInstanceOf(Error);