From c4d6a09c05b799d3fb1d8fbdd94e03d9355e2fd9 Mon Sep 17 00:00:00 2001 From: mgabor <> Date: Fri, 12 Apr 2024 16:50:17 +0200 Subject: [PATCH] add album permission repository --- .../interfaces/album-permission.interface.ts | 13 ++++++++ .../album-permission.repository.ts | 30 +++++++++++++++++++ server/src/repositories/index.ts | 3 ++ server/src/services/album.service.ts | 20 +++++-------- 4 files changed, 53 insertions(+), 13 deletions(-) create mode 100644 server/src/interfaces/album-permission.interface.ts create mode 100644 server/src/repositories/album-permission.repository.ts diff --git a/server/src/interfaces/album-permission.interface.ts b/server/src/interfaces/album-permission.interface.ts new file mode 100644 index 0000000000..92ed502a82 --- /dev/null +++ b/server/src/interfaces/album-permission.interface.ts @@ -0,0 +1,13 @@ +import { AlbumPermissionEntity } from 'src/entities/album-permission.entity'; + +export const IAlbumPermissionRepository = 'IAlbumPermissionRepository'; + +export interface IAlbumPermissionRepository { + create(albumPermission: Partial): Promise; + update( + userId: string, + albumId: string, + albumPermission: Partial, + ): Promise; + delete(userId: string, albumId: string): Promise; +} diff --git a/server/src/repositories/album-permission.repository.ts b/server/src/repositories/album-permission.repository.ts new file mode 100644 index 0000000000..9b98153f4c --- /dev/null +++ b/server/src/repositories/album-permission.repository.ts @@ -0,0 +1,30 @@ +import { Injectable } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { DummyValue, GenerateSql } from 'src/decorators'; +import { AlbumPermissionEntity } from 'src/entities/album-permission.entity'; +import { IAlbumPermissionRepository } from 'src/interfaces/album-permission.interface'; +import { Instrumentation } from 'src/utils/instrumentation'; +import { Repository } from 'typeorm'; + +@Instrumentation() +@Injectable() +export class AlbumPermissionRepository implements IAlbumPermissionRepository { + constructor(@InjectRepository(AlbumPermissionEntity) private repository: Repository) {} + + async create(dto: Partial): Promise { + const { users, albums } = await this.repository.save(dto); + return this.repository.findOneOrFail({ where: { users, albums }, relations: { users: true } }); + } + + async update(userId: string, albumId: string, dto: Partial): Promise { + await this.repository.update({ users: { id: userId }, albums: { id: albumId } }, dto); + return this.repository.findOneOrFail({ + where: { users: { id: userId }, albums: { id: albumId } }, + relations: { users: true }, + }); + } + + async delete(userId: string, albumId: string): Promise { + await this.repository.delete({ users: { id: userId }, albums: { id: albumId } }); + } +} diff --git a/server/src/repositories/index.ts b/server/src/repositories/index.ts index 336d5df0f0..bd5bd13b4e 100644 --- a/server/src/repositories/index.ts +++ b/server/src/repositories/index.ts @@ -1,5 +1,6 @@ import { IAccessRepository } from 'src/interfaces/access.interface'; import { IActivityRepository } from 'src/interfaces/activity.interface'; +import { IAlbumPermissionRepository } from 'src/interfaces/album-permission.interface'; import { IAlbumRepository } from 'src/interfaces/album.interface'; import { IKeyRepository } from 'src/interfaces/api-key.interface'; import { IAssetStackRepository } from 'src/interfaces/asset-stack.interface'; @@ -30,6 +31,7 @@ import { IUserTokenRepository } from 'src/interfaces/user-token.interface'; import { IUserRepository } from 'src/interfaces/user.interface'; import { AccessRepository } from 'src/repositories/access.repository'; import { ActivityRepository } from 'src/repositories/activity.repository'; +import { AlbumPermissionRepository } from 'src/repositories/album-permission.repository'; import { AlbumRepository } from 'src/repositories/album.repository'; import { ApiKeyRepository } from 'src/repositories/api-key.repository'; import { AssetStackRepository } from 'src/repositories/asset-stack.repository'; @@ -63,6 +65,7 @@ export const repositories = [ { provide: IActivityRepository, useClass: ActivityRepository }, { provide: IAccessRepository, useClass: AccessRepository }, { provide: IAlbumRepository, useClass: AlbumRepository }, + { provide: IAlbumPermissionRepository, useClass: AlbumPermissionRepository }, { provide: IAssetRepository, useClass: AssetRepository }, { provide: IAssetRepositoryV1, useClass: AssetRepositoryV1 }, { provide: IAssetStackRepository, useClass: AssetStackRepository }, diff --git a/server/src/services/album.service.ts b/server/src/services/album.service.ts index c5f4215a73..b55131aa19 100644 --- a/server/src/services/album.service.ts +++ b/server/src/services/album.service.ts @@ -18,6 +18,7 @@ import { AlbumPermissionEntity } from 'src/entities/album-permission.entity'; import { AlbumEntity } from 'src/entities/album.entity'; import { AssetEntity } from 'src/entities/asset.entity'; import { IAccessRepository } from 'src/interfaces/access.interface'; +import { IAlbumPermissionRepository } from 'src/interfaces/album-permission.interface'; import { AlbumAssetCount, AlbumInfoOptions, IAlbumRepository } from 'src/interfaces/album.interface'; import { IAssetRepository } from 'src/interfaces/asset.interface'; import { IUserRepository } from 'src/interfaces/user.interface'; @@ -31,6 +32,7 @@ export class AlbumService { @Inject(IAlbumRepository) private albumRepository: IAlbumRepository, @Inject(IAssetRepository) private assetRepository: IAssetRepository, @Inject(IUserRepository) private userRepository: IUserRepository, + @Inject(IAlbumPermissionRepository) private albumPermissionRepository: IAlbumPermissionRepository, ) { this.access = AccessCore.create(accessRepository); } @@ -227,16 +229,12 @@ export class AlbumService { throw new BadRequestException('User not found'); } - album.albumPermissions.push({ users: { id: userId } } as AlbumPermissionEntity); + album.albumPermissions.push( + await this.albumPermissionRepository.create({ users: { id: userId }, albums: { id } } as AlbumPermissionEntity), + ); } - return this.albumRepository - .update({ - id: album.id, - updatedAt: new Date(), - albumPermissions: album.albumPermissions, - }) - .then(mapAlbumWithoutAssets); + return mapAlbumWithoutAssets(album); } async removeUser(auth: AuthDto, id: string, userId: string | 'me'): Promise { @@ -260,11 +258,7 @@ export class AlbumService { await this.access.requirePermission(auth, Permission.ALBUM_SHARE, id); } - await this.albumRepository.update({ - id: album.id, - updatedAt: new Date(), - albumPermissions: album.albumPermissions.filter(({ users: { id } }) => id !== userId), - }); + await this.albumPermissionRepository.delete(userId, id); } private async findOrFail(id: string, options: AlbumInfoOptions) {