import { apiGet, apiPost, apiPostNoContent, apiPut } from "@/api/api"; import { API_PATHS } from "@/api/api-paths"; import { handleApiResponse } from "@/api/handle-api-response"; import { mapCompletionDocTemplates, mapService, mapServices, } from "@/domain/services/mappers/service-mapper"; import type { CompletionDocTemplateOption, Service, ServiceInput, } from "@/domain/services/types/service"; import { WORK_ORDER_TYPE_API } from "@/domain/work-orders/types/work-order-board"; import type { WOType } from "@/domain/work-orders/types/work-order-wizard"; const SERVICE_WORK_ORDER_TYPE_API = { PM: 2, Emergency: 3, Reactive: 6, } as const; // The registry is keyed on PM, Reactive and Emergency; Overdue is PM work the // client never confirmed, so it lists the PM catalog. const TYPE_TO_API: Record = { PM: WORK_ORDER_TYPE_API.PM, Reactive: WORK_ORDER_TYPE_API.Reactive, Emergency: WORK_ORDER_TYPE_API.Emergency, Overdue: WORK_ORDER_TYPE_API.PM, }; function toApiInput(input: ServiceInput) { return { ...input, supportedWorkOrderTypes: input.supportedWorkOrderTypes.map( (type) => SERVICE_WORK_ORDER_TYPE_API[type], ), }; } export const servicesApi = { getAll: async (isActive?: boolean): Promise => { const data = await apiGet(API_PATHS.services.list, { searchParams: isActive === undefined ? undefined : { isActive }, }); return mapServices(handleApiResponse(data)); }, getActive: async (): Promise => { const data = await apiGet(API_PATHS.services.list, { searchParams: { isActive: true }, }); return mapServices(handleApiResponse(data)); }, getActiveForWorkOrderType: async (workOrderType: WOType): Promise => { const data = await apiGet(API_PATHS.services.list, { searchParams: { isActive: true, workOrderType: TYPE_TO_API[workOrderType] }, }); return mapServices(handleApiResponse(data)); }, getCompletionTemplates: async (): Promise => { const data = await apiGet(API_PATHS.workOrder.completionTemplates); return mapCompletionDocTemplates(handleApiResponse(data)); }, create: async (input: ServiceInput): Promise => { const data = await apiPost(API_PATHS.services.list, toApiInput(input)); return mapService(handleApiResponse(data)); }, update: async (id: string | number, input: ServiceInput): Promise => { const data = await apiPut(API_PATHS.services.byId(id), toApiInput(input)); return mapService(handleApiResponse(data)); }, deactivate: async (id: string | number): Promise => { await apiPostNoContent(API_PATHS.services.deactivate(id)); }, };