From a19d0bab2503ce1571d7d095b620417adab558bb Mon Sep 17 00:00:00 2001 From: rubikscraft Date: Wed, 7 Sep 2022 09:32:56 +0200 Subject: [PATCH] move to uuid columns --- .../entities/image-derivative.entity.ts | 2 +- .../database/entities/image-file.entity.ts | 2 +- backend/src/database/entities/image.entity.ts | 1 + backend/src/database/entities/user.entity.ts | 4 +++ .../entities/usr-preference.entity.ts | 15 +++++++++-- .../migrations/1662535484200-V_0_4_0_c.ts | 26 +++++++++++++++++++ backend/src/database/migrations/index.ts | 2 ++ 7 files changed, 48 insertions(+), 4 deletions(-) create mode 100644 backend/src/database/migrations/1662535484200-V_0_4_0_c.ts diff --git a/backend/src/database/entities/image-derivative.entity.ts b/backend/src/database/entities/image-derivative.entity.ts index aa4f872..d3dfd0d 100644 --- a/backend/src/database/entities/image-derivative.entity.ts +++ b/backend/src/database/entities/image-derivative.entity.ts @@ -22,7 +22,7 @@ export class EImageDerivativeBackend { onDelete: 'CASCADE', }) @JoinColumn({ name: 'image_id' }) - private _image: any; + private _image?: any; @Column({ name: 'image_id', diff --git a/backend/src/database/entities/image-file.entity.ts b/backend/src/database/entities/image-file.entity.ts index 94f058b..b963853 100644 --- a/backend/src/database/entities/image-file.entity.ts +++ b/backend/src/database/entities/image-file.entity.ts @@ -23,7 +23,7 @@ export class EImageFileBackend { onDelete: 'CASCADE', }) @JoinColumn({ name: 'image_id' }) - private _image: any; + private _image?: any; @Column({ name: 'image_id' diff --git a/backend/src/database/entities/image.entity.ts b/backend/src/database/entities/image.entity.ts index cbf9955..1fb954d 100644 --- a/backend/src/database/entities/image.entity.ts +++ b/backend/src/database/entities/image.entity.ts @@ -10,6 +10,7 @@ export class EImageBackend implements EImage { @Column({ nullable: false, + type: 'uuid', }) user_id: string; diff --git a/backend/src/database/entities/user.entity.ts b/backend/src/database/entities/user.entity.ts index 7363745..4140715 100644 --- a/backend/src/database/entities/user.entity.ts +++ b/backend/src/database/entities/user.entity.ts @@ -8,6 +8,7 @@ import { } from 'typeorm'; import { z } from 'zod'; import { EApiKeyBackend } from './apikey.entity'; +import { EUsrPreferenceBackend } from './usr-preference.entity'; // Different data for public and private const OverriddenEUserSchema = EUserSchema.omit({ hashedPassword: true }).merge( @@ -35,4 +36,7 @@ export class EUserBackend implements OverriddenEUser { // This will never be populated, it is only here to auto delete apikeys when a user is deleted @OneToMany(() => EApiKeyBackend, (apikey) => apikey.user) apikeys?: EApiKeyBackend[]; + + @OneToMany(() => EUsrPreferenceBackend, (pref) => pref.user_id) + preferences?: EUsrPreferenceBackend[]; } diff --git a/backend/src/database/entities/usr-preference.entity.ts b/backend/src/database/entities/usr-preference.entity.ts index f754e7c..42b9ff0 100644 --- a/backend/src/database/entities/usr-preference.entity.ts +++ b/backend/src/database/entities/usr-preference.entity.ts @@ -1,6 +1,7 @@ import { IsEntityID } from 'picsur-shared/dist/validators/entity-id.validator'; -import { Column, Entity, Index, PrimaryGeneratedColumn, Unique } from 'typeorm'; +import { Column, Entity, Index, JoinColumn, ManyToOne, PrimaryGeneratedColumn, Unique } from 'typeorm'; import z from 'zod'; +import { EUserBackend } from './user.entity'; export const EUsrPreferenceSchema = z.object({ id: IsEntityID().optional(), @@ -23,7 +24,17 @@ export class EUsrPreferenceBackend implements EUsrPreference { @Column({ nullable: false }) value: string; + // We do a little trickery @Index() - @Column({ nullable: false }) + @ManyToOne(() => EUserBackend, (user) => user.preferences, { + nullable: false, + onDelete: 'CASCADE', + }) + @JoinColumn({ name: 'user_id' }) + private _user?: any; + + @Column({ + name: 'user_id' + }) user_id: string; } diff --git a/backend/src/database/migrations/1662535484200-V_0_4_0_c.ts b/backend/src/database/migrations/1662535484200-V_0_4_0_c.ts new file mode 100644 index 0000000..2bbc8fc --- /dev/null +++ b/backend/src/database/migrations/1662535484200-V_0_4_0_c.ts @@ -0,0 +1,26 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class V040C1662535484200 implements MigrationInterface { + name = 'V040C1662535484200' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "e_usr_preference_backend" DROP CONSTRAINT "UQ_576678406a479d569123a33e132"`); + await queryRunner.query(`DROP INDEX "public"."IDX_f1a427e855045fa793c275861a"`); + await queryRunner.query(`ALTER TABLE "e_usr_preference_backend" ALTER COLUMN "user_id" SET DATA TYPE UUID USING user_id::uuid`); + await queryRunner.query(`ALTER TABLE "e_image_backend" ALTER COLUMN "user_id" SET DATA TYPE UUID USING user_id::uuid`); + await queryRunner.query(`CREATE INDEX "IDX_f1a427e855045fa793c275861a" ON "e_usr_preference_backend" ("user_id") `); + await queryRunner.query(`ALTER TABLE "e_usr_preference_backend" ADD CONSTRAINT "UQ_576678406a479d569123a33e132" UNIQUE ("key", "user_id")`); + await queryRunner.query(`ALTER TABLE "e_usr_preference_backend" ADD CONSTRAINT "FK_f1a427e855045fa793c275861a7" FOREIGN KEY ("user_id") REFERENCES "e_user_backend"("id") ON DELETE CASCADE ON UPDATE NO ACTION`); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "e_usr_preference_backend" DROP CONSTRAINT "FK_f1a427e855045fa793c275861a7"`); + await queryRunner.query(`ALTER TABLE "e_usr_preference_backend" DROP CONSTRAINT "UQ_576678406a479d569123a33e132"`); + await queryRunner.query(`DROP INDEX "public"."IDX_f1a427e855045fa793c275861a"`); + await queryRunner.query(`ALTER TABLE "e_image_backend" ALTER COLUMN "user_id" SET DATA TYPE character varying`); + await queryRunner.query(`ALTER TABLE "e_usr_preference_backend" ALTER COLUMN "user_id" SET DATA TYPE character varying`); + await queryRunner.query(`CREATE INDEX "IDX_f1a427e855045fa793c275861a" ON "e_usr_preference_backend" ("user_id") `); + await queryRunner.query(`ALTER TABLE "e_usr_preference_backend" ADD CONSTRAINT "UQ_576678406a479d569123a33e132" UNIQUE ("key", "user_id")`); + } + +} diff --git a/backend/src/database/migrations/index.ts b/backend/src/database/migrations/index.ts index 7ddf102..f99d4f1 100644 --- a/backend/src/database/migrations/index.ts +++ b/backend/src/database/migrations/index.ts @@ -2,10 +2,12 @@ import { V030A1661692206479 } from './1661692206479-V_0_3_0_a'; import { V032A1662029904716 } from './1662029904716-V_0_3_2_a'; import { V040A1662314197741 } from './1662314197741-V_0_4_0_a'; import { V040B1662485374471 } from './1662485374471-V_0_4_0_b'; +import { V040C1662535484200 } from './1662535484200-V_0_4_0_c'; export const MigrationList: Function[] = [ V030A1661692206479, V032A1662029904716, V040A1662314197741, V040B1662485374471, + V040C1662535484200, ];