* feat: migrate cli call db adapter * feat: mongoose adapter migrate:create * feat: implement migrate command * feat: use mongooseAdapter in test config * feat: use filename as migration name * feat: intelligently execute migrations, status table * feat: implement migrate:down * feat: implement migrate:reset * feat: implement migrate:refresh * feat: move common adapter operations to database/migrations dir * feat: delete migrations instead of storing ran property * feat: createMigration cleanup * feat: clean up logging and add duration to output * chore: export type, handle graphQL false * chore: simplify getting latest batch number * chore: remove existing migration logging noise * feat: remove adapter export from top level * chore: fix some db types
45 lines
1.5 KiB
TypeScript
45 lines
1.5 KiB
TypeScript
/* eslint-disable no-restricted-syntax, no-await-in-loop */
|
|
import { DatabaseAdapter } from '../types';
|
|
import { getMigrations } from './getMigrations';
|
|
import { readMigrationFiles } from './readMigrationFiles';
|
|
|
|
export async function migrateDown(this: DatabaseAdapter): Promise<void> {
|
|
const { payload } = this;
|
|
const migrationFiles = await readMigrationFiles({ payload });
|
|
|
|
const { existingMigrations, latestBatch } = await getMigrations({
|
|
payload,
|
|
});
|
|
|
|
|
|
const migrationsToRollback = existingMigrations.filter((migration) => migration.batch === latestBatch);
|
|
if (!migrationsToRollback?.length) {
|
|
payload.logger.info({ msg: 'No migrations to rollback.' });
|
|
return;
|
|
}
|
|
payload.logger.info({ msg: `Rolling back batch ${latestBatch} consisting of ${migrationsToRollback.length} migrations.` });
|
|
|
|
for (const migration of migrationsToRollback) {
|
|
const migrationFile = migrationFiles.find((m) => m.name === migration.name);
|
|
if (!migrationFile) {
|
|
throw new Error(`Migration ${migration.name} not found locally.`);
|
|
}
|
|
|
|
try {
|
|
payload.logger.info({ msg: `Migrating: ${migrationFile.name}` });
|
|
const start = Date.now();
|
|
await migrationFile.down({ payload });
|
|
|
|
payload.logger.info({ msg: `Migrated: ${migrationFile.name} (${Date.now() - start}ms)` });
|
|
|
|
await payload.delete({
|
|
collection: 'payload-migrations',
|
|
id: migration.id,
|
|
});
|
|
} catch (err: unknown) {
|
|
payload.logger.error({ msg: `Error running migration ${migrationFile.name}`, err });
|
|
throw err;
|
|
}
|
|
}
|
|
}
|