feat: backend service
This commit is contained in:
@@ -0,0 +1,107 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user