130 lines
3.4 KiB
TypeScript
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();
|