@mostajs/booking-notifications
v0.1.0
Published
Adapter thin : @mostajs/booking events → @mostajs/notifications.notify(). Templates booking par défaut (FR/EN/AR) + lookup reservation/slot/resource via BookingManager + reminders 24h/1h via cron tick.
Downloads
132
Readme
@mostajs/booking-notifications
Auteur : Dr Hamid MADANI [email protected] License : AGPL-3.0-or-later Version : 0.1.0
Adapter thin entre @mostajs/booking et @mostajs/notifications (moteur générique). Subscribe aux events booking, lookup entities, dispatch via le moteur générique avec templates FR/EN/AR par défaut.
Quick start
npm install @mostajs/booking @mostajs/notifications @mostajs/booking-notifications @mostajs/mailerimport { createBookingManager } from '@mostajs/booking'
import { createNotificationEngine } from '@mostajs/notifications'
import { createBookingNotifications } from '@mostajs/booking-notifications'
import { createMailer, createSmtpDriver } from '@mostajs/mailer'
const mailer = createMailer({ driver: createSmtpDriver({ host: ..., user: ..., pass: ... }) })
const engine = createNotificationEngine({
mailer,
defaultFrom: '[email protected]',
defaultLocale: 'fr',
})
const manager = createBookingManager({ /* ... repos, joinTokenSecret */ })
const adapter = createBookingNotifications({
engine,
manager,
resolveEmail: r => (r.metadata as any)?.email ?? null,
buildJoinUrl: (r, slot) => `https://app.example.com/join/${r.id}?t=${r.joinToken}`,
cron: { enabled: true, intervalMs: 60_000 }, // ticks reminders 24h/1h auto
})
// Brancher le handler sur les events booking
const managerWithNotif = createBookingManager({
// ...
onEvent: adapter.handler,
})À chaque reserve() / confirmReservation() / cancelReservation() / attendReservation(), l'adapter envoie le mail correspondant via le moteur générique. Toutes les 60s (cron), il scanne les reservations confirmed et envoie les rappels 24h/1h.
Kinds publiés (namespace booking.*)
import { BOOKING_NOTIFICATION_KINDS } from '@mostajs/booking-notifications'
BOOKING_NOTIFICATION_KINDS.RESERVATION_CREATED // 'booking.reservation.created'
BOOKING_NOTIFICATION_KINDS.RESERVATION_CONFIRMED // 'booking.reservation.confirmed'
BOOKING_NOTIFICATION_KINDS.RESERVATION_CANCELLED // 'booking.reservation.cancelled'
BOOKING_NOTIFICATION_KINDS.RESERVATION_ATTENDED // 'booking.reservation.attended'
BOOKING_NOTIFICATION_KINDS.REMINDER_24H // 'booking.reminder-24h'
BOOKING_NOTIFICATION_KINDS.REMINDER_1H // 'booking.reminder-1h'Override les templates par défaut
import { simpleTemplate } from '@mostajs/notifications'
const adapter = createBookingNotifications({
engine,
manager,
templates: {
[BOOKING_NOTIFICATION_KINDS.RESERVATION_CREATED]: simpleTemplate({
to: ctx => (ctx as any).email,
subject: ctx => `Votre RDV ${(ctx as any).resource?.name}`,
html: ctx => myCustomHtml(ctx),
messageId: ctx => `custom-${(ctx as any).reservation.id}`,
}),
},
})Tu peux aussi changer à chaud :
adapter.setTemplate(BOOKING_NOTIFICATION_KINDS.REMINDER_1H, newTemplate)Architecture
@mostajs/booking events
│ type: 'reservation.created' / 'confirmed' / 'cancelled' / 'attended'
▼
@mostajs/booking-notifications (adapter)
│ - lookup reservation/slot/resource via BookingManager
│ - build context { reservation, slot, resource, email, joinUrl, locale }
│ - map event.type → kind 'booking.reservation.created' (etc.)
▼
@mostajs/notifications (engine générique)
│ - templates[kind].render(context)
│ - mailer.send(rendered)
▼
@mostajs/mailer (driver SMTP/Resend/SES/...)Reminders 24h / 1h
L'adapter expose tickReminders() qui :
- Liste les reservations
confirmed - Pour chaque, calcule
ttl = slot.startAt - now - Si
|ttl - 24h| < window24h(default 15 min) → notifyREMINDER_24H - Si
|ttl - 1h| < window1h→ notifyREMINDER_1H
Trigger soit via cron interne (opts.cron.enabled: true), soit manuellement :
setInterval(() => adapter.tickReminders().catch(console.error), 60_000)Idempotence : les templates par défaut utilisent messageId = '<kind>-<reservationId>'. Le mailer (Phase 2 MailLog) déduplique.
Modules liés
@mostajs/booking— source des events@mostajs/notifications— moteur générique@mostajs/mailer— dispatch SMTP/etc.- (futur)
@mostajs/notifications-sms— pour SMS reminders via Twilio - (futur)
@mostajs/notifications-push— pour mobile push via FCM/APNs
License : AGPL-3.0-or-later Auteur : Dr Hamid MADANI [email protected]
