diff --git a/.gitignore b/.gitignore index 44cf1b7..c025570 100644 --- a/.gitignore +++ b/.gitignore @@ -11,7 +11,7 @@ dist/ downloads/ eggs/ .eggs/ -lib/ + lib64/ parts/ sdist/ diff --git a/frontend/nordic-privacy-ai/lib/idb.ts b/frontend/nordic-privacy-ai/lib/idb.ts new file mode 100644 index 0000000..507b85a --- /dev/null +++ b/frontend/nordic-privacy-ai/lib/idb.ts @@ -0,0 +1,113 @@ +/** + * IndexedDB utilities for persisting file uploads in the browser. + * Stores the latest uploaded file and its metadata for recovery across sessions. + */ + +const DB_NAME = "NordicPrivacyAI"; +const DB_VERSION = 1; +const STORE_NAME = "latestUpload"; + +interface UploadedFileMeta { + name: string; + size: number; + type: string; + contentPreview: string; +} + +interface LatestUploadData { + file: File; + meta: UploadedFileMeta; + timestamp: number; +} + +/** + * Open or create the IndexedDB database + */ +function openDB(): Promise { + return new Promise((resolve, reject) => { + const request = indexedDB.open(DB_NAME, DB_VERSION); + + request.onerror = () => reject(request.error); + request.onsuccess = () => resolve(request.result); + + request.onupgradeneeded = (event) => { + const db = (event.target as IDBOpenDBRequest).result; + + // Create object store if it doesn't exist + if (!db.objectStoreNames.contains(STORE_NAME)) { + db.createObjectStore(STORE_NAME); + } + }; + }); +} + +/** + * Save the latest uploaded file and its metadata to IndexedDB + */ +export async function saveLatestUpload( + file: File, + meta: UploadedFileMeta +): Promise { + const db = await openDB(); + + return new Promise((resolve, reject) => { + const transaction = db.transaction([STORE_NAME], "readwrite"); + const store = transaction.objectStore(STORE_NAME); + + const data: LatestUploadData = { + file, + meta, + timestamp: Date.now(), + }; + + const request = store.put(data, "latest"); + + request.onerror = () => reject(request.error); + request.onsuccess = () => resolve(); + + transaction.oncomplete = () => db.close(); + }); +} + +/** + * Retrieve the latest uploaded file and metadata from IndexedDB + */ +export async function getLatestUpload(): Promise { + const db = await openDB(); + + return new Promise((resolve, reject) => { + const transaction = db.transaction([STORE_NAME], "readonly"); + const store = transaction.objectStore(STORE_NAME); + const request = store.get("latest"); + + request.onerror = () => reject(request.error); + request.onsuccess = () => { + const result = request.result as LatestUploadData | undefined; + if (result) { + resolve(result); + } else { + reject(new Error("No cached upload found")); + } + }; + + transaction.oncomplete = () => db.close(); + }); +} + +/** + * Delete the latest upload from IndexedDB + */ +export async function deleteLatestUpload(): Promise { + const db = await openDB(); + + return new Promise((resolve, reject) => { + const transaction = db.transaction([STORE_NAME], "readwrite"); + const store = transaction.objectStore(STORE_NAME); + const request = store.delete("latest"); + + request.onerror = () => reject(request.error); + request.onsuccess = () => resolve(); + + transaction.oncomplete = () => db.close(); + }); +}