import { Injectable, NotFoundException } from "@nestjs/common"; import { EmailToIdResolver } from "src/Time_And_Attendance/modules/shared/utils/resolve-email-id.utils"; import { PrismaService } from "src/prisma/prisma.service"; import { PresetResponse, ShiftResponse } from "../types/schedule-presets.types"; import { Prisma } from "@prisma/client"; @Injectable() export class SchedulePresetsQueryService { constructor( private readonly prisma: PrismaService, private readonly emailResolver: EmailToIdResolver, ){} async findSchedulePresetsByEmail(email:string): Promise { const employee_id = await this.emailResolver.findIdByEmail(email); if(!employee_id) throw new NotFoundException(`Employee with email: ${email} not found`); try { const presets = await this.prisma.schedulePresets.findMany({ where: { employee_id }, orderBy: [{is_default: 'desc' }, { name: 'asc' }], include: { shifts: { orderBy: [{week_day:'asc'}, { sort_order: 'asc'}], include: { bank_code: { select: { type: true } } }, }, }, }); const hhmm = (date: Date) => date.toISOString().slice(11,16); const response: PresetResponse[] = presets.map((preset) => ({ id: preset.id, name: preset.name, is_default: preset.is_default, shifts: preset.shifts.map((shift)=> ({ week_day: shift.week_day, sort_order: shift.sort_order, start_time: hhmm(shift.start_time), end_time: hhmm(shift.end_time), is_remote: shift.is_remote, type: shift.bank_code?.type, })), })); return response; } catch ( error: unknown) { if(error instanceof Prisma.PrismaClientKnownRequestError) {} throw error; } } }