2025-12-17 23:54:25 +01:00
|
|
|
import { IStore } from '../IStore';
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* EventStore - IndexedDB ObjectStore definition for calendar events
|
|
|
|
|
*/
|
|
|
|
|
export class EventStore implements IStore {
|
|
|
|
|
static readonly STORE_NAME = 'events';
|
|
|
|
|
readonly storeName = EventStore.STORE_NAME;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Create the events ObjectStore with indexes
|
|
|
|
|
*/
|
|
|
|
|
create(db: IDBDatabase): void {
|
|
|
|
|
const store = db.createObjectStore(EventStore.STORE_NAME, { keyPath: 'id' });
|
|
|
|
|
|
|
|
|
|
// Index: start (for date range queries)
|
|
|
|
|
store.createIndex('start', 'start', { unique: false });
|
|
|
|
|
|
|
|
|
|
// Index: end (for date range queries)
|
|
|
|
|
store.createIndex('end', 'end', { unique: false });
|
|
|
|
|
|
|
|
|
|
// Index: syncStatus (for filtering by sync state)
|
|
|
|
|
store.createIndex('syncStatus', 'syncStatus', { unique: false });
|
|
|
|
|
|
|
|
|
|
// Index: resourceId (for resource-mode filtering)
|
|
|
|
|
store.createIndex('resourceId', 'resourceId', { unique: false });
|
|
|
|
|
|
|
|
|
|
// Index: customerId (for customer-centric queries)
|
|
|
|
|
store.createIndex('customerId', 'customerId', { unique: false });
|
|
|
|
|
|
|
|
|
|
// Index: bookingId (for event-to-booking lookups)
|
|
|
|
|
store.createIndex('bookingId', 'bookingId', { unique: false });
|
|
|
|
|
|
|
|
|
|
// Compound index: startEnd (for optimized range queries)
|
|
|
|
|
store.createIndex('startEnd', ['start', 'end'], { unique: false });
|
|
|
|
|
}
|
|
|
|
|
}
|