package webui import ( "net/http" "time" ) // navCounts are the small per-resource counts shown as sidebar badges on every page // (and reused by the dashboard's own stat tiles, which use the same numbers) — scoped // to the current admin exactly like every list page already is. type navCounts struct { DomainCount, SenderCount, MailboxCount, IPCount, DKIMCount, BlacklistCount int } func (a *App) computeNavCounts(r *http.Request) navCounts { scope := scopeFromContext(r) var c navCounts if scope.Global { c.DomainCount, _ = a.DB.CountActiveDomains() c.SenderCount, _ = a.DB.CountActiveSenders() c.DKIMCount, _ = a.DB.CountActiveDKIMKeys() if entries, err := a.DB.ListBlacklist(); err == nil { now := time.Now() for _, e := range entries { if e.ExpiresAt.After(now) { c.BlacklistCount++ } } } } else { domains, _ := a.DB.ListDomains() for _, d := range domains { if d.IsActive && scope.Allowed(d.ID) { c.DomainCount++ } } senders, _ := a.DB.ListSenders() for _, s := range senders { if s.IsActive && scope.Allowed(s.DomainID) { c.SenderCount++ } } keys, _ := a.DB.ListActiveDKIMKeysWithDomain() for _, k := range keys { if scope.Allowed(k.DomainID) { c.DKIMCount++ } } } // Mailboxes and IPs always need a per-row pass regardless of scope.Global (no // dedicated CountActive* helpers exist for them), same as dashboard.go already did // for mailboxes before this was centralized. mailboxes, _ := a.DB.ListMailboxes() for _, m := range mailboxes { if m.IsActive && (scope.Global || scope.Allowed(m.DomainID)) { c.MailboxCount++ } } ips, _ := a.DB.ListWhitelistedIPs() for _, ip := range ips { if ip.IsActive && (scope.Global || scope.Allowed(ip.DomainID)) { c.IPCount++ } } return c }