import { MigrationInterface, QueryRunner, Table, TableForeignKey } from "typeorm"; import { DB_TYPE } from "../env.defaults"; import { member } from "../entity/club/member/member"; import { salutation } from "../entity/settings/salutation"; export class SalutationAsTable1737796878058 implements MigrationInterface { name = "SalutationAsTable1737796878058"; public async up(queryRunner: QueryRunner): Promise { const variableType_int = DB_TYPE == "mysql" ? "int" : "integer"; await queryRunner.createTable( new Table({ name: "salutation", columns: [ { name: "id", type: variableType_int, isPrimary: true, isGenerated: true, generationStrategy: "increment" }, { name: "salutation", type: "varchar", length: "255", isUnique: true, isNullable: false }, ], }), true ); // ! has to be sql. Else the column would be dropped and created - resulting in data loss. await queryRunner.query( `ALTER TABLE \`member\` CHANGE \`salutation\` \`salutationId\` varchar(255) NOT NULL DEFAULT ''` ); // ! has to be sql. Else no data is returned. const existing_salutations = await queryRunner.query( "SELECT DISTINCT salutationId FROM `member` `member` GROUP BY salutationId" ); for (let s of existing_salutations.map((s: any) => s.salutationId) as Array) { await queryRunner.manager.getRepository(salutation).save({ salutation: s }); } const salutations = await queryRunner.manager.getRepository(salutation).find(); for (let salutation of salutations) { await queryRunner.manager .getRepository(member) .createQueryBuilder("member") .update({ salutationId: salutation.id }) .where({ salutationId: salutation.salutation }) .execute(); } await queryRunner.query( `ALTER TABLE \`member\` CHANGE \`salutationId\` \`salutationId\` ${variableType_int} NOT NULL` ); await queryRunner.createForeignKey( "member", new TableForeignKey({ columnNames: ["salutationId"], referencedColumnNames: ["id"], referencedTableName: "salutation", onDelete: "RESTRICT", onUpdate: "RESTRICT", }) ); } public async down(queryRunner: QueryRunner): Promise { const table = await queryRunner.getTable("member"); const foreignKey = table.foreignKeys.find((fk) => fk.columnNames.indexOf("salutationId") !== -1); await queryRunner.dropForeignKey("member", foreignKey); // ! has to be sql. Else the column would be dropped and created - resulting in data loss. await queryRunner.query( `ALTER TABLE \`member\` CHANGE \`salutationId\` \`salutationId\` varchar(255) NOT NULL DEFAULT ''` ); const salutations = await queryRunner.manager.getRepository(salutation).find(); for (let salutation of salutations) { await queryRunner.manager .getRepository(member) .createQueryBuilder("member") .update({ salutationId: salutation.salutation as unknown as number }) .where({ salutationId: salutation.id }) .execute(); } await queryRunner.query( `ALTER TABLE \`member\` CHANGE \`salutationId\` \`salutation\` varchar(255) NOT NULL DEFAULT 'none'` ); await queryRunner.dropTable("webapi"); } }