// Internes Place-Objekt: bleibt nah am KI-Import-JSON-Format aus // anforderung.md, ergänzt um intern generierte Felder (id, createdAt, // updatedAt). Die Kategorie wird beim Normalisieren immer auf eine // gültige Kategorie-id (Slug) aufgelöst, damit Styling (Farbe/Icon) // überall per getCategoryById() funktioniert. (function () { const { generateId } = EventMap.utils; const { CATEGORIES, getCategoryById, getCategoryByLabel } = EventMap.config; const { createDefaultPlaceFields } = EventMap.models; const CATEGORY_IDS = new Set(CATEGORIES.map((c) => c.id)); function resolveCategory(rawCategory) { if (typeof rawCategory === 'string' && CATEGORY_IDS.has(rawCategory)) { return rawCategory; } return getCategoryByLabel(rawCategory).id; } /** * Normalisiert ein rohes Place-Objekt (z.B. aus den per SEED_DATA_URL * geladenen Beispieldaten oder einem späteren KI-Import) zu einem * vollständigen internen Place-Objekt. * Fehlende Felder werden mit Defaults aufgefüllt, id/createdAt/updatedAt * werden übernommen falls vorhanden, sonst neu generiert. */ function normalizePlace(raw = {}) { const defaults = createDefaultPlaceFields(); const now = new Date().toISOString(); return { id: raw.id || generateId(), ...defaults, ...raw, category: resolveCategory(raw.category), ageRecommendation: { ...defaults.ageRecommendation, ...(raw.ageRecommendation || {}) }, cost: { ...defaults.cost, ...(raw.cost || {}) }, facilities: { ...defaults.facilities, ...(raw.facilities || {}) }, tags: Array.isArray(raw.tags) ? [...raw.tags] : [], createdAt: raw.createdAt || now, updatedAt: raw.updatedAt || now, }; } function getPlaceCategory(place) { return getCategoryById(place.category); } function getPlaceLatLng(place) { return { lat: place.latitude, lng: place.longitude }; } EventMap.models.normalizePlace = normalizePlace; EventMap.models.getPlaceCategory = getPlaceCategory; EventMap.models.getPlaceLatLng = getPlaceLatLng; })();