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;