feat: add web push and sadhna tracker
This commit is contained in:
@@ -0,0 +1,75 @@
|
||||
package handler
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"net/http"
|
||||
|
||||
"github.com/prabhupadasays/spsays-bff/internal/middleware"
|
||||
"github.com/prabhupadasays/spsays-bff/internal/service"
|
||||
"github.com/prabhupadasays/spsays-bff/pkg/response"
|
||||
)
|
||||
|
||||
// ReminderHandler serves the sādhana-reminder preference + the timezone the
|
||||
// scheduler fires against. All routes require auth.
|
||||
type ReminderHandler struct {
|
||||
svc *service.ReminderService
|
||||
}
|
||||
|
||||
func NewReminderHandler(svc *service.ReminderService) *ReminderHandler {
|
||||
return &ReminderHandler{svc: svc}
|
||||
}
|
||||
|
||||
type reminderPrefResp struct {
|
||||
Enabled bool `json:"enabled"`
|
||||
}
|
||||
|
||||
// GetPrefs — GET /sadhna/reminders. Whether reminders are on for the caller.
|
||||
func (h *ReminderHandler) GetPrefs(w http.ResponseWriter, r *http.Request) {
|
||||
uid := middleware.UserID(r.Context())
|
||||
enabled, err := h.svc.Enabled(r.Context(), uid)
|
||||
if err != nil {
|
||||
response.Error(w, http.StatusInternalServerError, "could not load reminder preference")
|
||||
return
|
||||
}
|
||||
response.JSON(w, http.StatusOK, reminderPrefResp{Enabled: enabled})
|
||||
}
|
||||
|
||||
// UpdatePrefs — PUT /sadhna/reminders { enabled }. Toggles reminders.
|
||||
func (h *ReminderHandler) UpdatePrefs(w http.ResponseWriter, r *http.Request) {
|
||||
uid := middleware.UserID(r.Context())
|
||||
var req struct {
|
||||
Enabled bool `json:"enabled"`
|
||||
}
|
||||
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
|
||||
response.Error(w, http.StatusBadRequest, "invalid JSON body")
|
||||
return
|
||||
}
|
||||
if err := h.svc.SetEnabled(r.Context(), uid, req.Enabled); err != nil {
|
||||
response.Error(w, http.StatusInternalServerError, "could not update reminder preference")
|
||||
return
|
||||
}
|
||||
response.JSON(w, http.StatusOK, reminderPrefResp{Enabled: req.Enabled})
|
||||
}
|
||||
|
||||
// SetTimezone — POST /sadhna/timezone { timezone }. The browser reports its
|
||||
// IANA zone so reminders fire at local time.
|
||||
func (h *ReminderHandler) SetTimezone(w http.ResponseWriter, r *http.Request) {
|
||||
uid := middleware.UserID(r.Context())
|
||||
var req struct {
|
||||
Timezone string `json:"timezone"`
|
||||
}
|
||||
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
|
||||
response.Error(w, http.StatusBadRequest, "invalid JSON body")
|
||||
return
|
||||
}
|
||||
if err := h.svc.SetTimezone(r.Context(), uid, req.Timezone); err != nil {
|
||||
if errors.Is(err, service.ErrInvalidTimezone) {
|
||||
response.Error(w, http.StatusBadRequest, "invalid timezone")
|
||||
return
|
||||
}
|
||||
response.Error(w, http.StatusInternalServerError, "could not save timezone")
|
||||
return
|
||||
}
|
||||
response.NoContent(w)
|
||||
}
|
||||
Reference in New Issue
Block a user