// models/advertisements/advertisements.placements.js // // Declarative registry of every ad placement in the client app. Each entry // is a self-contained "slot" — a page + position pair — that determines the // visual format (hero/banner/popup/sidebar) automatically. Adding a new // placement should only ever require adding one entry here (and wiring the // corresponding client page to fetch/render it) — nothing else in this file // should need to change. // // `key` is what's stored on advertisements.placement. `format` is what gets // denormalized onto advertisements.type on write (see applyAdvertisementFields // in controllers/admin/advertisements.controller.js) — type is never accepted // from the client once a placement is set. const PLACEMENTS = [ { key: "dashboard.hero", format: "hero", page: "dashboard", pageLabel: "Dashboard", slotLabel: "Hero (top of page)" }, { key: "tier_plans.banner", format: "banner", page: "tier_plans", pageLabel: "Tier Plans", slotLabel: "Banner (above plan cards)" }, { key: "course_details.banner", format: "banner", page: "course_details", pageLabel: "Course Details", slotLabel: "Banner (below hero)" }, ]; const PLACEMENT_MAP = Object.fromEntries(PLACEMENTS.map((p) => [p.key, p])); const PLACEMENT_KEYS = PLACEMENTS.map((p) => p.key); function getFormatForPlacement(key) { return PLACEMENT_MAP[key]?.format ?? null; } module.exports = { PLACEMENTS, PLACEMENT_MAP, PLACEMENT_KEYS, getFormatForPlacement };