import { ISync, EntityType, SyncStatus } from '../types/CalendarTypes'; /** * IEntityService - Generic interface for entity services with sync capabilities * * All entity services (Event, Booking, Customer, Resource) implement this interface * to enable polymorphic operations across different entity types. * * ENCAPSULATION: Services encapsulate sync status manipulation. * SyncManager does NOT directly manipulate entity.syncStatus - it delegates to the service. * * POLYMORPHISM: Both SyncManager and DataSeeder work with Array> * and use entityType property for runtime routing, avoiding switch statements. */ export interface IEntityService { /** * Entity type discriminator for runtime routing * Must match EntityType values: 'Event', 'Booking', 'Customer', 'Resource' */ readonly entityType: EntityType; // ============================================================================ // CRUD Operations (used by DataSeeder and other consumers) // ============================================================================ /** * Get all entities from IndexedDB * Used by DataSeeder to check if store is empty before seeding * * @returns Promise - Array of all entities */ getAll(): Promise; /** * Save an entity (create or update) to IndexedDB * Used by DataSeeder to persist fetched data * * @param entity - Entity to save */ save(entity: T): Promise; // ============================================================================ // SYNC Methods (used by SyncManager) // ============================================================================ /** * Mark entity as successfully synced with backend * Sets syncStatus = 'synced' and persists to IndexedDB * * @param id - Entity ID */ markAsSynced(id: string): Promise; /** * Mark entity as sync error (max retries exceeded) * Sets syncStatus = 'error' and persists to IndexedDB * * @param id - Entity ID */ markAsError(id: string): Promise; /** * Get current sync status for an entity * Used by SyncManager to check entity state * * @param id - Entity ID * @returns SyncStatus or null if entity not found */ getSyncStatus(id: string): Promise; }