Skip to content

Migration

Phat Nguyen edited this page Jul 28, 2024 · 4 revisions

Visual (*) for the path is mentioned:

.
└── .src
    └── migrations
        └── sqls
        └── 0000-migrate-0.ts
        └── 0001-migrate-1.ts
        └── xxxx-migrate-n.ts
        └── migration-processes.ts
    └── migrate.ts
    └── application.ts

Content: migration-processes.ts

import { ApplicationKeys } from "@/common";

import { MigrationProcess, createViewPolicy } from "@tanphat199/lb-infra";
// Note:
// ViewPolicy is required for authorization, you can ignore this step if no authorization required

const seedPaths = [ "0000-migrate-0", "0000-migrate-1", ... ];

export const getMigrateProcesses = async (): Promise<{
  cleanUps: Array<MigrationProcess>;
  migrates: Array<MigrationProcess>;
}> => {
  const cleanUps: Array<MigrationProcess> = [];
  const migrates: Array<MigrationProcess> = [];

  // Create authorization view
  migrates.push( createViewPolicy({ datasourceKey: '<datasource_key>' }));

  for (const seedPath of seedPaths) {
    const p = (await import(`./${seedPath}`))?.default;

    if (!p) {
      continue;
    }

    if (p.fn) {
      migrates.push({ name: p.name, fn: p.fn });
    }

    if (p.cleanFn) {
      cleanUps.push({ name: `[CLEAN_UP] ${p.name}`, fn: p.cleanFn });
    }
  }

  return { cleanUps, migrates };
};

Content: migrate.ts

import { getMigrateProcesses } from '@/migrations/migration-processes';
import { applicationLogger, migration, ViewAuthorizePolicy } from '@tanphat199/lb-infra';
import { SASApplication } from './application';

const ignoreModels = [
  // name of all ignore to migrates models
];

export const migrate = async (args: string[]) => {
  const existingSchema = args.includes('--rebuild') ? 'drop' : 'alter';

  const processes = await getMigrateProcesses();
  const application = new Application();
  await application.boot();

  // clean up
  if (existingSchema === 'alter') {
    await migration(application, processes.cleanUps);
  }

  // migrate models
  await application.migrateModels({ existingSchema, ignoreModels });

  // migrate required step with previous declaration
  await migration(application, processes.migrates);
};

migrate(process.argv)
  .then(() => {
    process.exit(0);
  })
  .catch(error => {
    console.error(error);
    process.exit(1);
  });

Run migrate.ts file all application migration.

Minimal Technology Vietnam

Clone this wiki locally