feat(work-orders): fetch Extra Docs via authenticated content GET

This commit is contained in:
Arthur Bassi 2026-09-08 11:31:12 -03:00
parent 599e38aae3
commit edf4a51d4c
2 changed files with 59 additions and 0 deletions

View file

@ -199,6 +199,27 @@ export const workOrderBoardDocumentsApi = {
throwDocumentHttpError(response, data);
},
getMediaContent: async (
workOrderId: string | number,
mediaId: string | number,
): Promise<Blob> => {
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: {

View file

@ -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.",
});
});
});