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:
Peter Meier
2025-12-13 23:26:13 +01:00
parent ea288a5bbc
commit b1a556dc6d
167 changed files with 19057 additions and 131 deletions

129
middlelayer/dataService.ts Normal file
View 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();