diff --git a/server/src/dtos/album.dto.ts b/server/src/dtos/album.dto.ts index 4c1e02062..9e0ed2887 100644 --- a/server/src/dtos/album.dto.ts +++ b/server/src/dtos/album.dto.ts @@ -163,16 +163,6 @@ export const mapAlbum = (entity: AlbumEntity, withAssets: boolean, auth?: AuthDt assetCount: entity.assets?.length || 0, isActivityEnabled: entity.isActivityEnabled, order: entity.order, - parentAlbums: entity.parentAlbums?.map((album) => ({ - id: album.id, - albumName: album.albumName, - albumThumbnailAssetId: album.albumThumbnailAssetId, - })), - childAlbums: entity.childAlbums?.map((album) => ({ - id: album.id, - albumName: album.albumName, - albumThumbnailAssetId: album.albumThumbnailAssetId, - })), }; }; diff --git a/server/src/entities/album.entity.ts b/server/src/entities/album.entity.ts index 5b14472e4..80c4ec2e6 100644 --- a/server/src/entities/album.entity.ts +++ b/server/src/entities/album.entity.ts @@ -69,37 +69,13 @@ export class AlbumEntity { @Column({ type: 'varchar', default: AssetOrder.DESC }) order!: AssetOrder; - - @ManyToMany(() => AlbumEntity, (album) => album.parentAlbums) - @JoinTable({ - name: 'sub_albums', - joinColumn: { name: 'childId' }, - inverseJoinColumn: { name: 'parentId' }, - synchronize: false, - }) - parentAlbums!: AlbumEntity[]; - - @ManyToMany(() => AlbumEntity, (album) => album.childAlbums) - @JoinTable({ - name: 'sub_albums', - joinColumn: { name: 'parentId' }, - inverseJoinColumn: { name: 'childId' }, - synchronize: false, - }) - childAlbums!: AlbumEntity[]; } -@Entity('sub_albums', { synchronize: false }) -export class SubAlbumEntity { +@Entity('nested_albums') +export class NestedAlbumEntity { @PrimaryColumn() parentId!: string; @PrimaryColumn() childId!: string; - - @ManyToOne(() => AlbumEntity, (album) => album.childAlbums, { onDelete: 'CASCADE' }) - parent!: AlbumEntity; - - @ManyToOne(() => AlbumEntity, (album) => album.parentAlbums, { onDelete: 'CASCADE' }) - child!: AlbumEntity; } diff --git a/server/src/entities/index.ts b/server/src/entities/index.ts index 7ef727bdd..0332b6826 100644 --- a/server/src/entities/index.ts +++ b/server/src/entities/index.ts @@ -1,5 +1,5 @@ import { ActivityEntity } from 'src/entities/activity.entity'; -import { AlbumEntity, SubAlbumEntity } from 'src/entities/album.entity'; +import { AlbumEntity, NestedAlbumEntity } from 'src/entities/album.entity'; import { APIKeyEntity } from 'src/entities/api-key.entity'; import { AssetFaceEntity } from 'src/entities/asset-face.entity'; import { AssetJobStatusEntity } from 'src/entities/asset-job-status.entity'; @@ -40,7 +40,7 @@ export const entities = [ SharedLinkEntity, SmartInfoEntity, SmartSearchEntity, - SubAlbumEntity, + NestedAlbumEntity, SystemConfigEntity, SystemMetadataEntity, TagEntity, diff --git a/server/src/migrations/1712119327240-AddNestedAlbumRelationship.ts b/server/src/migrations/1712119327240-AddNestedAlbumRelationship.ts deleted file mode 100644 index 01cbed6ee..000000000 --- a/server/src/migrations/1712119327240-AddNestedAlbumRelationship.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { MigrationInterface, QueryRunner } from "typeorm"; - -export class AddNestedAlbumRelationship1712119327240 implements MigrationInterface { - name = 'AddNestedAlbumRelationship1712119327240' - - public async up(queryRunner: QueryRunner): Promise { - await queryRunner.query(`CREATE TABLE "sub_albums" ("parentId" uuid NOT NULL, "childId" uuid NOT NULL, CONSTRAINT "PK_bd5df025a7a641b10bce219dc8d" PRIMARY KEY ("parentId", "childId"))`); - await queryRunner.query(`CREATE INDEX "IDX_b0b854d4c62ed6a4a46cff3b6b" ON "sub_albums" ("childId") `); - await queryRunner.query(`CREATE INDEX "IDX_6aa094f6f0d888c90c418a14d7" ON "sub_albums" ("parentId") `); - await queryRunner.query(`ALTER TABLE "sub_albums" ADD CONSTRAINT "FK_6aa094f6f0d888c90c418a14d70" FOREIGN KEY ("parentId") REFERENCES "albums"("id") ON DELETE CASCADE ON UPDATE NO ACTION`); - await queryRunner.query(`ALTER TABLE "sub_albums" ADD CONSTRAINT "FK_b0b854d4c62ed6a4a46cff3b6b9" FOREIGN KEY ("childId") REFERENCES "albums"("id") ON DELETE CASCADE ON UPDATE NO ACTION`); - } - - public async down(queryRunner: QueryRunner): Promise { - await queryRunner.query(`ALTER TABLE "sub_albums" DROP CONSTRAINT "FK_b0b854d4c62ed6a4a46cff3b6b9"`); - await queryRunner.query(`ALTER TABLE "sub_albums" DROP CONSTRAINT "FK_6aa094f6f0d888c90c418a14d70"`); - await queryRunner.query(`DROP INDEX "public"."IDX_6aa094f6f0d888c90c418a14d7"`); - await queryRunner.query(`DROP INDEX "public"."IDX_b0b854d4c62ed6a4a46cff3b6b"`); - await queryRunner.query(`DROP TABLE "sub_albums"`); - } - -} diff --git a/server/src/migrations/1712155807366-AddNestedAlbumTable.ts b/server/src/migrations/1712155807366-AddNestedAlbumTable.ts new file mode 100644 index 000000000..7a85da01a --- /dev/null +++ b/server/src/migrations/1712155807366-AddNestedAlbumTable.ts @@ -0,0 +1,14 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class AddNestedAlbumTable1712155807366 implements MigrationInterface { + name = 'AddNestedAlbumTable1712155807366' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`CREATE TABLE "nested_albums" ("parentId" character varying NOT NULL, "childId" character varying NOT NULL, CONSTRAINT "PK_702e1e5d9ed4b85d3bdffc934bd" PRIMARY KEY ("parentId", "childId"))`); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`DROP TABLE "nested_albums"`); + } + +} diff --git a/server/src/queries/album.repository.sql b/server/src/queries/album.repository.sql index 5f768e7bd..50f775d2f 100644 --- a/server/src/queries/album.repository.sql +++ b/server/src/queries/album.repository.sql @@ -59,27 +59,7 @@ FROM "AlbumEntity__AlbumEntity_sharedLinks"."allowUpload" AS "AlbumEntity__AlbumEntity_sharedLinks_allowUpload", "AlbumEntity__AlbumEntity_sharedLinks"."allowDownload" AS "AlbumEntity__AlbumEntity_sharedLinks_allowDownload", "AlbumEntity__AlbumEntity_sharedLinks"."showExif" AS "AlbumEntity__AlbumEntity_sharedLinks_showExif", - "AlbumEntity__AlbumEntity_sharedLinks"."albumId" AS "AlbumEntity__AlbumEntity_sharedLinks_albumId", - "AlbumEntity__AlbumEntity_parentAlbums"."id" AS "AlbumEntity__AlbumEntity_parentAlbums_id", - "AlbumEntity__AlbumEntity_parentAlbums"."ownerId" AS "AlbumEntity__AlbumEntity_parentAlbums_ownerId", - "AlbumEntity__AlbumEntity_parentAlbums"."albumName" AS "AlbumEntity__AlbumEntity_parentAlbums_albumName", - "AlbumEntity__AlbumEntity_parentAlbums"."description" AS "AlbumEntity__AlbumEntity_parentAlbums_description", - "AlbumEntity__AlbumEntity_parentAlbums"."createdAt" AS "AlbumEntity__AlbumEntity_parentAlbums_createdAt", - "AlbumEntity__AlbumEntity_parentAlbums"."updatedAt" AS "AlbumEntity__AlbumEntity_parentAlbums_updatedAt", - "AlbumEntity__AlbumEntity_parentAlbums"."deletedAt" AS "AlbumEntity__AlbumEntity_parentAlbums_deletedAt", - "AlbumEntity__AlbumEntity_parentAlbums"."albumThumbnailAssetId" AS "AlbumEntity__AlbumEntity_parentAlbums_albumThumbnailAssetId", - "AlbumEntity__AlbumEntity_parentAlbums"."isActivityEnabled" AS "AlbumEntity__AlbumEntity_parentAlbums_isActivityEnabled", - "AlbumEntity__AlbumEntity_parentAlbums"."order" AS "AlbumEntity__AlbumEntity_parentAlbums_order", - "AlbumEntity__AlbumEntity_childAlbums"."id" AS "AlbumEntity__AlbumEntity_childAlbums_id", - "AlbumEntity__AlbumEntity_childAlbums"."ownerId" AS "AlbumEntity__AlbumEntity_childAlbums_ownerId", - "AlbumEntity__AlbumEntity_childAlbums"."albumName" AS "AlbumEntity__AlbumEntity_childAlbums_albumName", - "AlbumEntity__AlbumEntity_childAlbums"."description" AS "AlbumEntity__AlbumEntity_childAlbums_description", - "AlbumEntity__AlbumEntity_childAlbums"."createdAt" AS "AlbumEntity__AlbumEntity_childAlbums_createdAt", - "AlbumEntity__AlbumEntity_childAlbums"."updatedAt" AS "AlbumEntity__AlbumEntity_childAlbums_updatedAt", - "AlbumEntity__AlbumEntity_childAlbums"."deletedAt" AS "AlbumEntity__AlbumEntity_childAlbums_deletedAt", - "AlbumEntity__AlbumEntity_childAlbums"."albumThumbnailAssetId" AS "AlbumEntity__AlbumEntity_childAlbums_albumThumbnailAssetId", - "AlbumEntity__AlbumEntity_childAlbums"."isActivityEnabled" AS "AlbumEntity__AlbumEntity_childAlbums_isActivityEnabled", - "AlbumEntity__AlbumEntity_childAlbums"."order" AS "AlbumEntity__AlbumEntity_childAlbums_order" + "AlbumEntity__AlbumEntity_sharedLinks"."albumId" AS "AlbumEntity__AlbumEntity_sharedLinks_albumId" FROM "albums" "AlbumEntity" LEFT JOIN "users" "AlbumEntity__AlbumEntity_owner" ON "AlbumEntity__AlbumEntity_owner"."id" = "AlbumEntity"."ownerId" @@ -92,16 +72,6 @@ FROM "AlbumEntity__AlbumEntity_sharedUsers"."deletedAt" IS NULL ) LEFT JOIN "shared_links" "AlbumEntity__AlbumEntity_sharedLinks" ON "AlbumEntity__AlbumEntity_sharedLinks"."albumId" = "AlbumEntity"."id" - LEFT JOIN "sub_albums" "AlbumEntity_AlbumEntity__AlbumEntity_parentAlbums" ON "AlbumEntity_AlbumEntity__AlbumEntity_parentAlbums"."childId" = "AlbumEntity"."id" - LEFT JOIN "albums" "AlbumEntity__AlbumEntity_parentAlbums" ON "AlbumEntity__AlbumEntity_parentAlbums"."id" = "AlbumEntity_AlbumEntity__AlbumEntity_parentAlbums"."parentId" - AND ( - "AlbumEntity__AlbumEntity_parentAlbums"."deletedAt" IS NULL - ) - LEFT JOIN "sub_albums" "AlbumEntity_AlbumEntity__AlbumEntity_childAlbums" ON "AlbumEntity_AlbumEntity__AlbumEntity_childAlbums"."parentId" = "AlbumEntity"."id" - LEFT JOIN "albums" "AlbumEntity__AlbumEntity_childAlbums" ON "AlbumEntity__AlbumEntity_childAlbums"."id" = "AlbumEntity_AlbumEntity__AlbumEntity_childAlbums"."childId" - AND ( - "AlbumEntity__AlbumEntity_childAlbums"."deletedAt" IS NULL - ) WHERE ((("AlbumEntity"."id" = $1))) AND ("AlbumEntity"."deletedAt" IS NULL) diff --git a/server/src/repositories/album.repository.ts b/server/src/repositories/album.repository.ts index e523ff2d7..bbaab2a12 100644 --- a/server/src/repositories/album.repository.ts +++ b/server/src/repositories/album.repository.ts @@ -3,7 +3,7 @@ import { InjectDataSource, InjectRepository } from '@nestjs/typeorm'; import _ from 'lodash'; import { dataSource } from 'src/database.config'; import { Chunked, ChunkedArray, DATABASE_PARAMETER_CHUNK_SIZE, DummyValue, GenerateSql } from 'src/decorators'; -import { AlbumEntity, SubAlbumEntity } from 'src/entities/album.entity'; +import { AlbumEntity } from 'src/entities/album.entity'; import { AssetEntity } from 'src/entities/asset.entity'; import { AlbumAsset, AlbumAssetCount, AlbumInfoOptions, IAlbumRepository } from 'src/interfaces/album.interface'; import { Instrumentation } from 'src/utils/instrumentation'; @@ -16,7 +16,6 @@ export class AlbumRepository implements IAlbumRepository { constructor( @InjectRepository(AssetEntity) private assetRepository: Repository, @InjectRepository(AlbumEntity) private repository: Repository, - @InjectRepository(SubAlbumEntity) private subAlbumRepository: Repository, @InjectDataSource() private dataSource: DataSource, ) {} @@ -27,8 +26,6 @@ export class AlbumRepository implements IAlbumRepository { sharedUsers: true, assets: false, sharedLinks: true, - parentAlbums: true, - childAlbums: true, }; const order: FindOptionsOrder = {};