import { API_PATHS } from "@/api/api-paths"; import { ApiError, mapHttpStatusToMessage } from "@/api/api-error"; import { apiRequestRaw } from "@/api/api"; import { BoardPatchConflictError, BoardPatchValidationError, } from "@/domain/work-orders/errors/board-patch-errors"; import { mapWorkOrderTableRow } from "@/domain/work-orders/mappers/work-order-mapper"; import type { WorkOrderBoardPatchPayload, WorkOrderPocPatchPayload, } from "@/domain/work-orders/types/work-order-board"; import type { WorkOrderTableRow } from "@/domain/work-orders/types/work-order-table-row"; /** Shared request/error handling for board row PATCH endpoints (board + poc). */ async function patchBoardRow( operationName: string, method: "patch", url: string, payload: WorkOrderBoardPatchPayload | WorkOrderPocPatchPayload, ): Promise { const response = await apiRequestRaw( method, url, { json: payload, throwHttpErrors: false }, operationName, ); let data: unknown; try { data = await response.json(); } catch { data = undefined; } if (response.ok) { return mapWorkOrderTableRow(data); } const record = typeof data === "object" && data !== null ? (data as Record) : {}; if (response.status === 409) { const currentStateRaw = record.currentState ?? record.CurrentState; const currentState = currentStateRaw != null ? mapWorkOrderTableRow(currentStateRaw) : null; throw new BoardPatchConflictError( typeof record.message === "string" ? record.message : "The record was modified by another user. Refresh and retry.", currentState, ); } if (response.status === 422) { throw new BoardPatchValidationError( typeof record.code === "string" ? record.code : "ValidationError", typeof record.message === "string" ? record.message : mapHttpStatusToMessage(422, data), ); } throw new ApiError(mapHttpStatusToMessage(response.status, data), response.status); } export const workOrderBoardPatchApi = { patchBoardField: async ( id: string | number, payload: WorkOrderBoardPatchPayload, ): Promise => patchBoardRow( "workOrdersApi.patchBoardField", "patch", API_PATHS.workOrder.boardPatch(id), payload, ), /** Manual POC override — same row/error contract as the board patch. */ updatePoc: async ( id: string | number, payload: WorkOrderPocPatchPayload, ): Promise => patchBoardRow("workOrdersApi.updatePoc", "patch", API_PATHS.workOrder.pocPatch(id), payload), };