/** * DMS plugin API client. * * All requests use the shared `apiClient` (`baseURL: '/api/v1'`) and target the * DMS plugin routes under `/dms/...`. */ import { apiClient, apiDelete, apiGet, apiPatch, apiPost } from './client'; // ─── Types ───────────────────────────────────────────────────────────────── export interface DmsFolder { id: string; name: string; parent_id: string | null; created_by: string; created_at?: string | null; updated_at?: string | null; children?: DmsFolder[]; file_count?: number; } export interface DmsFile { id: string; folder_id: string | null; name: string; mime_type: string; size: number; storage_path: string; checksum?: string | null; deleted_at: string | null; created_by: string; created_at?: string | null; updated_at?: string | null; shared_with?: string[]; permissions?: FilePermission[]; } export interface FilePermission { id: string; file_id: string; user_id: string | null; group_id: string | null; permission: 'read' | 'write' | 'admin'; created_at?: string | null; } export interface DmsShare { id: string; file_id: string; user_id?: string | null; group_id?: string | null; permission: 'read' | 'write'; created_at?: string | null; } export interface ShareLink { id: string; file_id: string; token: string; url: string; password_protected: boolean; expires_at: string | null; created_at?: string | null; } export interface EditSession { id: string; file_id: string; session_token: string; editor_url: string; expires_at: string; } export interface SearchResult { files: DmsFile[]; total: number; } // ─── Payloads ────────────────────────────────────────────────────────────── export interface CreateFolderPayload { name: string; parent_id?: string | null; } export interface UpdateFolderPayload { name?: string; parent_id?: string | null; } export interface UpdateFilePayload { name?: string; folder_id?: string | null; } export interface SharePayload { user_id?: string; group_id?: string; permission: 'read' | 'write'; } export interface BulkMovePayload { file_ids: string[]; target_folder_id: string | null; } export interface BulkDeletePayload { file_ids: string[]; } export interface ShareLinkPayload { password?: string; expires_at?: string | null; } // ─── Folders ─────────────────────────────────────────────────────────────── export function fetchFolders(): Promise { return apiGet('/dms/folders'); } export function createFolder(payload: CreateFolderPayload): Promise { return apiPost('/dms/folders', payload); } export function updateFolder(folderId: string, payload: UpdateFolderPayload): Promise { return apiPatch(`/dms/folders/${folderId}`, payload); } export function deleteFolder(folderId: string): Promise { return apiDelete(`/dms/folders/${folderId}`); } // ─── Files ───────────────────────────────────────────────────────────────── export function uploadFile( file: File, folderId?: string | null ): Promise { const form = new FormData(); form.append('file', file); if (folderId) form.append('folder_id', folderId); return apiPost('/dms/files/upload', form, { headers: { 'Content-Type': 'multipart/form-data' }, }); } export function getFile(fileId: string): Promise { return apiGet(`/dms/files/${fileId}`); } export function updateFile(fileId: string, payload: UpdateFilePayload): Promise { return apiPatch(`/dms/files/${fileId}`, payload); } export function deleteFile(fileId: string): Promise { return apiDelete(`/dms/files/${fileId}`); } export function restoreFile(fileId: string): Promise { return apiPost(`/dms/files/${fileId}/restore`); } export function getFilePreviewUrl(fileId: string): string { return `/api/v1/dms/files/${fileId}/preview`; } export function createEditSession(fileId: string): Promise { return apiPost(`/dms/files/${fileId}/edit-session`); } export function shareFile(fileId: string, payload: SharePayload): Promise { return apiPost(`/dms/files/${fileId}/share`, payload); } export function removeShare(fileId: string, shareId: string): Promise { return apiDelete(`/dms/files/${fileId}/share`, { data: { share_id: shareId } }); } // ─── Search & Shared ─────────────────────────────────────────────────────── export function searchFiles(query: string): Promise { const qs = new URLSearchParams({ q: query }).toString(); return apiGet(`/dms/search?${qs}`); } export function getSharedWithMe(): Promise { return apiGet('/dms/shared-with-me'); } // ─── Bulk Operations ─────────────────────────────────────────────────────── export function bulkMoveFiles(payload: BulkMovePayload): Promise { return apiPost('/dms/files/bulk-move', payload); } export function bulkDeleteFiles(payload: BulkDeletePayload): Promise { return apiPost('/dms/files/bulk-delete', payload); }