diff --git a/packages/storage/src/db.ts b/packages/storage/src/db.ts new file mode 100644 index 0000000..a6b2511 --- /dev/null +++ b/packages/storage/src/db.ts @@ -0,0 +1,42 @@ +/** + * IndexedDB schema v1 for GlowTrack + * Exports: openDb(name = 'glowtrack', version = 1) + */ +export async function openDb(name = 'glowtrack', version = 1): Promise { + return await new Promise((resolve, reject) => { + const req = indexedDB.open(name, version); + + req.onupgradeneeded = (ev) => { + const db = req.result; + // v1 stores + // settings: no keyPath; we will store a singleton record with a manual key + if (!db.objectStoreNames.contains('settings')) { + db.createObjectStore('settings'); + } + + // habits: keyPath 'id', index by_type + if (!db.objectStoreNames.contains('habits')) { + const s = db.createObjectStore('habits', { keyPath: 'id' }); + s.createIndex('by_type', 'type', { unique: false }); + } + + // days: keyPath 'date' + if (!db.objectStoreNames.contains('days')) { + db.createObjectStore('days', { keyPath: 'date' }); + } + + // entries: keyPath 'id', indexes by_date, by_habit + if (!db.objectStoreNames.contains('entries')) { + const e = db.createObjectStore('entries', { keyPath: 'id' }); + e.createIndex('by_date', 'date', { unique: false }); + e.createIndex('by_habit', 'habitId', { unique: false }); + } + }; + + req.onsuccess = () => resolve(req.result); + req.onerror = () => reject(req.error); + }); +} + +// Convenience types (re-exported from models in other tasks) to avoid hard dependency +export type OpenDbFn = (name?: string, version?: number) => Promise; diff --git a/specs/001-glowtrack-a-mood/tasks.md b/specs/001-glowtrack-a-mood/tasks.md index c776ac9..67206b7 100644 --- a/specs/001-glowtrack-a-mood/tasks.md +++ b/specs/001-glowtrack-a-mood/tasks.md @@ -116,7 +116,7 @@ From data-model.md → model creation tasks [P] - Export interfaces: WellbeingGrid, GridSettings, ExportSettings, DayTile, Mood, HabitEntry, HabitDefinition - Dependencies: T009-T015 (tests exist), T003 -- [ ] T017 [P] Implement IndexedDB schema v1 +- [X] T017 [P] Implement IndexedDB schema v1 - Create /home/jawz/Development/Projects/GlowTrack/packages/storage/src/db.ts with openDb(name='glowtrack', version=1) - Create stores: settings (key 'singleton'), habits (keyPath 'id', index by_type), days (keyPath 'date'), entries (keyPath 'id', indexes by_date, by_habit) - Dependencies: T016, T010