92 lines
3.3 KiB
TypeScript
92 lines
3.3 KiB
TypeScript
|
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");
|
||
|
}
|
||
|
}
|