Spaces:
Running
Running
File size: 4,342 Bytes
9bef28d | 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 123 124 125 126 127 128 129 130 131 132 133 134 135 | /**
* db.js
* IndexedDB-based local storage for Aadhaar History
* Works offline and on static hosts like Netlify.
*/
const DB_NAME = 'AadhaarHistoryDB';
const STORE_NAME = 'history';
const DB_VERSION = 1;
const dbService = {
_db: null,
async init() {
if (this._db) return this._db;
return new Promise((resolve, reject) => {
const request = indexedDB.open(DB_NAME, DB_VERSION);
request.onupgradeneeded = (event) => {
const db = event.target.result;
if (!db.objectStoreNames.contains(STORE_NAME)) {
db.createObjectStore(STORE_NAME, { keyPath: 'id' });
}
};
request.onsuccess = (event) => {
this._db = event.target.result;
resolve(this._db);
};
request.onerror = (event) => {
console.error('IndexedDB error:', event.target.error);
reject(event.target.error);
};
});
},
async getAll() {
const db = await this.init();
return new Promise((resolve, reject) => {
const transaction = db.transaction([STORE_NAME], 'readonly');
const store = transaction.objectStore(STORE_NAME);
const request = store.getAll();
request.onsuccess = () => {
// Sort by timestamp descending (newest first)
const results = request.result || [];
results.sort((a, b) => new Date(b.timestamp) - new Date(a.timestamp));
resolve(results);
};
request.onerror = (event) => {
console.error('Failed to get history:', event.target.error);
resolve([]);
};
});
},
async save(item) {
const db = await this.init();
// Ensure item has ID and Timestamp
if (!item.id) item.id = Date.now().toString();
if (!item.timestamp) item.timestamp = new Date().toLocaleString();
return new Promise((resolve, reject) => {
const transaction = db.transaction([STORE_NAME], 'readwrite');
const store = transaction.objectStore(STORE_NAME);
const request = store.put(item);
request.onsuccess = async () => {
await this.enforceLimit(50);
resolve(item);
};
request.onerror = (event) => {
console.error('Failed to save history:', event.target.error);
reject(event.target.error);
};
});
},
async delete(id) {
const db = await this.init();
return new Promise((resolve, reject) => {
const transaction = db.transaction([STORE_NAME], 'readwrite');
const store = transaction.objectStore(STORE_NAME);
const request = store.delete(id);
request.onsuccess = () => resolve({ status: 'deleted' });
request.onerror = (event) => {
console.error('Failed to delete history:', event.target.error);
reject(event.target.error);
};
});
},
async clear() {
const db = await this.init();
return new Promise((resolve, reject) => {
const transaction = db.transaction([STORE_NAME], 'readwrite');
const store = transaction.objectStore(STORE_NAME);
const request = store.clear();
request.onsuccess = () => resolve();
request.onerror = (event) => reject(event.target.error);
});
},
async enforceLimit(limit = 50) {
const all = await this.getAll();
if (all.length > limit) {
const toDelete = all.slice(limit);
const db = await this.init();
const transaction = db.transaction([STORE_NAME], 'readwrite');
const store = transaction.objectStore(STORE_NAME);
toDelete.forEach(item => {
store.delete(item.id);
});
return new Promise((resolve) => {
transaction.oncomplete = () => resolve();
});
}
return Promise.resolve();
}
};
// Auto-initialize
dbService.init().catch(console.error);
window.dbService = dbService;
|