mirror of
https://github.com/Sea-Haven-Industries/shoc-frontend-new.git
synced 2026-10-07 16:19:01 +00:00
refactor(workorders): extract board patch api module
work-orders-api.ts exceeded the 500-line godfile cap after adding updatePoc. Move patchBoardField/updatePoc and their shared response handling into work-order-board-patch-api.ts and re-export through workOrdersApi, mirroring workOrderBoardDocumentsApi.
This commit is contained in:
parent
3b1da21abb
commit
84568dd737
2 changed files with 85 additions and 72 deletions
81
src/domain/work-orders/api/work-order-board-patch-api.ts
Normal file
81
src/domain/work-orders/api/work-order-board-patch-api.ts
Normal file
|
|
@ -0,0 +1,81 @@
|
||||||
|
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),
|
||||||
|
};
|
||||||
|
|
@ -1,12 +1,8 @@
|
||||||
import { API_PATHS } from "@/api/api-paths";
|
import { API_PATHS } from "@/api/api-paths";
|
||||||
import { ApiError, mapHttpStatusToMessage } from "@/api/api-error";
|
import { apiDelete, apiGet, apiPost, apiPostForm, apiPut } from "@/api/api";
|
||||||
import { apiDelete, apiGet, apiPost, apiPostForm, apiPut, apiRequestRaw } from "@/api/api";
|
|
||||||
import { handleApiResponse, handlePaginatedResponse } from "@/api/handle-api-response";
|
import { handleApiResponse, handlePaginatedResponse } from "@/api/handle-api-response";
|
||||||
import {
|
|
||||||
BoardPatchConflictError,
|
|
||||||
BoardPatchValidationError,
|
|
||||||
} from "@/domain/work-orders/errors/board-patch-errors";
|
|
||||||
import { workOrderBoardDocumentsApi } from "@/domain/work-orders/api/work-order-board-documents-api";
|
import { workOrderBoardDocumentsApi } from "@/domain/work-orders/api/work-order-board-documents-api";
|
||||||
|
import { workOrderBoardPatchApi } from "@/domain/work-orders/api/work-order-board-patch-api";
|
||||||
import {
|
import {
|
||||||
mapDispatchComment,
|
mapDispatchComment,
|
||||||
mapDispatchDetail,
|
mapDispatchDetail,
|
||||||
|
|
@ -20,7 +16,6 @@ import {
|
||||||
mapWorkOrderDetail,
|
mapWorkOrderDetail,
|
||||||
mapWorkOrderFormToCreatePayload,
|
mapWorkOrderFormToCreatePayload,
|
||||||
mapWorkOrderFormToUpdateFormData,
|
mapWorkOrderFormToUpdateFormData,
|
||||||
mapWorkOrderTableRow,
|
|
||||||
mapWorkOrderTableRows,
|
mapWorkOrderTableRows,
|
||||||
} from "@/domain/work-orders/mappers/work-order-mapper";
|
} from "@/domain/work-orders/mappers/work-order-mapper";
|
||||||
import { mapWizardDraftToBoardCreatePayload } from "@/domain/work-orders/mappers/work-order-board-mapper";
|
import { mapWizardDraftToBoardCreatePayload } from "@/domain/work-orders/mappers/work-order-board-mapper";
|
||||||
|
|
@ -42,11 +37,9 @@ import type {
|
||||||
import type { WorkOrderWizardDraft } from "@/domain/work-orders/types/work-order-wizard";
|
import type { WorkOrderWizardDraft } from "@/domain/work-orders/types/work-order-wizard";
|
||||||
import type {
|
import type {
|
||||||
WorkOrderBoardListResult,
|
WorkOrderBoardListResult,
|
||||||
WorkOrderBoardPatchPayload,
|
|
||||||
WorkOrderBoardQueryParams,
|
WorkOrderBoardQueryParams,
|
||||||
WorkOrderBoardResponseApi,
|
WorkOrderBoardResponseApi,
|
||||||
WorkOrderBoardSearchQueryParams,
|
WorkOrderBoardSearchQueryParams,
|
||||||
WorkOrderPocPatchPayload,
|
|
||||||
} from "@/domain/work-orders/types/work-order-board";
|
} from "@/domain/work-orders/types/work-order-board";
|
||||||
import type { WorkOrderBoardDetail } from "@/domain/work-orders/types/work-order-board-detail";
|
import type { WorkOrderBoardDetail } from "@/domain/work-orders/types/work-order-board-detail";
|
||||||
import type { WorkOrderTableRow } from "@/domain/work-orders/types/work-order-table-row";
|
import type { WorkOrderTableRow } from "@/domain/work-orders/types/work-order-table-row";
|
||||||
|
|
@ -142,54 +135,6 @@ function mapUser(raw: unknown): WorkOrderUser {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
/** 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 workOrdersApi = {
|
export const workOrdersApi = {
|
||||||
...workOrderBoardDocumentsApi,
|
...workOrderBoardDocumentsApi,
|
||||||
|
|
||||||
|
|
@ -359,23 +304,10 @@ export const workOrdersApi = {
|
||||||
return mapWorkOrderDetail(handleApiResponse(data));
|
return mapWorkOrderDetail(handleApiResponse(data));
|
||||||
},
|
},
|
||||||
|
|
||||||
patchBoardField: async (
|
patchBoardField: workOrderBoardPatchApi.patchBoardField,
|
||||||
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. */
|
/** Manual POC override — same row/error contract as the board patch. */
|
||||||
updatePoc: async (
|
updatePoc: workOrderBoardPatchApi.updatePoc,
|
||||||
id: string | number,
|
|
||||||
payload: WorkOrderPocPatchPayload,
|
|
||||||
): Promise<WorkOrderTableRow> =>
|
|
||||||
patchBoardRow("workOrdersApi.updatePoc", "patch", API_PATHS.workOrder.pocPatch(id), payload),
|
|
||||||
|
|
||||||
update: async (
|
update: async (
|
||||||
id: string | number,
|
id: string | number,
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue