From 7f5a895c12174f380d0985f04e3621684018602e Mon Sep 17 00:00:00 2001 From: Nicolas Date: Wed, 8 Apr 2026 20:07:32 -0400 Subject: [PATCH] la otra mitad del commit anterior --- .../src/features/training/training.service.ts | 87 ++++++++++++------- 1 file changed, 55 insertions(+), 32 deletions(-) diff --git a/apps/api/src/features/training/training.service.ts b/apps/api/src/features/training/training.service.ts index d11582a..a568a51 100644 --- a/apps/api/src/features/training/training.service.ts +++ b/apps/api/src/features/training/training.service.ts @@ -11,6 +11,16 @@ import { CreateTrainingDto } from './dto/create-training.dto'; import { TrainingStatisticsFilterDto } from './dto/training-statistics-filter.dto'; import { UpdateTrainingDto } from './dto/update-training.dto'; +// TRUE: para mostrar los logs de errores en la api +// Actualmente estás solo en crear registro. Despues lo implemento en los demas +const debug = false; + +type User = { + role: string; + id: number; +}; + + @Injectable() export class TrainingService { constructor( @@ -18,7 +28,8 @@ export class TrainingService { private readonly minioService: MinioService, ) { } - async findAll(paginationDto?: PaginationDto) { + + async findAll(paginationDto?: PaginationDto, user?: User) { const { page = 1, limit = 10, @@ -34,6 +45,10 @@ export class TrainingService { searchCondition = or(ilike(trainingSurveys.ospName, `%${search}%`)); } + if (user?.role == 'coordinators') { + searchCondition = eq(trainingSurveys.createdBy, user.id) + } + const orderBy = sortOrder === 'asc' ? sql`${trainingSurveys[sortBy as keyof typeof trainingSurveys]} asc` @@ -257,50 +272,57 @@ export class TrainingService { } } + // ========== Guardar registro ========== // async create( createTrainingDto: CreateTrainingDto, files: Express.Multer.File[], userId: number, ) { - // 1. Guardar fotos + try { + // 1. Guardar fotos + const photoPaths = await this.saveFiles(files); + // const photoPaths = []; - const photoPaths = await this.saveFiles(files); + // 2. Extraer solo visitDate para formatearlo. + // Ya NO extraemos state, municipality, etc. porque no vienen en el DTO. + const { visitDate, state, municipality, parish, productiveActivityOther, ...rest } = + createTrainingDto; - // 2. Extraer solo visitDate para formatearlo. - // Ya NO extraemos state, municipality, etc. porque no vienen en el DTO. - const { visitDate, state, municipality, parish, productiveActivityOther, ...rest } = - createTrainingDto; + const [newRecord] = await this.drizzle + .insert(trainingSurveys) + .values({ + // Insertamos el resto de datos planos y las listas (arrays) + ...rest, - const [newRecord] = await this.drizzle - .insert(trainingSurveys) - .values({ - // Insertamos el resto de datos planos y las listas (arrays) - ...rest, + // Conversión de fecha + visitDate: new Date(visitDate), - // Conversión de fecha - visitDate: new Date(visitDate), + // Borra las tildes y cambia el texto a mayusculas + productiveActivityOther: productiveActivityOther ? productiveActivityOther.toUpperCase().normalize("NFD").replace(/[\u0300-\u036f]/g, "") : '', - // Borra las tildes y cambia el texto a mayusculas - productiveActivityOther: productiveActivityOther.toUpperCase().normalize("NFD").replace(/[\u0300-\u036f]/g, ""), + // 3. Asignar fotos de forma segura + photo1: photoPaths[0] ?? null, + photo2: photoPaths[1] ?? null, + photo3: photoPaths[2] ?? null, + state: Number(state) ?? null, + municipality: Number(municipality) ?? null, + parish: Number(parish) ?? null, + hasTransport: rest.hasTransport === 'true' ? true : false, + isOpenSpace: rest.isOpenSpace === 'true' ? true : false, + isExporting: rest.isExporting === 'true' ? true : false, + createdBy: userId, + updatedBy: userId, + }) + .returning(); - // 3. Asignar fotos de forma segura - photo1: photoPaths[0] ?? null, - photo2: photoPaths[1] ?? null, - photo3: photoPaths[2] ?? null, - state: Number(state) ?? null, - municipality: Number(municipality) ?? null, - parish: Number(parish) ?? null, - hasTransport: rest.hasTransport === 'true' ? true : false, - isOpenSpace: rest.isOpenSpace === 'true' ? true : false, - isExporting: rest.isExporting === 'true' ? true : false, - createdBy: userId, - updatedBy: userId, - }) - .returning(); - - return newRecord; + return newRecord; + } catch (e) { + if (debug) console.log(e); + return null // null para que de error + } } + // ========== Actualizar registro ========== // async update( id: number, updateTrainingDto: UpdateTrainingDto, @@ -376,6 +398,7 @@ export class TrainingService { return updatedRecord; } + // ========== Eliminar registro ========== // async remove(id: number) { const record = await this.findOne(id);