refactor: create album users (#9315)

This commit is contained in:
Jason Rasmussen
2024-05-07 16:38:09 -04:00
committed by GitHub
parent e9f99673b9
commit e79d1b1ec2
18 changed files with 267 additions and 52 deletions

View File

@@ -1,5 +1,6 @@
import { ApiProperty } from '@nestjs/swagger';
import { ArrayNotEmpty, IsEnum, IsString } from 'class-validator';
import { Type } from 'class-transformer';
import { ArrayNotEmpty, IsArray, IsEnum, IsString, ValidateNested } from 'class-validator';
import _ from 'lodash';
import { PropertyLifecycle } from 'src/decorators';
import { AssetResponseDto, mapAsset } from 'src/dtos/asset-response.dto';
@@ -32,6 +33,14 @@ export class AddUsersDto {
albumUsers!: AlbumUserAddDto[];
}
class AlbumUserCreateDto {
@ValidateUUID()
userId!: string;
@IsEnum(AlbumUserRole)
role!: AlbumUserRole;
}
export class CreateAlbumDto {
@IsString()
@ApiProperty()
@@ -41,7 +50,15 @@ export class CreateAlbumDto {
@Optional()
description?: string;
@Optional()
@IsArray()
@ValidateNested({ each: true })
@Type(() => AlbumUserCreateDto)
@PropertyLifecycle({ addedAt: 'v1.104.0' })
albumUsers?: AlbumUserCreateDto[];
@ValidateUUID({ optional: true, each: true })
@PropertyLifecycle({ deprecatedAt: 'v1.104.0' })
sharedWithUserIds?: string[];
@ValidateUUID({ optional: true, each: true })

View File

@@ -281,11 +281,11 @@ export class AlbumRepository implements IAlbumRepository {
.execute();
}
async create(album: Partial<AlbumEntity>): Promise<AlbumEntity> {
create(album: Partial<AlbumEntity>): Promise<AlbumEntity> {
return this.save(album);
}
async update(album: Partial<AlbumEntity>): Promise<AlbumEntity> {
update(album: Partial<AlbumEntity>): Promise<AlbumEntity> {
return this.save(album);
}

View File

@@ -194,7 +194,7 @@ describe(AlbumService.name, () => {
ownerId: authStub.admin.user.id,
albumName: albumStub.empty.albumName,
description: albumStub.empty.description,
albumUsers: [{ user: { id: 'user-id' } }],
albumUsers: [{ userId: 'user-id', role: AlbumUserRole.EDITOR }],
assets: [{ id: '123' }],
albumThumbnailAssetId: '123',
});

View File

@@ -114,7 +114,12 @@ export class AlbumService {
}
async create(auth: AuthDto, dto: CreateAlbumDto): Promise<AlbumResponseDto> {
const albumUsers = dto.albumUsers || [];
for (const userId of dto.sharedWithUserIds || []) {
albumUsers.push({ userId, role: AlbumUserRole.EDITOR });
}
for (const { userId } of albumUsers) {
const exists = await this.userRepository.get(userId, {});
if (!exists) {
throw new BadRequestException('User not found');
@@ -128,7 +133,7 @@ export class AlbumService {
ownerId: auth.user.id,
albumName: dto.albumName,
description: dto.description,
albumUsers: dto.sharedWithUserIds?.map((userId) => ({ user: { id: userId } }) as AlbumUserEntity) ?? [],
albumUsers: albumUsers.map((albumUser) => albumUser as AlbumUserEntity) ?? [],
assets,
albumThumbnailAssetId: assets[0]?.id || null,
});