chore: repasse en SSG pour réduire les appels API Contentful

- Supprime `prerender = false` des pages (index, evenements, [slug])
- Remet `getStaticPaths()` pour la génération statique des événements
- Simplifie astro.config.mjs (suppression mode hybrid + adapter node)
- Supprime le webhook devenu inutile (rebuild via API CleverCloud)
- Corrige le typage de ContentfulAsset

Le webhook Contentful appelle maintenant directement l'API CleverCloud pour déclencher un rebuild lors des publications.
This commit is contained in:
Jalil Arfaoui 2026-01-04 21:56:03 +01:00
parent 411556293c
commit ad87c1263c
5 changed files with 14 additions and 85 deletions

View file

@ -1,12 +1,7 @@
import { defineConfig } from 'astro/config'; import { defineConfig } from 'astro/config';
import node from "@astrojs/node";
// https://astro.build/config // https://astro.build/config
export default defineConfig({ export default defineConfig({
output: "hybrid",
adapter: node({
mode: "standalone"
}),
server: { server: {
port: 8080, port: 8080,
host: true host: true

View file

@ -1,62 +0,0 @@
import { exec } from 'child_process';
export const prerender = false;
let isBuildInProgress = false;
export async function POST({ request }: { request: Request }): Promise<Response> {
const data = await request.json();
if (!data.token || data.token !== import.meta.env.WEBHOOK_TOKEN) {
return new Response(
JSON.stringify({ status: "unauthorized" }),
{ status: 401, headers: { "Content-Type": "application/json" } }
)
}
try {
if (isBuildInProgress) {
return new Response(
JSON.stringify({status: 'error', message: 'Build already in progress'}),
{
status: 409,
headers: {
'Content-Type': 'application/json',
},
}
);
}
isBuildInProgress = true;
exec('npm run build', (error, stdout, stderr) => {
if (error) {
console.error(`Error executing build: ${error}`);
}
if (stdout) {
console.log(`Build stdout: ${stdout}`);
}
if (stderr) {
console.error(`Build stderr: ${stderr}`);
}
isBuildInProgress = false;
});
return new Response(JSON.stringify({status: 'success'}), {
status: 200,
headers: {
'Content-Type': 'application/json',
},
});
} catch (error) {
console.error("Error in webhook:", error);
// Return a error response
return new Response(JSON.stringify({status: 'error', message: error?.toString()}), {
status: 500,
headers: {
'Content-Type': 'application/json',
},
});
}
}

View file

@ -3,8 +3,6 @@ import Layout from '../layouts/Layout.astro';
import { fetchEvenementsPassés } from "../lib/contentful"; import { fetchEvenementsPassés } from "../lib/contentful";
import GrilleSpectaclesPassés from "../components/GrilleSpectaclesPassés.astro"; import GrilleSpectaclesPassés from "../components/GrilleSpectaclesPassés.astro";
export const prerender = false
const evenementsPassés = await fetchEvenementsPassés() const evenementsPassés = await fetchEvenementsPassés()
--- ---

View file

@ -1,28 +1,28 @@
--- ---
import type { Document } from '@contentful/rich-text-types';
import { documentToHtmlString } from "@contentful/rich-text-html-renderer"; import { documentToHtmlString } from "@contentful/rich-text-html-renderer";
import {fetchEvenement, fetchAllEvenements} from "../../lib/contentful"; import { fetchAllEvenements } from "../../lib/contentful";
import Layout from "../../layouts/Layout.astro"; import Layout from "../../layouts/Layout.astro";
import Card from "../../components/Card.astro";
import { formatDateAvecHeure } from "../../utils/date"; import { formatDateAvecHeure } from "../../utils/date";
export const prerender = false export async function getStaticPaths() {
const tousEvenements = await fetchAllEvenements()
return tousEvenements.map((evenement, index) => ({
params: { slug: evenement.slug },
props: {
evenement,
evenementPrecedent: index > 0 ? tousEvenements[index - 1] : null,
evenementSuivant: index < tousEvenements.length - 1 ? tousEvenements[index + 1] : null,
},
}))
}
const {slug} = Astro.params const { evenement, evenementPrecedent, evenementSuivant } = Astro.props
const evenement = await fetchEvenement(slug)
const { nom, description, date, lieu, lieuUrl, affiche, album } = evenement const { nom, description, date, lieu, lieuUrl, affiche, album } = evenement
// Récupération de tous les événements pour la navigation
const tousEvenements = await fetchAllEvenements()
const currentIndex = tousEvenements.findIndex(e => e.slug === slug)
const evenementPrecedent = currentIndex > 0 ? tousEvenements[currentIndex - 1] : null
const evenementSuivant = currentIndex < tousEvenements.length - 1 ? tousEvenements[currentIndex + 1] : null
const Wrapper = lieuUrl ? 'a' : 'div' const Wrapper = lieuUrl ? 'a' : 'div'
--- ---
<Layout> <Layout title={`${nom} - Les Particules`}>
<div class="navigation-header"> <div class="navigation-header">
{evenementPrecedent && ( {evenementPrecedent && (
<a href={`/evenements/${evenementPrecedent.slug}`} class="nav-link nav-prev"> <a href={`/evenements/${evenementPrecedent.slug}`} class="nav-link nav-prev">

View file

@ -5,8 +5,6 @@ import { fetchEvenements, fetchEvenementsPassés } from "../lib/contentful";
import Evenement from "../components/Evenement.astro"; import Evenement from "../components/Evenement.astro";
import GrilleSpectaclesPassés from "../components/GrilleSpectaclesPassés.astro"; import GrilleSpectaclesPassés from "../components/GrilleSpectaclesPassés.astro";
export const prerender = false
const evenements = await fetchEvenements() const evenements = await fetchEvenements()
const evenementsPassés = await fetchEvenementsPassés() const evenementsPassés = await fetchEvenementsPassés()