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) }