Quando usarlo
Il prodotto ha bisogno di un promemoria in un momento diverso da quelli già previsti (24 ore e 2 ore prima dell'appuntamento), per esempio 7 giorni prima.
Regole da rispettare
- La logica dei promemoria è pura e vive in
src/lib/booking/reminders.ts; il workflow del cron si limita a caricare i dati e consegnare. - Una consegna viene registrata in
reminder_deliveriesprima dell'invio dell'email: mai inviare prima e registrare dopo. - Dopo una riprogrammazione la
revisiondella prenotazione cambia e i promemoria tornano dovuti. Non aggirarereminderKey.
Passi
- Aggiungi la nuova finestra a
reminderKindsinsrc/lib/booking/reminders.ts. Mantieni la lista ordinata dalla finestra più lontana alla più vicina: se il cron è rimasto fermo,dueRemindersinvia solo l'ultima voce valida, cioè la più vicina. Per una settimana prima,{ kind: "7d", minutesBefore: 7 * 24 * 60 }va in testa. ReminderKindderiva dalla lista, quindi TypeScript chiede l'oggetto dell'email inreminderSubjects(src/lib/booking/workflows.ts). Scrivilo nella lingua del prodotto.- In
sendDueRemindersla query carica solo le prenotazioni che iniziano entro24 * 60 + 1minuti. Sostituisci il valore fisso con ilminutesBeforepiù grande direminderKindspiù un minuto, altrimenti la nuova finestra non viene mai raggiunta. - Non serve una migration:
reminder_deliveries.kindè testo e la chiave primaria(booking_id, kind, revision)rende già idempotente ogni nuovo tipo. - Aggiungi test in
test/notifications.test.tsper la nuova finestra:- diventa dovuto quando la prenotazione entra nella finestra;
- una prenotazione creata dentro la finestra non lo riceve;
- con il cron fermo viene inviato solo il promemoria più vicino;
- una nuova
revisionlo rende di nuovo dovuto.
Completato quando
- i comandi di verifica passano;
- i nuovi test coprono i quattro casi indicati;
sendDueRemindersnon contiene finestre scritte a mano.
