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 });
}