mirror of
https://github.com/Sea-Haven-Industries/shoc-frontend-new.git
synced 2026-10-02 13:13:12 +00:00
82 lines
2.6 KiB
TypeScript
82 lines
2.6 KiB
TypeScript
|
|
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<WorkOrderTableRow> {
|
||
|
|
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<string, unknown>) : {};
|
||
|
|
|
||
|
|
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<WorkOrderTableRow> =>
|
||
|
|
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<WorkOrderTableRow> =>
|
||
|
|
patchBoardRow("workOrdersApi.updatePoc", "patch", API_PATHS.workOrder.pocPatch(id), payload),
|
||
|
|
};
|