/** * set-my-address.use-case.ts * Asigna una colonia al usuario logueado. Valida que la colonia exista * en el catálogo y resuelve el routeId asociado. * * Cumple "validación de domicilio dentro de zona permitida" del reto: * si la colonia no está en el catálogo, no se acepta. */ import { SetAddressDtoValidator } from "../../dtos/index.js"; import { CustomError } from "../../errors/custom.error.js"; import { colonias } from "../../../data/mocks/colonias.mock.js"; import { upsertUser, users } from "../../../data/mocks/users.mock.js"; export interface SetMyAddressResponse { colonia: string; routeId: string; horarioEstimado: string; } export class SetMyAddressUseCase { execute( userId: number, userName: string, userEmail: string, data: unknown, ): SetMyAddressResponse { const dto = SetAddressDtoValidator.validate(data); const match = colonias.find( (c) => c.colonia.toLowerCase() === dto.colonia.toLowerCase(), ); if (!match) { throw CustomError.badRequest( `La colonia "${dto.colonia}" no está dentro de la zona de cobertura`, ); } const existing = users.find((u) => u.id === userId); upsertUser({ id: userId, name: existing?.name ?? userName, email: existing?.email ?? userEmail, colonia: match.colonia, routeId: match.routeId, }); return { colonia: match.colonia, routeId: match.routeId, horarioEstimado: match.horarioEstimado, }; } }