Files
payloadcms/src/database/migrations/migrateDown.ts
Elliot DeNolf 2198445df9 Feat/migrations cli (#2940)
* 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
2023-07-07 11:02:56 -04:00

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;
}
}
}