510d7ca4ec
Primo passo della separazione sito / piattaforme decisa da Adriano il 03/09: due applicazioni autosufficienti, senza workspace di root, cosi' che ognuna resti un progetto Astro completo ed estraibile. Qui non cambia niente del codice: solo la radice. I pattern del .gitignore che avevano una barra erano ancorati alla radice e dopo lo spostamento non avrebbero piu' coperto niente (data/*.db*, uploads/*): resi validi a qualunque profondita'. Suite: 45 file, 347 test verdi prima e dopo lo spostamento. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EndnceRA5WnA6rvA5iV9WL
42 lines
2.1 KiB
TypeScript
42 lines
2.1 KiB
TypeScript
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',
|
|
},
|
|
});
|
|
};
|