ff-admin-server/src/migrations/1737796878058-salutationAsTable.ts

92 lines
3.3 KiB
TypeScript
Raw Normal View History

2025-01-25 11:39:34 +01:00
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<void> {
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<string>) {
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<void> {
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");
}
}