diff --git a/server/src/entities/album-permission.entity.ts b/server/src/entities/album-permission.entity.ts new file mode 100644 index 0000000000..48451b9c75 --- /dev/null +++ b/server/src/entities/album-permission.entity.ts @@ -0,0 +1,17 @@ +import { AlbumEntity } from 'src/entities/album.entity'; +import { UserEntity } from 'src/entities/user.entity'; +import { Column, Entity, ManyToOne, PrimaryColumn } from 'typeorm'; + +@Entity('albums_shared_users_users') +export class AlbumPermissionsEntity { + @PrimaryColumn({ type: 'uuid', name: 'albumsId', foreignKeyConstraintName: 'FK_f48513bf9bccefd6ff3ad30bd06' }) + @ManyToOne(() => AlbumEntity, { onDelete: 'CASCADE', onUpdate: 'CASCADE', nullable: false }) + albums!: AlbumEntity; + + @PrimaryColumn({ type: 'uuid', name: 'usersId', foreignKeyConstraintName: 'FK_427c350ad49bd3935a50baab737' }) + @ManyToOne(() => UserEntity, { onDelete: 'CASCADE', onUpdate: 'CASCADE', nullable: false }) + users!: UserEntity; + + @Column({ default: true }) + readonly!: boolean; +} diff --git a/server/src/entities/album.entity.ts b/server/src/entities/album.entity.ts index 99fae4f23d..d1d8799532 100644 --- a/server/src/entities/album.entity.ts +++ b/server/src/entities/album.entity.ts @@ -53,7 +53,19 @@ export class AlbumEntity { albumThumbnailAssetId!: string | null; @ManyToMany(() => UserEntity) - @JoinTable() + @JoinTable({ + name: 'albums_shared_users_users', + inverseJoinColumn: { + name: 'usersId', + referencedColumnName: 'id', + foreignKeyConstraintName: 'FK_f48513bf9bccefd6ff3ad30bd06', + }, + joinColumn: { + name: 'albumsId', + referencedColumnName: 'id', + foreignKeyConstraintName: 'FK_427c350ad49bd3935a50baab737', + }, + }) sharedUsers!: UserEntity[]; @ManyToMany(() => AssetEntity, (asset) => asset.albums) diff --git a/server/src/migrations/1712848324419-AddAlbumPermissions.ts b/server/src/migrations/1712848324419-AddAlbumPermissions.ts new file mode 100644 index 0000000000..7518e3e74b --- /dev/null +++ b/server/src/migrations/1712848324419-AddAlbumPermissions.ts @@ -0,0 +1,22 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class AddAlbumPermissions1712848324419 implements MigrationInterface { + name = 'AddAlbumPermissions1712848324419' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`DROP INDEX "public"."IDX_427c350ad49bd3935a50baab73"`); + await queryRunner.query(`DROP INDEX "public"."IDX_f48513bf9bccefd6ff3ad30bd0"`); + await queryRunner.query(`ALTER TABLE "albums_shared_users_users" ADD "readonly" boolean NOT NULL DEFAULT true`); + await queryRunner.query(`CREATE INDEX "IDX_427c350ad49bd3935a50baab73" ON "albums_shared_users_users" ("albumsId") `); + await queryRunner.query(`CREATE INDEX "IDX_f48513bf9bccefd6ff3ad30bd0" ON "albums_shared_users_users" ("usersId") `); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`DROP INDEX "public"."IDX_f48513bf9bccefd6ff3ad30bd0"`); + await queryRunner.query(`DROP INDEX "public"."IDX_427c350ad49bd3935a50baab73"`); + await queryRunner.query(`ALTER TABLE "albums_shared_users_users" DROP COLUMN "readonly"`); + await queryRunner.query(`CREATE INDEX "IDX_f48513bf9bccefd6ff3ad30bd0" ON "albums_shared_users_users" ("usersId") `); + await queryRunner.query(`CREATE INDEX "IDX_427c350ad49bd3935a50baab73" ON "albums_shared_users_users" ("albumsId") `); + } + +}