Files
PleinR/drizzle/meta/_journal.json
T
Claude e980ab6e04 Promotions : publication programmée et affichage limité à la période
Deux comportements demandés :

1. Une promotion n'apparaît sur le site que pendant sa période de validité.
   Les lectures publiques passent par `VISIBLE_PROMO` (`src/lib/queries.ts`) :
   statut `live` **et** fenêtre `starts_on` / `ends_on`, journée calculée en
   Europe/Paris pour qu'un conteneur en UTC ne retire pas une offre deux
   heures trop tôt. Le statut n'est pas touché : hors période, le backoffice
   explique pourquoi l'offre n'est pas visible (`visibilityNote`) et elle
   revient d'elle-même si les dates changent.

2. La publication peut être programmée. `promotions.publish_at` : l'adhérent
   propose une date, le modérateur la garde, la déplace ou la vide dans le
   formulaire « Valider ». Avec une échéance future la promotion passe au
   statut `scheduled` — rien n'est visible, rien n'est diffusé — et
   `releaseDuePromotions()` fait la bascule à l'heure dite, site et réseaux
   ensemble. Un bouton « Publier maintenant » court-circuite l'attente.

Mécanique :
- `src/lib/promo-schedule.ts` (pur, testé) : conversion `datetime-local` ⇄
  heure de l'association, changements d'heure compris, et refus d'une saisie
  illisible plutôt qu'une publication immédiate involontaire.
- `src/lib/promo-publish.ts` reprend `publishPromoShares()` : deux appelants
  désormais, une action serveur et la boucle de libération, qui n'a pas de
  requête et ne peut donc pas appeler `revalidatePath()`. Idem pour
  `logActivity()` dans `src/lib/activity-log.ts`.
- La bascule `scheduled → live` est un `UPDATE … RETURNING` filtré sur le
  statut : atomique, donc pas de double publication même à plusieurs
  instances, en plus de la garde existante sur `social_posts`.
- Déclencheur : `src/instrumentation.ts`, boucle d'une minute avec rattrapage
  au démarrage (`PROMO_SCHEDULER=off` la désactive). Le travail vit dans
  `instrumentation-node.ts`, écarté du bundle edge par `next.config.mjs` :
  Next compile aussi l'instrumentation pour le middleware, où `pg` ne peut
  pas être embarqué.

Migration 0016 : `promo_status += 'scheduled'`, `promotions.publish_at`.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QXNXRC4j5VLfKvpyyisrnb
2026-09-06 11:17:49 +00:00

125 lines
2.5 KiB
JSON

{
"version": "7",
"dialect": "postgresql",
"entries": [
{
"idx": 0,
"version": "7",
"when": 1782475322634,
"tag": "0000_numerous_roughhouse",
"breakpoints": true
},
{
"idx": 1,
"version": "7",
"when": 1782508812450,
"tag": "0001_dusty_cardiac",
"breakpoints": true
},
{
"idx": 2,
"version": "7",
"when": 1782544443365,
"tag": "0002_puzzling_kabuki",
"breakpoints": true
},
{
"idx": 3,
"version": "7",
"when": 1782545608919,
"tag": "0003_outstanding_jimmy_woo",
"breakpoints": true
},
{
"idx": 4,
"version": "7",
"when": 1784303079565,
"tag": "0004_tiny_vanisher",
"breakpoints": true
},
{
"idx": 5,
"version": "7",
"when": 1784339279276,
"tag": "0005_round_exiles",
"breakpoints": true
},
{
"idx": 6,
"version": "7",
"when": 1784930674056,
"tag": "0006_tiresome_clea",
"breakpoints": true
},
{
"idx": 7,
"version": "7",
"when": 1784931989372,
"tag": "0007_foamy_vindicator",
"breakpoints": true
},
{
"idx": 8,
"version": "7",
"when": 1784933339220,
"tag": "0008_neat_makkari",
"breakpoints": true
},
{
"idx": 9,
"version": "7",
"when": 1784968500537,
"tag": "0009_texte_mission",
"breakpoints": true
},
{
"idx": 10,
"version": "7",
"when": 1784972681534,
"tag": "0010_woozy_luminals",
"breakpoints": true
},
{
"idx": 11,
"version": "7",
"when": 1788512273181,
"tag": "0011_drop_temp_password",
"breakpoints": true
},
{
"idx": 12,
"version": "7",
"when": 1788675288708,
"tag": "0012_referentiel_categories",
"breakpoints": true
},
{
"idx": 13,
"version": "7",
"when": 1788680191881,
"tag": "0013_contact_email",
"breakpoints": true
},
{
"idx": 14,
"version": "7",
"when": 1788691242685,
"tag": "0014_lean_marvel_zombies",
"breakpoints": true
},
{
"idx": 15,
"version": "7",
"when": 1788691741621,
"tag": "0015_curious_winter_soldier",
"breakpoints": true
},
{
"idx": 16,
"version": "7",
"when": 1788692576315,
"tag": "0016_tiresome_korg",
"breakpoints": true
}
]
}