Calendar/src/workers/DataSeeder.ts
Janus C. H. Knudsen 863b433eba Refactors calendar project structure and build configuration
Consolidates V2 codebase into main project directory
Updates build script to support simplified entry points
Removes redundant files and cleans up project organization

Simplifies module imports and entry points for calendar application
2025-12-17 23:54:25 +01:00

73 lines
2.4 KiB
TypeScript

import { IApiRepository } from '../repositories/IApiRepository';
import { IEntityService } from '../storage/IEntityService';
import { ISync } from '../types/CalendarTypes';
/**
* DataSeeder - Orchestrates initial data loading from repositories into IndexedDB
*
* ARCHITECTURE:
* - Repository (Mock/Api): Fetches data from source (JSON file or backend API)
* - DataSeeder (this class): Orchestrates fetch + save operations
* - Service (EventService, etc.): Saves data to IndexedDB
*
* POLYMORPHIC DESIGN:
* - Uses arrays of IEntityService[] and IApiRepository[]
* - Matches services with repositories using entityType property
* - Open/Closed Principle: Adding new entity requires no code changes here
*/
export class DataSeeder {
constructor(
private services: IEntityService<ISync>[],
private repositories: IApiRepository<ISync>[]
) {}
/**
* Seed all entity stores if they are empty
*/
async seedIfEmpty(): Promise<void> {
console.log('[DataSeeder] Checking if database needs seeding...');
try {
for (const service of this.services) {
const repository = this.repositories.find(repo => repo.entityType === service.entityType);
if (!repository) {
console.warn(`[DataSeeder] No repository found for entity type: ${service.entityType}, skipping`);
continue;
}
await this.seedEntity(service.entityType, service, repository);
}
console.log('[DataSeeder] Seeding complete');
} catch (error) {
console.error('[DataSeeder] Seeding failed:', error);
throw error;
}
}
private async seedEntity<T extends ISync>(
entityType: string,
service: IEntityService<T>,
repository: IApiRepository<T>
): Promise<void> {
const existing = await service.getAll();
if (existing.length > 0) {
console.log(`[DataSeeder] ${entityType} store already has ${existing.length} items, skipping seed`);
return;
}
console.log(`[DataSeeder] ${entityType} store is empty, fetching from repository...`);
const data = await repository.fetchAll();
console.log(`[DataSeeder] Fetched ${data.length} ${entityType} items, saving to IndexedDB...`);
for (const entity of data) {
await service.save(entity, true); // silent = true to skip audit logging
}
console.log(`[DataSeeder] ${entityType} seeding complete (${data.length} items saved)`);
}
}