Files
sell/middlelayer/dataService.ts

130 lines
3.4 KiB
TypeScript

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<void> {
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<Page | null> {
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<Page[]> {
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<PageSeo> {
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<Navigation> {
return DataServiceHelpers.withCache(
cache.navigation,
CacheKeyBuilder.navigation(locale),
() => this.adapter.getNavigation(locale),
"Fehler beim Laden der Navigation"
);
}
/**
* Holt Produkte
*/
async getProducts(limit?: number): Promise<Product[]> {
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<Product | null> {
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<TranslationsData> {
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();