project setup with core files including configuration, package management, and basic structure. Added .gitignore, README, and various TypeScript types for CMS components. Implemented initial components and layouts for the application.
This commit is contained in:
129
middlelayer/dataService.ts
Normal file
129
middlelayer/dataService.ts
Normal file
@@ -0,0 +1,129 @@
|
||||
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();
|
||||
Reference in New Issue
Block a user