import type { APIRoute } from 'astro'; import { avvisiAttivi, calendari, calendariDaMostrare } from '../../data/calendari'; import { generaCalendariPdf, nomeFilePdf } from '../../lib/calendario-pdf'; export const prerender = false; // Il PDF degli orari, come file scaricabile. // // /calendario/tutti.pdf tutti gli orari validi, uno per pagina // /calendario/settembre-1-18.pdf un orario solo // // Pubblico come il resto del sito — è lo stesso orario che chiunque legge nel popup, e un file // dietro autenticazione non si potrebbe girare su WhatsApp, che è come questo centro comunica // coi clienti. export const GET: APIRoute = async ({ params }) => { // "tutti" segue la stessa regola della pagina: gli orari scaduti non ci sono. Un PDF che si // porta dietro il periodo finito farebbe cercare lezioni che non esistono più. const cals = params.id === 'tutti' ? calendariDaMostrare(new Date()).map((m) => m.cal) : calendari.filter((c) => c.id === params.id); // Un id sconosciuto è 404, non un PDF vuoto: un file che si apre e non contiene niente fa // credere che il calendario sia vuoto. if (cals.length === 0) return new Response('Calendario inesistente.', { status: 404 }); // Le giornate fuori griglia stanno anche nel PDF: è il file che gira su WhatsApp, e chi lo // riceve non ha davanti la pagina dove sono scritte. const pdf = await generaCalendariPdf(cals, avvisiAttivi(new Date())); return new Response(new Uint8Array(pdf), { headers: { 'Content-Type': 'application/pdf', // `attachment` perché il bottone dice "scarica": senza, il browser lo aprirebbe in una // scheda e su telefono resterebbe lì, senza finire fra i file. 'Content-Disposition': `attachment; filename="${nomeFilePdf(cals)}"`, 'Content-Length': String(pdf.length), // Un'ora: basta a non rigenerarlo a ogni click, e non abbastanza perché un avviso ormai // scaduto (le giornate fuori griglia spariscono da sole) resti in giro un giorno intero. 'Cache-Control': 'public, max-age=3600', }, }); };