From edf4a51d4c5ee2bc382124081e32bacfd3066516 Mon Sep 17 00:00:00 2001 From: Arthur Bassi Date: Tue, 8 Sep 2026 11:31:12 -0300 Subject: [PATCH] feat(work-orders): fetch Extra Docs via authenticated content GET --- .../api/work-order-board-documents-api.ts | 21 ++++++++++ .../work-orders/api/work-orders-api.test.ts | 38 +++++++++++++++++++ 2 files changed, 59 insertions(+) diff --git a/src/domain/work-orders/api/work-order-board-documents-api.ts b/src/domain/work-orders/api/work-order-board-documents-api.ts index 97ca0d2b..7b185607 100644 --- a/src/domain/work-orders/api/work-order-board-documents-api.ts +++ b/src/domain/work-orders/api/work-order-board-documents-api.ts @@ -199,6 +199,27 @@ export const workOrderBoardDocumentsApi = { throwDocumentHttpError(response, data); }, + getMediaContent: async ( + workOrderId: string | number, + mediaId: string | number, + ): Promise => { + const response = await api.get(API_PATHS.workOrder.mediaContent(workOrderId, mediaId), { + credentials: "include", + throwHttpErrors: false, + }); + + if (response.ok) { + return response.blob(); + } + + if (response.status === 404) { + throw new ApiError(mapHttpStatusToMessage(404), 404); + } + + const data = await readResponseJson(response); + throwDocumentHttpError(response, data); + }, + uploadCompletionDoc: async ( workOrderId: string | number, params: { diff --git a/src/test/domain/work-orders/api/work-orders-api.test.ts b/src/test/domain/work-orders/api/work-orders-api.test.ts index 7fa8ac99..ac21b18a 100644 --- a/src/test/domain/work-orders/api/work-orders-api.test.ts +++ b/src/test/domain/work-orders/api/work-orders-api.test.ts @@ -9,6 +9,7 @@ const apiPatch = vi.fn(); const apiPatchFn = vi.fn(); const apiPostFn = vi.fn(); const apiDeleteFn = vi.fn(); +const apiGetFn = vi.fn(); vi.mock("@/api/api", () => ({ apiGet: (...args: unknown[]) => apiGet(...args), @@ -902,3 +903,40 @@ describe("API_PATHS.workOrder.mediaContent", () => { expect(API_PATHS.workOrder.mediaContent(10, 12)).toBe("workorders/10/media/12/content"); }); }); + +describe("workOrdersApi.getMediaContent", () => { + beforeEach(() => { + apiGetFn.mockReset(); + }); + + it("returns the response blob on 200", async () => { + const blob = new Blob(["pdf-bytes"], { type: "application/pdf" }); + apiGetFn.mockResolvedValue({ + ok: true, + status: 200, + blob: async () => blob, + }); + + const result = await workOrdersApi.getMediaContent(10, 12); + + expect(result).toBe(blob); + expect(apiGetFn).toHaveBeenCalledWith( + API_PATHS.workOrder.mediaContent(10, 12), + expect.objectContaining({ credentials: "include", throwHttpErrors: false }), + ); + }); + + it("throws ApiError on 404 without inventing a filename", async () => { + apiGetFn.mockResolvedValue({ + ok: false, + status: 404, + json: async () => ({ fileName: "secret.pdf" }), + }); + + await expect(workOrdersApi.getMediaContent(10, 12)).rejects.toMatchObject({ + name: "ApiError", + status: 404, + message: "The requested resource was not found.", + }); + }); +});