import type { DataAdapter } from "./adapters/interface.js"; import { createAdapter } from "./adapters/config.js"; import type { PageSeo, Page, Navigation, Product } from "./types/index.js"; import type { TranslationsData } from "./adapters/Mock/_i18n/mockTranslations.js"; import { AdapterError } from "./utils/errors.js"; import { cache } from "./utils/cache.js"; import { CacheKeyBuilder } from "./utils/cacheKeys.js"; import { DataServiceHelpers } from "./utils/dataServiceHelpers.js"; /** * DataService - Aggregator für Datenoperationen * Verwendet den konfigurierten Adapter für alle Datenzugriffe * Mit Caching und Fehlerbehandlung */ class DataService { private adapter: DataAdapter; constructor(adapter?: DataAdapter) { this.adapter = adapter || createAdapter(); } /** * Setzt einen neuen Adapter */ async setAdapter(adapter: DataAdapter): Promise { this.adapter = adapter; // Cache leeren bei Adapter-Wechsel await Promise.all([ cache.pages.clear(), cache.pageSeo.clear(), cache.navigation.clear(), cache.products.clear(), ]); } /** * Holt eine einzelne Seite */ async getPage(slug: string, locale?: string): Promise { return DataServiceHelpers.withCacheAndMetrics( "getPage", cache.pages, CacheKeyBuilder.page(slug, locale), () => this.adapter.getPage(slug, locale), `Fehler beim Laden der Seite '${slug}'`, { slug, locale } ); } /** * Holt alle Seiten */ async getPages(locale?: string): Promise { return DataServiceHelpers.withCache( cache.pages, CacheKeyBuilder.pages(locale), () => this.adapter.getPages(locale), "Fehler beim Laden der Seiten" ); } /** * Holt SEO-Daten */ async getPageSeo(locale?: string): Promise { return DataServiceHelpers.withCache( cache.pageSeo, CacheKeyBuilder.pageSeo(locale), () => this.adapter.getPageSeo(locale), "Fehler beim Laden der SEO-Daten" ); } /** * Holt Navigation */ async getNavigation(locale?: string): Promise { return DataServiceHelpers.withCache( cache.navigation, CacheKeyBuilder.navigation(locale), () => this.adapter.getNavigation(locale), "Fehler beim Laden der Navigation" ); } /** * Holt Produkte */ async getProducts(limit?: number): Promise { return DataServiceHelpers.withCacheAndMetrics( "getProducts", cache.products, CacheKeyBuilder.products(limit), () => this.adapter.getProducts(limit), "Fehler beim Laden der Produkte", { limit } ); } /** * Holt ein einzelnes Produkt */ async getProduct(id: string): Promise { return DataServiceHelpers.withCache( cache.products, CacheKeyBuilder.product(id), () => this.adapter.getProduct(id), `Fehler beim Laden des Produkts '${id}'` ); } /** * Holt Übersetzungen */ async getTranslations( locale: string = "de", namespace?: string ): Promise { return DataServiceHelpers.withCache( cache.pages, CacheKeyBuilder.translations(locale, namespace), () => this.adapter.getTranslations(locale, namespace), `Fehler beim Laden der Übersetzungen für '${locale}'` ); } } // Singleton-Instanz mit konfiguriertem Adapter export const dataService = new DataService();