From 2f1579ed48032136c3a252e227478825d9406ae1 Mon Sep 17 00:00:00 2001 From: andres Date: Sun, 16 Jul 2023 14:59:03 +0200 Subject: [PATCH] add cover to deck create/update --- src/modules/decks/decks.controller.ts | 29 ++++++++++++++++--- src/modules/decks/dto/create-deck.dto.ts | 6 ++-- .../decks/infrastructure/decks.repository.ts | 1 + .../decks/use-cases/create-deck-use-case.ts | 20 +++++++++++-- .../decks/use-cases/update-deck-use-case.ts | 21 ++++++++++++-- 5 files changed, 65 insertions(+), 12 deletions(-) diff --git a/src/modules/decks/decks.controller.ts b/src/modules/decks/decks.controller.ts index 3f0b93e..644839e 100644 --- a/src/modules/decks/decks.controller.ts +++ b/src/modules/decks/decks.controller.ts @@ -40,10 +40,20 @@ export class DecksController { constructor(private readonly decksService: DecksService, private commandBus: CommandBus) {} @UseGuards(JwtAuthGuard) + @UseInterceptors(FileFieldsInterceptor([{ name: 'cover', maxCount: 1 }])) @Post() - create(@Request() req, @Body() createDeckDto: CreateDeckDto) { + create( + @Request() req, + @UploadedFiles() + files: { + cover: Express.Multer.File[] + }, + @Body() createDeckDto: CreateDeckDto + ) { const userId = req.user.id - return this.commandBus.execute(new CreateDeckCommand({ ...createDeckDto, userId: userId })) + return this.commandBus.execute( + new CreateDeckCommand({ ...createDeckDto, userId: userId }, files?.cover?.[0]) + ) } @UseGuards(JwtAuthGuard) @@ -101,9 +111,20 @@ export class DecksController { } @UseGuards(JwtAuthGuard) + @UseInterceptors(FileFieldsInterceptor([{ name: 'cover', maxCount: 1 }])) @Patch(':id') - update(@Param('id') id: string, @Body() updateDeckDto: UpdateDeckDto, @Req() req) { - return this.commandBus.execute(new UpdateDeckCommand(id, updateDeckDto, req.user.id)) + update( + @Param('id') id: string, + @UploadedFiles() + files: { + cover: Express.Multer.File[] + }, + @Body() updateDeckDto: UpdateDeckDto, + @Req() req + ) { + return this.commandBus.execute( + new UpdateDeckCommand(id, updateDeckDto, req.user.id, files?.cover?.[0]) + ) } @UseGuards(JwtAuthGuard) diff --git a/src/modules/decks/dto/create-deck.dto.ts b/src/modules/decks/dto/create-deck.dto.ts index 5547560..f87ff4b 100644 --- a/src/modules/decks/dto/create-deck.dto.ts +++ b/src/modules/decks/dto/create-deck.dto.ts @@ -1,15 +1,17 @@ -import { IsBoolean, IsOptional, IsString, Length } from 'class-validator' +import { IsBoolean, IsOptional, Length } from 'class-validator' +import { Transform } from 'class-transformer' export class CreateDeckDto { @Length(3, 30) name: string @IsOptional() - @IsString() + @Length(0, 0) cover?: string @IsOptional() @IsBoolean() + @Transform((val: string) => [true, 'true', 1, '1'].indexOf(val) > -1) isPrivate?: boolean userId: string diff --git a/src/modules/decks/infrastructure/decks.repository.ts b/src/modules/decks/infrastructure/decks.repository.ts index c643d8e..169eb6d 100644 --- a/src/modules/decks/infrastructure/decks.repository.ts +++ b/src/modules/decks/infrastructure/decks.repository.ts @@ -125,6 +125,7 @@ export class DecksRepository { throw new InternalServerErrorException(e?.message) } } + public async findDeckByCardId(cardId: string) { try { const card = await this.prisma.card.findUnique({ diff --git a/src/modules/decks/use-cases/create-deck-use-case.ts b/src/modules/decks/use-cases/create-deck-use-case.ts index c9754e5..96e3a1d 100644 --- a/src/modules/decks/use-cases/create-deck-use-case.ts +++ b/src/modules/decks/use-cases/create-deck-use-case.ts @@ -1,16 +1,30 @@ import { CommandHandler, ICommandHandler } from '@nestjs/cqrs' import { CreateDeckDto } from '../dto/create-deck.dto' import { DecksRepository } from '../infrastructure/decks.repository' +import { FileUploadService } from '../../../infrastructure/file-upload-service/file-upload.service' export class CreateDeckCommand { - constructor(public readonly deck: CreateDeckDto) {} + constructor(public readonly deck: CreateDeckDto, public readonly cover: Express.Multer.File) {} } @CommandHandler(CreateDeckCommand) export class CreateDeckHandler implements ICommandHandler { - constructor(private readonly deckRepository: DecksRepository) {} + constructor( + private readonly deckRepository: DecksRepository, + private readonly fileUploadService: FileUploadService + ) {} async execute(command: CreateDeckCommand) { - return await this.deckRepository.createDeck(command.deck) + let cover + + if (command.cover) { + const result = await this.fileUploadService.uploadFile( + command.cover.buffer, + command.cover.originalname + ) + cover = result.fileUrl + } + + return await this.deckRepository.createDeck({ ...command.deck, cover }) } } diff --git a/src/modules/decks/use-cases/update-deck-use-case.ts b/src/modules/decks/use-cases/update-deck-use-case.ts index 675ebd4..ae6bc94 100644 --- a/src/modules/decks/use-cases/update-deck-use-case.ts +++ b/src/modules/decks/use-cases/update-deck-use-case.ts @@ -2,18 +2,23 @@ import { CommandHandler, ICommandHandler } from '@nestjs/cqrs' import { DecksRepository } from '../infrastructure/decks.repository' import { UpdateDeckDto } from '../dto/update-deck.dto' import { BadRequestException, NotFoundException } from '@nestjs/common' +import { FileUploadService } from '../../../infrastructure/file-upload-service/file-upload.service' export class UpdateDeckCommand { constructor( public readonly deckId: string, public readonly deck: UpdateDeckDto, - public readonly userId: string + public readonly userId: string, + public readonly cover: Express.Multer.File ) {} } @CommandHandler(UpdateDeckCommand) export class UpdateDeckHandler implements ICommandHandler { - constructor(private readonly deckRepository: DecksRepository) {} + constructor( + private readonly deckRepository: DecksRepository, + private readonly fileUploadService: FileUploadService + ) {} async execute(command: UpdateDeckCommand) { const deck = await this.deckRepository.findDeckById(command.deckId) @@ -24,7 +29,17 @@ export class UpdateDeckHandler implements ICommandHandler { if (deck.userId !== command.userId) { throw new BadRequestException(`You can't modify a deck that you don't own`) } + let cover - return await this.deckRepository.updateDeckById(command.deckId, command.deck) + if (command.cover) { + const result = await this.fileUploadService.uploadFile( + command.cover.buffer, + command.cover.originalname + ) + cover = result.fileUrl + } else if (command.deck.cover === '') { + cover = null + } + return await this.deckRepository.updateDeckById(command.deckId, { ...command.deck, cover }) } }