52 lines
1.8 KiB
Go
52 lines
1.8 KiB
Go
package handler
|
|
|
|
import (
|
|
"net/http"
|
|
|
|
"github.com/prabhupadasays/spsays-bff/internal/middleware"
|
|
"github.com/prabhupadasays/spsays-bff/internal/service"
|
|
"github.com/prabhupadasays/spsays-bff/pkg/response"
|
|
)
|
|
|
|
// NotificationHandler serves the signed-in user's notification feed +
|
|
// unread badge count, and marks them read. All routes sit behind
|
|
// RequireAuth, so middleware.UserID is always populated.
|
|
type NotificationHandler struct{ svc *service.NotificationService }
|
|
|
|
func NewNotificationHandler(svc *service.NotificationService) *NotificationHandler {
|
|
return &NotificationHandler{svc: svc}
|
|
}
|
|
|
|
// List returns the caller's notifications, newest first.
|
|
func (h *NotificationHandler) List(w http.ResponseWriter, r *http.Request) {
|
|
uid := middleware.UserID(r.Context())
|
|
limit, offset := parseLimitOffset(r)
|
|
items, err := h.svc.List(r.Context(), uid, limit, offset)
|
|
if err != nil {
|
|
response.Error(w, http.StatusInternalServerError, "could not load notifications")
|
|
return
|
|
}
|
|
response.JSON(w, http.StatusOK, items)
|
|
}
|
|
|
|
// UnreadCount returns {"count": N} for the bell badge.
|
|
func (h *NotificationHandler) UnreadCount(w http.ResponseWriter, r *http.Request) {
|
|
uid := middleware.UserID(r.Context())
|
|
n, err := h.svc.UnreadCount(r.Context(), uid)
|
|
if err != nil {
|
|
response.Error(w, http.StatusInternalServerError, "could not load unread count")
|
|
return
|
|
}
|
|
response.JSON(w, http.StatusOK, map[string]int{"count": n})
|
|
}
|
|
|
|
// MarkAllRead marks every notification read (called when the page opens).
|
|
func (h *NotificationHandler) MarkAllRead(w http.ResponseWriter, r *http.Request) {
|
|
uid := middleware.UserID(r.Context())
|
|
if err := h.svc.MarkAllRead(r.Context(), uid); err != nil {
|
|
response.Error(w, http.StatusInternalServerError, "could not mark notifications read")
|
|
return
|
|
}
|
|
response.NoContent(w)
|
|
}
|