Publications en échec : nouvel essai espacé au lieu de chaque minute

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 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018jcWbATGHxatn4V7qS3mr3
This commit is contained in:
Claude committed 2026-10-12 18:45:10 +00:00
1 parent 7f21e23a91
commit def7d8a2cb
9 files changed
+211 -9

No files matched your search

+9
View File
@@ -233,6 +233,15 @@ export default function History() {
{scheduledPost.error && (
<p className="mt-2 rounded-md bg-destructive/10 px-2.5 py-1.5 text-xs text-destructive">{scheduledPost.error}</p>
)}
{scheduledPost.error && !scheduledPost.publishedAt && (
<p className="mt-1 text-xs text-muted-foreground">
{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}
</p>
)}
</div>
<Button
variant="ghost"