Skip to content

Commit

Permalink
Use prod DB as basis for migrations (#25)
Browse files Browse the repository at this point in the history
  • Loading branch information
leo authored Jan 10, 2025
1 parent 03bd668 commit 40e6811
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 31 deletions.
46 changes: 23 additions & 23 deletions src/commands/migration.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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<Parameters<typeof parseArgs>[0]>['options'];

type Flags = BaseFlags & Partial<Record<keyof typeof MIGRATION_FLAGS, boolean>>;
Expand Down Expand Up @@ -74,30 +74,30 @@ const applyMigrationStatements = async (
statements: Array<{ statement: string }>,
slug: string,
): Promise<void> => {
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',
})),
}),
});
};

/**
Expand All @@ -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(),
]);

Expand Down Expand Up @@ -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);
Expand Down
10 changes: 5 additions & 5 deletions src/utils/model.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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.
*
Expand All @@ -21,13 +21,15 @@ export const getModels = async (
db: Database,
token?: string,
spaceId?: string,
isProduction?: boolean,
isLocal = true,
): Promise<Array<Model>> => {
const transaction = new Transaction([{ get: { models: null } }]);

let rawResults: Array<Array<Row>>;

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,
Expand All @@ -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<Model>(rawResults, false);
Expand Down
6 changes: 3 additions & 3 deletions tests/utils/model.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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);
Expand All @@ -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);
Expand Down

0 comments on commit 40e6811

Please sign in to comment.