Asymmetrik/node-rest-starter

View on GitHub
src/rollback-migrations.ts

Summary

Maintainability
B
4 hrs
Test Coverage
/* eslint-disable no-console */

import config from 'config';
import { DateTime } from 'luxon';
import * as migrateMongo from 'migrate-mongo';

import { logger } from './lib/logger';
import * as mongoose from './lib/mongoose';

const rollbackMigrations = async () => {
    logger.silent = process.argv?.[3] !== '--logger';
    logger.info('Started migration rollback...');

    const db = await mongoose.connect();

    migrateMongo.config.set(config.get('migrateMongo'));

    try {
        // eslint-disable-next-line @typescript-eslint/ban-ts-comment
        // @ts-ignore
        const migrations = await migrateMongo.status(db.admin.connection.db);

        if (process.argv.length < 3) {
            const migrationDates = [
                ...new Set(
                    migrations
                        .map((migration) => migration.appliedAt)
                        .filter((appliedAt) => appliedAt !== 'PENDING')
                        .map((appliedAt) => DateTime.fromISO(appliedAt).toISODate())
                )
            ];
            if (migrationDates.length > 0) {
                console.log('Past migration dates:');
                migrationDates.forEach((appliedAt) => {
                    console.log(appliedAt);
                });
            } else {
                console.log('No migrations found.');
            }
            return;
        }

        const date = DateTime.fromISO(process.argv[2]).toISO();

        let migration = migrations.pop();
        while (migration.appliedAt !== 'PENDING' && migration.appliedAt > date) {
            console.log(`rolling back ${migration.fileName}`);

            // eslint-disable-next-line @typescript-eslint/ban-ts-comment
            // @ts-ignore
            // eslint-disable-next-line no-await-in-loop
            await migrateMongo.down(db.admin.connection.db);

            migration = migrations.pop();
        }
    } catch (err) {
        logger.error('Execution failed.');
        return Promise.reject(err);
    }
};

rollbackMigrations()
    .then(() => {
        logger.info('Execution complete');
        process.exit(0);
    })
    .catch((error) => {
        logger.error('Startup initialization failed.', error);
        process.exit(1);
    });