108 lines
3.0 KiB
Go
108 lines
3.0 KiB
Go
package notification
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/google/uuid"
|
|
)
|
|
|
|
// AdminListNotificationsPage bundles the pagination metadata returned to
|
|
// the admin API. The shape mirrors `mail.AdminListDeliveriesPage` so
|
|
// handlers stay symmetric.
|
|
type AdminListNotificationsPage struct {
|
|
Items []Notification
|
|
Page int
|
|
PageSize int
|
|
Total int64
|
|
}
|
|
|
|
// AdminListDeadLettersPage mirrors AdminListNotificationsPage for the
|
|
// dead-letter listing.
|
|
type AdminListDeadLettersPage struct {
|
|
Items []DeadLetter
|
|
Page int
|
|
PageSize int
|
|
Total int64
|
|
}
|
|
|
|
// AdminListMalformedPage mirrors AdminListNotificationsPage for the
|
|
// malformed-intent listing.
|
|
type AdminListMalformedPage struct {
|
|
Items []MalformedIntent
|
|
Page int
|
|
PageSize int
|
|
Total int64
|
|
}
|
|
|
|
// AdminListNotifications returns the notification page newest-first.
|
|
// page is 1-indexed; pageSize is bounded by normalisePaging.
|
|
func (s *Service) AdminListNotifications(ctx context.Context, page, pageSize int) (AdminListNotificationsPage, error) {
|
|
page, pageSize = normalisePaging(page, pageSize)
|
|
offset := (page - 1) * pageSize
|
|
res, err := s.deps.Store.ListNotifications(ctx, offset, pageSize)
|
|
if err != nil {
|
|
return AdminListNotificationsPage{}, err
|
|
}
|
|
return AdminListNotificationsPage{
|
|
Items: res.Items,
|
|
Page: page,
|
|
PageSize: pageSize,
|
|
Total: res.Total,
|
|
}, nil
|
|
}
|
|
|
|
// AdminGetNotification returns a single notification by id; the
|
|
// sentinel ErrNotificationNotFound surfaces a 404 in the handler
|
|
// layer.
|
|
func (s *Service) AdminGetNotification(ctx context.Context, id uuid.UUID) (Notification, error) {
|
|
return s.deps.Store.GetNotification(ctx, id)
|
|
}
|
|
|
|
// AdminListDeadLetters returns the dead-letter page newest-first.
|
|
func (s *Service) AdminListDeadLetters(ctx context.Context, page, pageSize int) (AdminListDeadLettersPage, error) {
|
|
page, pageSize = normalisePaging(page, pageSize)
|
|
offset := (page - 1) * pageSize
|
|
res, err := s.deps.Store.ListDeadLetters(ctx, offset, pageSize)
|
|
if err != nil {
|
|
return AdminListDeadLettersPage{}, err
|
|
}
|
|
return AdminListDeadLettersPage{
|
|
Items: res.Items,
|
|
Page: page,
|
|
PageSize: pageSize,
|
|
Total: res.Total,
|
|
}, nil
|
|
}
|
|
|
|
// AdminListMalformed returns the malformed-intent page newest-first.
|
|
func (s *Service) AdminListMalformed(ctx context.Context, page, pageSize int) (AdminListMalformedPage, error) {
|
|
page, pageSize = normalisePaging(page, pageSize)
|
|
offset := (page - 1) * pageSize
|
|
res, err := s.deps.Store.ListMalformed(ctx, offset, pageSize)
|
|
if err != nil {
|
|
return AdminListMalformedPage{}, err
|
|
}
|
|
return AdminListMalformedPage{
|
|
Items: res.Items,
|
|
Page: page,
|
|
PageSize: pageSize,
|
|
Total: res.Total,
|
|
}, nil
|
|
}
|
|
|
|
// normalisePaging clamps page and pageSize to the values handlers can
|
|
// safely pass through to the store. Defaults match the existing admin
|
|
// endpoints (`mail` package); pageSize is capped at 200.
|
|
func normalisePaging(page, pageSize int) (int, int) {
|
|
if page <= 0 {
|
|
page = 1
|
|
}
|
|
if pageSize <= 0 {
|
|
pageSize = 25
|
|
}
|
|
if pageSize > 200 {
|
|
pageSize = 200
|
|
}
|
|
return page, pageSize
|
|
}
|