From def7d8a2cb72f67b071783aca5524dc85c6105b0 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 12 Oct 2026 18:45:10 +0000 Subject: [PATCH] =?UTF-8?q?Publications=20en=20=C3=A9chec=20:=20nouvel=20e?= =?UTF-8?q?ssai=20espac=C3=A9=20au=20lieu=20de=20chaque=20minute?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Une publication en échec gardait published_at à NULL et était renvoyée à chaque passage du planificateur, soit toutes les minutes, sans fin. Chaque essai multipliait les appels à l'API Graph, jusqu'à épuiser le quota de l'application (code 4) puis déclencher le blocage anti-spam de Meta (code 368). - scheduled_posts : colonnes attempts et next_attempt_at ; - délai croissant entre les essais (5 min → 3 h), plus long après une limite de débit (30 min → 4 h), abandon après 5 tentatives ; - après une limite de débit, les autres publications de la même plateforme sont reportées au lieu d'aggraver le blocage ; - reprogrammer une publication remet le compteur à zéro ; - l'historique indique la prochaine tentative ou l'abandon. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_018jcWbATGHxatn4V7qS3mr3 --- client/src/pages/history.tsx | 9 ++ server/src/db/mod.rs | 14 ++- server/src/db/models.rs | 4 + server/src/migrate.rs | 3 + server/src/routes/core/agenda.rs | 2 + server/src/routes/core/scheduled.rs | 7 +- server/src/routes/external.rs | 9 +- server/src/services/scheduler.rs | 165 +++++++++++++++++++++++++++- shared/schema.ts | 7 ++ 9 files changed, 211 insertions(+), 9 deletions(-) diff --git a/client/src/pages/history.tsx b/client/src/pages/history.tsx index 4d7e720..2e88174 100644 --- a/client/src/pages/history.tsx +++ b/client/src/pages/history.tsx @@ -233,6 +233,15 @@ export default function History() { {scheduledPost.error && (

{scheduledPost.error}

)} + {scheduledPost.error && !scheduledPost.publishedAt && ( +

+ {scheduledPost.nextAttemptAt + ? `Nouvelle tentative automatique le ${format(new Date(scheduledPost.nextAttemptAt), "d MMM yyyy 'à' HH:mm", { locale: fr })}` + : scheduledPost.attempts > 0 + ? `Abandon après ${scheduledPost.attempts} tentatives : reprogrammez la publication pour réessayer.` + : null} +

+ )}