Skip to content
Merged

Nico #117

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions packages/backend/src/events/dto/create-event.dto.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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',
Expand Down
13 changes: 10 additions & 3 deletions packages/backend/src/events/dto/update-event.dto.ts
Original file line number Diff line number Diff line change
@@ -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';

Expand Down Expand Up @@ -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;
}
15 changes: 5 additions & 10 deletions packages/backend/src/events/events.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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')
Expand Down
43 changes: 27 additions & 16 deletions packages/backend/src/events/events.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -315,39 +321,44 @@ 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}`);
} catch (error) {
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,
Expand Down