// Données de la vue publique : le portfolio partagé + ses projets figés. // Public (hors mot de passe), mais uniquement si publicShare est actif et // qu'un instantané figé existe. On ne sert jamais le contenu live. import { getPortfolio } from '../../lib/portfolio-store' import type { Portfolio, Project } from '~~/types' export default defineEventHandler(async (event): Promise<{ portfolio: Portfolio; projects: Record }> => { const id = getRouterParam(event, 'id') ?? '' if (!/^[\w-]+$/.test(id)) { throw createError({ statusCode: 400, statusMessage: 'Identifiant invalide' }) } const portfolio = await getPortfolio(id) if (!portfolio?.publicShare || !portfolio.frozenContent) { throw createError({ statusCode: 404, statusMessage: 'Portfolio introuvable' }) } // Vrai instantané : on rend la composition figée (pages + mise en forme), pas // la composition live. Repli sur le live pour les instantanés antérieurs. const frozen = portfolio.frozenContent const snapshot: Portfolio = { ...portfolio, name: frozen.name ?? portfolio.name, cover: frozen.cover ?? portfolio.cover, pages: frozen.pages ?? portfolio.pages, } return { portfolio: snapshot, projects: frozen.projects } })