File size: 3,823 Bytes
65d68f5 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 | import { apiDelete, apiGet, apiPatch, apiPost, apiUpload } from "@/lib/api/client";
import { withDemoFallback } from "@/lib/api/mode";
import type {
ApiDocument,
DocumentChunksListResponse,
DocumentPreview,
DocumentUploadInput,
GenerationResponse,
RetrievalRequest,
RetrievalResponse,
StudyMapOutput,
} from "@/lib/api/types";
import { getPublicDemoMode } from "@/lib/env";
import {
getLocalDocument,
getLocalDocumentChunks,
getLocalDocumentPreview,
getLocalDocuments,
retrieveLocalDocumentChunks,
} from "@/lib/frontend-local-store";
export async function listDocuments() {
if (getPublicDemoMode() === "demo") {
return getLocalDocuments();
}
return withDemoFallback(
() => apiGet<ApiDocument[]>("/documents"),
() => getLocalDocuments(),
);
}
export async function getDocument(documentId: string) {
if (getPublicDemoMode() === "demo") {
const localDocument = getLocalDocument(documentId);
if (localDocument) return localDocument;
}
return withDemoFallback(
() => apiGet<ApiDocument>(`/documents/${documentId}`),
() => {
const localDocument = getLocalDocument(documentId);
if (!localDocument) throw new Error("Source was not found.");
return localDocument;
},
);
}
export async function getDocumentPreview(documentId: string) {
if (getPublicDemoMode() === "demo") {
return getLocalDocumentPreview(documentId);
}
return withDemoFallback(
() => apiGet<DocumentPreview>(`/documents/${documentId}/preview`),
() => getLocalDocumentPreview(documentId),
);
}
export async function listDocumentChunks(documentId: string) {
if (getPublicDemoMode() === "demo") {
return getLocalDocumentChunks(documentId);
}
return withDemoFallback(
() => apiGet<DocumentChunksListResponse>(`/documents/${documentId}/chunks`),
() => getLocalDocumentChunks(documentId),
);
}
export async function retrieveDocumentChunks(
documentId: string,
payload: RetrievalRequest,
) {
if (getPublicDemoMode() === "demo") {
return retrieveLocalDocumentChunks(documentId, payload.query, payload.limit);
}
return withDemoFallback(
() => apiPost<RetrievalResponse, RetrievalRequest>(
`/documents/${documentId}/retrieve`,
payload,
),
() => retrieveLocalDocumentChunks(documentId, payload.query, payload.limit),
);
}
export async function createStudyMap(documentId: string, language = "English") {
return apiPost<GenerationResponse<StudyMapOutput>, Record<string, never>>(
`/documents/${documentId}/study-map?language=${encodeURIComponent(language)}`,
{},
{ timeoutMs: 60000 },
);
}
export async function reclassifyDocument(documentId: string, materialType: string) {
return apiPatch<ApiDocument, { material_type: string }>(
`/documents/${documentId}/material-type`,
{ material_type: materialType },
);
}
export async function deleteDocument(documentId: string) {
// /documents/{id} (not /sources/{id}) — it also cleans up derived
// generations/quizzes/flashcards and detaches video/profile references.
return apiDelete<void>(`/documents/${documentId}`);
}
export async function retryDocumentProcessing(documentId: string) {
return apiPost<ApiDocument, Record<string, never>>(
`/documents/${documentId}/retry-processing`,
{},
{ timeoutMs: 60000 },
);
}
export async function uploadDocument(input: DocumentUploadInput) {
const formData = new FormData();
formData.append("file", input.file);
if (input.title) formData.append("title", input.title);
if (input.subject) formData.append("subject", input.subject);
if (input.chapter) formData.append("chapter", input.chapter);
if (input.syllabus) formData.append("syllabus", input.syllabus);
return apiUpload<ApiDocument>("/documents/upload", formData, { timeoutMs: 60000 });
}
|