Générateur de portfolios PDF Figures Libres (app Nuxt autonome)
App Nuxt 3 + Nuxt UI qui lit les projets du CMS Grav et compose des portfolios A3 paysage exportés en PDF (gabarit book_v3) : composeur WYSIWYG, templates cover/toc/projet/grille/page libre, pipeline Playwright + Ghostscript, gel du contenu à la génération, partage public opt-in. Dépôt autonome : Dockerfile (base Playwright + Ghostscript + ffmpeg + rsync) inclus. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,19 @@
|
||||
// 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<string, Project> }> => {
|
||||
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' })
|
||||
}
|
||||
|
||||
return { portfolio, projects: portfolio.frozenContent.projects }
|
||||
})
|
||||
Reference in New Issue
Block a user