diff --git a/packages/backend/src/events/dto/create-event.dto.ts b/packages/backend/src/events/dto/create-event.dto.ts index e78b97e..1e74f91 100644 --- a/packages/backend/src/events/dto/create-event.dto.ts +++ b/packages/backend/src/events/dto/create-event.dto.ts @@ -20,6 +20,17 @@ export class CreateEventDto { @IsString() title: string; + @IsBoolean() + @IsOptional() + @Type(() => Boolean) + @Transform(({ value }) => { + if (typeof value === 'string') { + return value.toLowerCase() === 'true'; + } + return value; + }) + removeEventImage?: boolean; + @ApiProperty({ description: 'Event description', example: 'Event full description', diff --git a/packages/backend/src/events/dto/update-event.dto.ts b/packages/backend/src/events/dto/update-event.dto.ts index 9cc9b2a..ad7b003 100644 --- a/packages/backend/src/events/dto/update-event.dto.ts +++ b/packages/backend/src/events/dto/update-event.dto.ts @@ -1,6 +1,6 @@ import { PartialType } from '@nestjs/swagger'; import { CreateEventDto } from './create-event.dto'; -import { IsBoolean, IsEnum, IsOptional, IsString } from 'class-validator'; +import { IsBoolean, IsEnum, IsOptional } from 'class-validator'; import { EventsTypes } from '@prisma/client'; import { Transform, Type } from 'class-transformer'; @@ -42,7 +42,14 @@ export class UpdateEventDto extends PartialType(CreateEventDto) { }) accept_subscriptions?: boolean; - @IsString() + @IsBoolean() @IsOptional() - removeEventImage?: string; + @Type(() => Boolean) + @Transform(({ value }) => { + if (typeof value === 'string') { + return value.toLowerCase() === 'true'; + } + return value; + }) + removeEventImage?: boolean; } diff --git a/packages/backend/src/events/events.controller.ts b/packages/backend/src/events/events.controller.ts index 4c405c8..7205edf 100644 --- a/packages/backend/src/events/events.controller.ts +++ b/packages/backend/src/events/events.controller.ts @@ -223,18 +223,13 @@ export class EventsController { typeof updateEventDto.accept_subscriptions === 'string' ? updateEventDto.accept_subscriptions === 'true' : updateEventDto.accept_subscriptions, + removeEventImage: + typeof updateEventDto.removeEventImage === 'string' + ? updateEventDto.removeEventImage === 'true' + : updateEventDto.removeEventImage, }; - // Check for file removal flag - // const removeEventImage = updateEventDto.removeEventImage === 'true'; - - return this.eventsService.update( - +id, - user, - updatedEvent, - file, - // removeEventImage, - ); + return this.eventsService.update(+id, user, updatedEvent, file); } @Roles('ADMIN', 'MENTOR') diff --git a/packages/backend/src/events/events.service.ts b/packages/backend/src/events/events.service.ts index eae341c..02fdd4c 100644 --- a/packages/backend/src/events/events.service.ts +++ b/packages/backend/src/events/events.service.ts @@ -294,9 +294,15 @@ export class EventsService { user: JwtPayload, updateEventDto: UpdateEventDto, file: Express.Multer.File | null, - // removeEventImage: boolean = false, ) { try { + // Remove DTO-only fields that are not part of the Prisma model + const { + removeEventImage, // not a DB field + category_id, // handled via relation + ...rest + } = updateEventDto; + // VALIDATE EVENT EXIST OR THROW EXCEPTION const eventToUpdate = await this.findOne(event_id); if (!eventToUpdate) { @@ -315,15 +321,16 @@ export class EventsService { } // VALIDATE CATGORY OR LEAVE IT NULL - const category = updateEventDto.category_id - ? await this.validateEventCategory(updateEventDto.category_id) + const category = category_id + ? await this.validateEventCategory(category_id) : null; // Handle image updates - let imagePath: string | undefined; - - if (file && eventToUpdate.image) { - // Delete existing image file + let imagePath: string | undefined | null; + console.log('FLAG TO REMOVE IMAGE:', removeEventImage); + console.log('imagePat definition:', imagePath); + if ((file && eventToUpdate.image) || removeEventImage) { + // If the event already has an image and a new one is sent: Delete previous image try { await this.filesService.deleteFile(eventToUpdate.image); console.log(`Deleted existing event image: ${eventToUpdate.image}`); @@ -331,23 +338,27 @@ export class EventsService { console.error('Error deleting existing event image:', error); // Continue with update even if file deletion fails } - imagePath = undefined; - } else if (file) { - // Upload new image + imagePath = null; + console.log('imagePat file & img stored || remove falg:', imagePath); + } + if (file) { + // Upload new image (even if there was an error removing the stored one) const uploadedImage = await this.uploadImage(file); imagePath = uploadedImage.path + '/' + uploadedImage.fileName; - } else { - // Keep existing image - imagePath = eventToUpdate.image; + console.log('imagePat if file:', imagePath); } // UPDATE EVENT INFORMATION - const eventData = { - ...updateEventDto, + const eventData: any = { + ...rest, image: imagePath, - category_id: category ? category.id : undefined, }; + // Only update category if provided + if (category) { + eventData.category = { connect: { id: category.id } }; + } + console.log('EVENT DATA TO UPDATE FINAL: ', eventData); const updatedEvent = await this.prisma.events.update({ where: { id: event_id }, data: eventData,