mirror of
https://github.com/Tria-plc/edr-platform.git
synced 2026-09-07 23:35:42 +00:00
75 lines
2.1 KiB
TypeScript
75 lines
2.1 KiB
TypeScript
import type { Publication } from "@edr/types";
|
|
|
|
import { api as client } from "../auth/http";
|
|
|
|
const BASE = "/publications";
|
|
|
|
export interface UpdatePublicationPayload {
|
|
title?: string;
|
|
description?: string;
|
|
category?: string;
|
|
sortOrder?: number;
|
|
published?: boolean;
|
|
}
|
|
|
|
/**
|
|
* The freight portal's public document library (/publications), managed here.
|
|
* Every write is multipart because create/replaceFile carry a real file — the
|
|
* client's response interceptor already unwraps the `{ success, data }`
|
|
* envelope, so each method stays a one-liner.
|
|
*/
|
|
export const publicationsService = {
|
|
async list(): Promise<Publication[]> {
|
|
const { data } = await client.get<Publication[]>(`${BASE}/admin`);
|
|
return data;
|
|
},
|
|
|
|
async create(
|
|
file: File,
|
|
meta: UpdatePublicationPayload & { title: string },
|
|
onProgress?: (percent: number | null) => void,
|
|
): Promise<Publication> {
|
|
const form = new FormData();
|
|
form.append("file", file);
|
|
Object.entries(meta).forEach(([key, value]) => {
|
|
if (value !== undefined) form.append(key, String(value));
|
|
});
|
|
|
|
const { data } = await client.post<Publication>(BASE, form, {
|
|
timeout: 2 * 60 * 1000,
|
|
onUploadProgress: (event) =>
|
|
onProgress?.(
|
|
event.total ? Math.round((event.loaded / event.total) * 100) : null,
|
|
),
|
|
});
|
|
return data;
|
|
},
|
|
|
|
async update(id: string, dto: UpdatePublicationPayload): Promise<Publication> {
|
|
const { data } = await client.patch<Publication>(`${BASE}/${id}`, dto);
|
|
return data;
|
|
},
|
|
|
|
async replaceFile(
|
|
id: string,
|
|
file: File,
|
|
onProgress?: (percent: number | null) => void,
|
|
): Promise<Publication> {
|
|
const form = new FormData();
|
|
form.append("file", file);
|
|
|
|
const { data } = await client.post<Publication>(`${BASE}/${id}/file`, form, {
|
|
timeout: 2 * 60 * 1000,
|
|
onUploadProgress: (event) =>
|
|
onProgress?.(
|
|
event.total ? Math.round((event.loaded / event.total) * 100) : null,
|
|
),
|
|
});
|
|
return data;
|
|
},
|
|
|
|
async remove(id: string): Promise<void> {
|
|
await client.delete(`${BASE}/${id}`);
|
|
},
|
|
};
|