// Package importnotify verbindet mail/internal/imapimport (ING-01/IMP-01) // mit mail/internal/notifyclient (INT-05, Core CFG-02/CFG-05): // genau EINE Benachrichtigung je abgeschlossenem Abgleichslauf // (imapimport.SyncResult), nicht eine je neuer Nachricht // (Akzeptanzkriterium 3: gebündelt statt Flut bei Massenimport). package importnotify import ( "context" "fmt" "gitea.perlbach24.de/scripte/nexarch/mail/internal/imapimport" "gitea.perlbach24.de/scripte/nexarch/mail/internal/notifyclient" ) // eventTypeMailNew ist der bei Core registrierte Ereignistyp für neu // importierte Mails. const eventTypeMailNew = "mail.new" // Notifier ist die für NotifyBatch benötigte Teilmenge von // *notifyclient.Client — als Schnittstelle für Tests ohne echten HTTP- // Server. type Notifier interface { Notify(ctx context.Context, ev notifyclient.Event) error } // NotifyBatch löst — falls result.NewMessages > 0 — GENAU EINE // Benachrichtigung für den gesamten Abgleichslauf aus // (Akzeptanzkriterium 1: neue Mail löst zeitnah ein Ereignis aus; // Akzeptanzkriterium 3: Massenimport erzeugt eine gebündelte // Zusammenfassung statt Dutzende Einzelbenachrichtigungen — es gibt in // diesem Paket schlicht KEINEN Codepfad, der mehr als einen Notify- // Aufruf je Abgleichslauf absetzt). Bei result.NewMessages == 0 wird // nichts gesendet. // // Ein Fehler beim Senden wird zurückgeliefert, blockiert aber // strukturell NIE die bereits abgeschlossene Nachrichtenübernahme — // NotifyBatch wird vom Aufrufer NACH dem erfolgreichen // imapimport.RunOnce aufgerufen, nie währenddessen, und ein Fehler // hier nimmt keine bereits persistierte Nachricht zurück. func NotifyBatch(ctx context.Context, notifier Notifier, tenantSlug, mailboxName string, result imapimport.SyncResult) error { if result.NewMessages == 0 { return nil } summary := fmt.Sprintf("%d neue Mail(s) in %s", result.NewMessages, mailboxName) return notifier.Notify(ctx, notifyclient.Event{ TenantSlug: tenantSlug, EventType: eventTypeMailNew, Summary: summary, Count: result.NewMessages, }) }