From 666461346b328d8fd4e44242eda0f1e400fb3665 Mon Sep 17 00:00:00 2001 From: PlatypusPus <23h46.shovin@sjec.ac.in> Date: Fri, 7 Nov 2025 14:38:26 +0530 Subject: [PATCH] feat:Lib Files --- frontend/lib/api.ts | 125 ++++++++++++++++++++++++++++++++++++++ frontend/lib/indexeddb.ts | 73 ++++++++++++++++++++++ 2 files changed, 198 insertions(+) create mode 100644 frontend/lib/api.ts create mode 100644 frontend/lib/indexeddb.ts diff --git a/frontend/lib/api.ts b/frontend/lib/api.ts new file mode 100644 index 0000000..9e65b18 --- /dev/null +++ b/frontend/lib/api.ts @@ -0,0 +1,125 @@ +/** + * API Client for Nordic Privacy AI Backend + * Base URL: http://localhost:8000 + */ + +const API_BASE_URL = process.env.NEXT_PUBLIC_API_URL || 'http://localhost:8000'; + +export interface AnalyzeResponse { + status: string; + filename: string; + dataset_info: { + rows: number; + columns: number; + features: string[]; + }; + model_performance: { + accuracy: number; + precision: number; + recall: number; + f1_score: number; + }; + bias_metrics: { + overall_bias_score: number; + disparate_impact: Record; + statistical_parity: Record; + violations_detected: any[]; + }; + risk_assessment: { + overall_risk_score: number; + privacy_risks: any[]; + ethical_risks: any[]; + compliance_risks: any[]; + data_quality_risks: any[]; + }; + recommendations: string[]; + report_file: string; + timestamp: string; +} + +export interface CleanResponse { + status: string; + filename: string; + dataset_info: { + original_rows: number; + original_columns: number; + cleaned_rows: number; + cleaned_columns: number; + }; + gpu_acceleration: { + enabled: boolean; + device: string; + }; + summary: { + columns_removed: string[]; + columns_anonymized: string[]; + total_cells_affected: number; + }; + pii_detections: Record; + }>; + gdpr_compliance: string[]; + files: { + cleaned_csv: string; + audit_report: string; + }; + timestamp: string; +} + +/** + * Analyze dataset for bias and risk + */ +export async function analyzeDataset(file: File): Promise { + const formData = new FormData(); + formData.append('file', file); + + const response = await fetch(`${API_BASE_URL}/api/analyze`, { + method: 'POST', + body: formData, + }); + + if (!response.ok) { + const error = await response.json(); + throw new Error(error.detail || 'Analysis failed'); + } + + return response.json(); +} + +/** + * Clean dataset - detect and anonymize PII + */ +export async function cleanDataset(file: File): Promise { + const formData = new FormData(); + formData.append('file', file); + + const response = await fetch(`${API_BASE_URL}/api/clean`, { + method: 'POST', + body: formData, + }); + + if (!response.ok) { + const error = await response.json(); + throw new Error(error.detail || 'Cleaning failed'); + } + + return response.json(); +} + +/** + * Download report file + */ +export function getReportUrl(reportPath: string): string { + return `${API_BASE_URL}${reportPath}`; +} + +/** + * Health check + */ +export async function healthCheck() { + const response = await fetch(`${API_BASE_URL}/health`); + return response.json(); +} diff --git a/frontend/lib/indexeddb.ts b/frontend/lib/indexeddb.ts new file mode 100644 index 0000000..d741c95 --- /dev/null +++ b/frontend/lib/indexeddb.ts @@ -0,0 +1,73 @@ +/** + * IndexedDB utilities for caching uploaded files + */ + +const DB_NAME = 'NordicPrivacyAI'; +const STORE_NAME = 'uploads'; +const DB_VERSION = 1; + +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; + if (!db.objectStoreNames.contains(STORE_NAME)) { + db.createObjectStore(STORE_NAME); + } + }; + }); +} + +export interface UploadedFileMeta { + name: string; + size: number; + type: string; + contentPreview: string; +} + +export async function saveLatestUpload(file: File, meta: UploadedFileMeta): Promise { + const db = await openDB(); + const transaction = db.transaction([STORE_NAME], 'readwrite'); + const store = transaction.objectStore(STORE_NAME); + + await new Promise((resolve, reject) => { + const request = store.put({ file, meta }, 'latest'); + request.onsuccess = () => resolve(undefined); + request.onerror = () => reject(request.error); + }); + + db.close(); +} + +export async function getLatestUpload(): Promise<{ file: File; meta: UploadedFileMeta } | { file: null; meta: null }> { + const db = await openDB(); + const transaction = db.transaction([STORE_NAME], 'readonly'); + const store = transaction.objectStore(STORE_NAME); + + const result = await new Promise((resolve, reject) => { + const request = store.get('latest'); + request.onsuccess = () => resolve(request.result); + request.onerror = () => reject(request.error); + }); + + db.close(); + return result || { file: null, meta: null }; +} + +export async function deleteLatestUpload(): Promise { + const db = await openDB(); + const transaction = db.transaction([STORE_NAME], 'readwrite'); + const store = transaction.objectStore(STORE_NAME); + + await new Promise((resolve, reject) => { + const request = store.delete('latest'); + request.onsuccess = () => resolve(undefined); + request.onerror = () => reject(request.error); + }); + + db.close(); +}