From 4378c02d179c95b36d11df291bfec9b10d344d4b Mon Sep 17 00:00:00 2001 From: Julian Krauser Date: Tue, 28 Jan 2025 11:09:42 +0100 Subject: [PATCH] unique fields for tables --- src/data-source.ts | 2 + src/entity/club/member/member.ts | 6 +- src/entity/club/newsletter/newsletter.ts | 2 +- src/entity/club/protocol/protocol.ts | 2 +- src/entity/refresh.ts | 4 +- src/entity/settings/award.ts | 2 +- src/entity/settings/calendarType.ts | 2 +- src/entity/settings/communicationType.ts | 2 +- src/entity/settings/executivePosition.ts | 2 +- src/entity/settings/membershipStatus.ts | 2 +- src/entity/settings/qualification.ts | 2 +- src/entity/settings/template.ts | 2 +- src/entity/user/role.ts | 2 +- src/entity/user/user.ts | 8 +- src/entity/user/user_permission.ts | 4 +- src/migrations/1738057119384-UniqueFields.ts | 119 +++++++++++++++++++ 16 files changed, 144 insertions(+), 19 deletions(-) create mode 100644 src/migrations/1738057119384-UniqueFields.ts diff --git a/src/data-source.ts b/src/data-source.ts index 851997f..145da3f 100644 --- a/src/data-source.ts +++ b/src/data-source.ts @@ -75,6 +75,7 @@ import { salutation } from "./entity/settings/salutation"; import { SalutationAsTable1737796878058 } from "./migrations/1737796878058-salutationAsTable"; import { UpdateViews1737800468938 } from "./migrations/1737800468938-updateViews"; import { MoveSendNewsletterFlag1737816852011 } from "./migrations/1737816852011-moveSendNewsletterFlag"; +import { UniqueFields1738057119384 } from "./migrations/1738057119384-UniqueFields"; const dataSource = new DataSource({ type: DB_TYPE as any, @@ -160,6 +161,7 @@ const dataSource = new DataSource({ SalutationAsTable1737796878058, UpdateViews1737800468938, MoveSendNewsletterFlag1737816852011, + UniqueFields1738057119384, ], migrationsRun: true, migrationsTransactionMode: "each", diff --git a/src/entity/club/member/member.ts b/src/entity/club/member/member.ts index 3557d58..d20ba70 100644 --- a/src/entity/club/member/member.ts +++ b/src/entity/club/member/member.ts @@ -32,7 +32,11 @@ export class member { @OneToMany(() => communication, (communications) => communications.member) communications: communication[]; - @ManyToOne(() => salutation, (salutation) => salutation.members) + @ManyToOne(() => salutation, (salutation) => salutation.members, { + nullable: false, + onDelete: "RESTRICT", + onUpdate: "RESTRICT", + }) salutation: salutation; @OneToMany(() => membership, (membership) => membership.member) diff --git a/src/entity/club/newsletter/newsletter.ts b/src/entity/club/newsletter/newsletter.ts index 021ce23..1c26a68 100644 --- a/src/entity/club/newsletter/newsletter.ts +++ b/src/entity/club/newsletter/newsletter.ts @@ -9,7 +9,7 @@ export class newsletter { @PrimaryColumn({ generated: "increment", type: "int" }) id: number; - @Column({ type: "varchar", length: 255 }) + @Column({ type: "varchar", length: 255, unique: true }) title: string; @Column({ type: "varchar", length: 255, default: "" }) diff --git a/src/entity/club/protocol/protocol.ts b/src/entity/club/protocol/protocol.ts index b218164..215d9bc 100644 --- a/src/entity/club/protocol/protocol.ts +++ b/src/entity/club/protocol/protocol.ts @@ -5,7 +5,7 @@ export class protocol { @PrimaryColumn({ generated: "increment", type: "int" }) id: number; - @Column({ type: "varchar", length: 255 }) + @Column({ type: "varchar", length: 255, unique: true }) title: string; @Column({ type: "date" }) diff --git a/src/entity/refresh.ts b/src/entity/refresh.ts index 560d7c2..646b3bd 100644 --- a/src/entity/refresh.ts +++ b/src/entity/refresh.ts @@ -6,8 +6,8 @@ export class refresh { @PrimaryColumn({ type: "varchar", length: 255 }) token: string; - @PrimaryColumn({ type: "int" }) - userId: number; + @PrimaryColumn() + userId: string; @Column({ type: "datetime" }) expiry: Date; diff --git a/src/entity/settings/award.ts b/src/entity/settings/award.ts index 74d5260..1bcead0 100644 --- a/src/entity/settings/award.ts +++ b/src/entity/settings/award.ts @@ -6,7 +6,7 @@ export class award { @PrimaryColumn({ generated: "increment", type: "int" }) id: number; - @Column({ type: "varchar", length: 255 }) + @Column({ type: "varchar", length: 255, unique: true }) award: string; @OneToMany(() => memberAwards, (member) => member.award) diff --git a/src/entity/settings/calendarType.ts b/src/entity/settings/calendarType.ts index 1e99e26..acef5e5 100644 --- a/src/entity/settings/calendarType.ts +++ b/src/entity/settings/calendarType.ts @@ -6,7 +6,7 @@ export class calendarType { @PrimaryColumn({ generated: "increment", type: "int" }) id: number; - @Column({ type: "varchar", length: 255 }) + @Column({ type: "varchar", length: 255, unique: true }) type: string; @Column({ type: "boolean" }) // none specified cal dav request diff --git a/src/entity/settings/communicationType.ts b/src/entity/settings/communicationType.ts index 1c81be5..7fd82ee 100644 --- a/src/entity/settings/communicationType.ts +++ b/src/entity/settings/communicationType.ts @@ -7,7 +7,7 @@ export class communicationType { @PrimaryColumn({ generated: "increment", type: "int" }) id: number; - @Column({ type: "varchar", length: 255 }) + @Column({ type: "varchar", length: 255, unique: true }) type: string; @Column({ diff --git a/src/entity/settings/executivePosition.ts b/src/entity/settings/executivePosition.ts index 8d77bf7..19843d0 100644 --- a/src/entity/settings/executivePosition.ts +++ b/src/entity/settings/executivePosition.ts @@ -6,7 +6,7 @@ export class executivePosition { @PrimaryColumn({ generated: "increment", type: "int" }) id: number; - @Column({ type: "varchar", length: 255 }) + @Column({ type: "varchar", length: 255, unique: true }) position: string; @OneToMany(() => memberExecutivePositions, (memberExecutivePositions) => memberExecutivePositions.executivePosition) diff --git a/src/entity/settings/membershipStatus.ts b/src/entity/settings/membershipStatus.ts index 4362171..f8fc745 100644 --- a/src/entity/settings/membershipStatus.ts +++ b/src/entity/settings/membershipStatus.ts @@ -6,7 +6,7 @@ export class membershipStatus { @PrimaryColumn({ generated: "increment", type: "int" }) id: number; - @Column({ type: "varchar", length: 255 }) + @Column({ type: "varchar", length: 255, unique: true }) status: string; @OneToMany(() => membership, (membership) => membership.status) diff --git a/src/entity/settings/qualification.ts b/src/entity/settings/qualification.ts index 8e76ff8..9fa541a 100644 --- a/src/entity/settings/qualification.ts +++ b/src/entity/settings/qualification.ts @@ -6,7 +6,7 @@ export class qualification { @PrimaryColumn({ generated: "increment", type: "int" }) id: number; - @Column({ type: "varchar", length: 255 }) + @Column({ type: "varchar", length: 255, unique: true }) qualification: string; @Column({ type: "varchar", length: 255, nullable: true }) diff --git a/src/entity/settings/template.ts b/src/entity/settings/template.ts index 6a25724..a237973 100644 --- a/src/entity/settings/template.ts +++ b/src/entity/settings/template.ts @@ -5,7 +5,7 @@ export class template { @PrimaryColumn({ generated: "increment", type: "int" }) id: number; - @Column({ type: "varchar", length: 255 }) + @Column({ type: "varchar", length: 255, unique: true }) template: string; @Column({ type: "varchar", length: 255, nullable: true }) diff --git a/src/entity/user/role.ts b/src/entity/user/role.ts index 87f0049..b7692bf 100644 --- a/src/entity/user/role.ts +++ b/src/entity/user/role.ts @@ -7,7 +7,7 @@ export class role { @PrimaryColumn({ generated: "increment", type: "int" }) id: number; - @Column({ type: "varchar", length: 255 }) + @Column({ type: "varchar", length: 255, unique: true }) role: string; @ManyToMany(() => user, (user) => user.roles, { diff --git a/src/entity/user/user.ts b/src/entity/user/user.ts index 09435cd..bb42bb8 100644 --- a/src/entity/user/user.ts +++ b/src/entity/user/user.ts @@ -4,13 +4,13 @@ import { userPermission } from "./user_permission"; @Entity() export class user { - @PrimaryColumn({ generated: "increment", type: "int" }) - id: number; + @PrimaryColumn({ generated: "uuid", type: "varchar" }) + id: string; - @Column({ type: "varchar", length: 255 }) + @Column({ type: "varchar", unique: true, length: 255 }) mail: string; - @Column({ type: "varchar", length: 255 }) + @Column({ type: "varchar", unique: true, length: 255 }) username: string; @Column({ type: "varchar", length: 255 }) diff --git a/src/entity/user/user_permission.ts b/src/entity/user/user_permission.ts index 7d782ae..1c6ccfd 100644 --- a/src/entity/user/user_permission.ts +++ b/src/entity/user/user_permission.ts @@ -4,8 +4,8 @@ import { PermissionObject, PermissionString } from "../../type/permissionTypes"; @Entity() export class userPermission { - @PrimaryColumn({ type: "int" }) - userId: number; + @PrimaryColumn() + userId: string; @PrimaryColumn({ type: "varchar", length: 255 }) permission: PermissionString; diff --git a/src/migrations/1738057119384-UniqueFields.ts b/src/migrations/1738057119384-UniqueFields.ts new file mode 100644 index 0000000..f60def2 --- /dev/null +++ b/src/migrations/1738057119384-UniqueFields.ts @@ -0,0 +1,119 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class UniqueFields1738057119384 implements MigrationInterface { + name = "UniqueFields1738057119384"; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`DROP INDEX \`UQ_6c6bdcaeb808549ae66c2493efd\` ON \`salutation\``); + await queryRunner.query(`DROP INDEX \`UQ_9ffb36037fb8d7456689956ed80\` ON \`query\``); + await queryRunner.query(`DROP INDEX \`UQ_424ac388ca888a1dc67f5fe3a80\` ON \`webapi\``); + await queryRunner.query(`DROP INDEX \`UQ_55c99c82f45936d8d34c48f5515\` ON \`webapi\``); + + await queryRunner.query(`ALTER TABLE \`award\` ADD UNIQUE INDEX \`IDX_646bbdb45883cc39c55740d7b6\` (\`award\`)`); + await queryRunner.query(`ALTER TABLE \`protocol\` ADD UNIQUE INDEX \`IDX_e60159678b8dad84b2e7dfa20c\` (\`title\`)`); + await queryRunner.query( + `ALTER TABLE \`calendar_type\` ADD UNIQUE INDEX \`IDX_fbcbfda68b80800afa78e21c88\` (\`type\`)` + ); + await queryRunner.query(`ALTER TABLE \`query\` ADD UNIQUE INDEX \`IDX_9ffb36037fb8d7456689956ed8\` (\`title\`)`); + await queryRunner.query( + `ALTER TABLE \`template\` ADD UNIQUE INDEX \`IDX_9d0ad817708f4c1a7c78e4abf6\` (\`template\`)` + ); + await queryRunner.query( + `ALTER TABLE \`newsletter\` ADD UNIQUE INDEX \`IDX_80b2037e9f015eb2cf597bae6c\` (\`title\`)` + ); + await queryRunner.query( + `ALTER TABLE \`membership_status\` ADD UNIQUE INDEX \`IDX_9d71cc98acfae7a8276718f052\` (\`status\`)` + ); + await queryRunner.query( + `ALTER TABLE \`qualification\` ADD UNIQUE INDEX \`IDX_2d2540f8b970a5a43a905278da\` (\`qualification\`)` + ); + await queryRunner.query( + `ALTER TABLE \`executive_position\` ADD UNIQUE INDEX \`IDX_427169e456c217a317273c31d7\` (\`position\`)` + ); + await queryRunner.query( + `ALTER TABLE \`communication_type\` ADD UNIQUE INDEX \`IDX_63a3b23374fc0dd80e5ab32e09\` (\`type\`)` + ); + await queryRunner.query( + `ALTER TABLE \`salutation\` ADD UNIQUE INDEX \`IDX_6c6bdcaeb808549ae66c2493ef\` (\`salutation\`)` + ); + await queryRunner.query(`ALTER TABLE \`webapi\` ADD UNIQUE INDEX \`IDX_55c99c82f45936d8d34c48f551\` (\`token\`)`); + await queryRunner.query(`ALTER TABLE \`webapi\` ADD UNIQUE INDEX \`IDX_424ac388ca888a1dc67f5fe3a8\` (\`title\`)`); + await queryRunner.query(`ALTER TABLE \`role\` ADD UNIQUE INDEX \`IDX_367aad98203bd8afaed0d70409\` (\`role\`)`); + await queryRunner.query(`ALTER TABLE \`user\` ADD UNIQUE INDEX \`IDX_7395ecde6cda2e7fe90253ec59\` (\`mail\`)`); + await queryRunner.query(`ALTER TABLE \`user\` ADD UNIQUE INDEX \`IDX_78a916df40e02a9deb1c4b75ed\` (\`username\`)`); + + await queryRunner.query(`ALTER TABLE \`user_permission\` DROP FOREIGN KEY \`FK_deb59c09715314aed1866e18a81\``); + await queryRunner.query(`ALTER TABLE \`refresh\` DROP FOREIGN KEY \`FK_b39e4ed3bfa789758e476870ec2\``); + await queryRunner.query(`ALTER TABLE \`user_roles\` DROP FOREIGN KEY \`FK_472b25323af01488f1f66a06b67\``); + + await queryRunner.query(`ALTER TABLE \`user\` MODIFY COLUMN \`id\` varchar(36) NOT NULL`); + + await queryRunner.query(`ALTER TABLE \`user_permission\` MODIFY COLUMN \`userId\` varchar(36) NOT NULL`); + await queryRunner.query( + `ALTER TABLE \`user_permission\` ADD CONSTRAINT \`FK_deb59c09715314aed1866e18a81\` FOREIGN KEY (\`userId\`) REFERENCES \`user\`(\`id\`) ON DELETE CASCADE ON UPDATE RESTRICT` + ); + + await queryRunner.query(`ALTER TABLE \`refresh\` MODIFY COLUMN \`userId\` varchar(36) NOT NULL`); + await queryRunner.query( + `ALTER TABLE \`refresh\` ADD CONSTRAINT \`FK_b39e4ed3bfa789758e476870ec2\` FOREIGN KEY (\`userId\`) REFERENCES \`user\`(\`id\`) ON DELETE CASCADE ON UPDATE RESTRICT` + ); + + await queryRunner.query(`DROP INDEX \`IDX_472b25323af01488f1f66a06b6\` ON \`user_roles\``); + await queryRunner.query(`ALTER TABLE \`user_roles\` MODIFY COLUMN \`userId\` varchar(36) NOT NULL`); + await queryRunner.query(`CREATE INDEX \`IDX_472b25323af01488f1f66a06b6\` ON \`user_roles\` (\`userId\`)`); + await queryRunner.query( + `ALTER TABLE \`user_roles\` ADD CONSTRAINT \`FK_472b25323af01488f1f66a06b67\` FOREIGN KEY (\`userId\`) REFERENCES \`user\`(\`id\`) ON DELETE CASCADE ON UPDATE RESTRICT` + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE \`webapi\` DROP INDEX \`IDX_424ac388ca888a1dc67f5fe3a8\``); + await queryRunner.query(`ALTER TABLE \`webapi\` DROP INDEX \`IDX_55c99c82f45936d8d34c48f551\``); + await queryRunner.query(`ALTER TABLE \`newsletter\` DROP INDEX \`IDX_80b2037e9f015eb2cf597bae6c\``); + await queryRunner.query(`ALTER TABLE \`template\` DROP INDEX \`IDX_9d0ad817708f4c1a7c78e4abf6\``); + await queryRunner.query(`ALTER TABLE \`query\` DROP INDEX \`IDX_9ffb36037fb8d7456689956ed8\``); + await queryRunner.query(`ALTER TABLE \`calendar_type\` DROP INDEX \`IDX_fbcbfda68b80800afa78e21c88\``); + await queryRunner.query(`ALTER TABLE \`protocol\` DROP INDEX \`IDX_e60159678b8dad84b2e7dfa20c\``); + await queryRunner.query(`ALTER TABLE \`award\` DROP INDEX \`IDX_646bbdb45883cc39c55740d7b6\``); + await queryRunner.query(`ALTER TABLE \`salutation\` DROP INDEX \`IDX_6c6bdcaeb808549ae66c2493ef\``); + await queryRunner.query(`ALTER TABLE \`communication_type\` DROP INDEX \`IDX_63a3b23374fc0dd80e5ab32e09\``); + await queryRunner.query(`ALTER TABLE \`executive_position\` DROP INDEX \`IDX_427169e456c217a317273c31d7\``); + await queryRunner.query(`ALTER TABLE \`qualification\` DROP INDEX \`IDX_2d2540f8b970a5a43a905278da\``); + await queryRunner.query(`ALTER TABLE \`membership_status\` DROP INDEX \`IDX_9d71cc98acfae7a8276718f052\``); + + await queryRunner.query(`ALTER TABLE \`user_roles\` DROP FOREIGN KEY \`FK_472b25323af01488f1f66a06b67\``); + await queryRunner.query(`ALTER TABLE \`user_permission\` DROP FOREIGN KEY \`FK_deb59c09715314aed1866e18a81\``); + await queryRunner.query(`ALTER TABLE \`refresh\` DROP FOREIGN KEY \`FK_b39e4ed3bfa789758e476870ec2\``); + + await queryRunner.query(`ALTER TABLE \`user\` DROP INDEX \`IDX_78a916df40e02a9deb1c4b75ed\``); + await queryRunner.query(`ALTER TABLE \`user\` DROP INDEX \`IDX_7395ecde6cda2e7fe90253ec59\``); + await queryRunner.query(`ALTER TABLE \`user\` MODIFY COLUMN \`id\` int NOT NULL AUTO_INCREMENT`); + + await queryRunner.query(`DROP INDEX \`IDX_472b25323af01488f1f66a06b6\` ON \`user_roles\``); + + await queryRunner.query(`ALTER TABLE \`refresh\` MODIFY COLUMN \`userId\` int NOT NULL`); + await queryRunner.query( + `ALTER TABLE \`refresh\` ADD CONSTRAINT \`FK_b39e4ed3bfa789758e476870ec2\` FOREIGN KEY (\`userId\`) REFERENCES \`user\`(\`id\`) ON DELETE CASCADE ON UPDATE RESTRICT` + ); + + await queryRunner.query(`ALTER TABLE \`user_permission\` MODIFY COLUMN \`userId\` int NOT NULL`); + await queryRunner.query( + `ALTER TABLE \`user_permission\` ADD CONSTRAINT \`FK_deb59c09715314aed1866e18a81\` FOREIGN KEY (\`userId\`) REFERENCES \`user\`(\`id\`) ON DELETE CASCADE ON UPDATE RESTRICT` + ); + + await queryRunner.query(`ALTER TABLE \`user_roles\` MODIFY COLUMN \`userId\` int NOT NULL`); + await queryRunner.query(`CREATE INDEX \`IDX_472b25323af01488f1f66a06b6\` ON \`user_roles\` (\`userId\`)`); + await queryRunner.query( + `ALTER TABLE \`user_roles\` ADD CONSTRAINT \`FK_472b25323af01488f1f66a06b67\` FOREIGN KEY (\`userId\`) REFERENCES \`user\`(\`id\`) ON DELETE CASCADE ON UPDATE RESTRICT` + ); + + await queryRunner.query(`ALTER TABLE \`role\` DROP INDEX \`IDX_367aad98203bd8afaed0d70409\``); + + await queryRunner.query(`CREATE UNIQUE INDEX \`UQ_55c99c82f45936d8d34c48f5515\` ON \`webapi\` (\`token\`)`); + await queryRunner.query(`CREATE UNIQUE INDEX \`UQ_424ac388ca888a1dc67f5fe3a80\` ON \`webapi\` (\`title\`)`); + await queryRunner.query(`CREATE UNIQUE INDEX \`UQ_9ffb36037fb8d7456689956ed80\` ON \`query\` (\`title\`)`); + await queryRunner.query( + `CREATE UNIQUE INDEX \`UQ_6c6bdcaeb808549ae66c2493efd\` ON \`salutation\` (\`salutation\`)` + ); + } +}