Files
minstrel/internal/api/admin_notification_email.go
T
bvandeusenandClaude Opus 5.5 08a2c06b85 docs: api comments say what the endpoints do, not how they came to be (#6277)
Rewrites the internal/api comment blocks to rule 32: task, milestone and
rule ids gone, the stories behind them restated as the constraint they
left, stale references corrected (the stream secret is wired from config,
the timezone handler already refreshes the scheduler, the Android app is
the native client, the design docs cited are not in the repo). Also
rewraps comment lines over 80 columns left by the earlier batches.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 12:23:58 -04:00

56 lines
2.0 KiB
Go

package api
import (
"encoding/json"
"errors"
"net/http"
"git.fabledsword.com/bvandeusen/minstrel/internal/apierror"
"git.fabledsword.com/bvandeusen/minstrel/internal/db/dbq"
"git.fabledsword.com/bvandeusen/minstrel/internal/notifications"
)
// notificationEmailBody is the wire shape for GET and PUT
// /api/admin/notification-email: when the grouped emails go out.
type notificationEmailBody struct {
SummaryHour int32 `json:"summary_hour"`
BatchWindowMinutes int32 `json:"batch_window_minutes"`
}
func notificationEmailBodyOf(s notifications.EmailSettings) notificationEmailBody {
return notificationEmailBody{SummaryHour: s.SummaryHour, BatchWindowMinutes: s.BatchWindowMinutes}
}
// handleGetNotificationEmail implements GET /api/admin/notification-email.
func (h *handlers) handleGetNotificationEmail(w http.ResponseWriter, r *http.Request) {
s, err := notifications.LoadEmailSettings(r.Context(), dbq.New(h.pool))
if err != nil {
writeErrWithLog(w, h.logger, "admin notification email: load failed", apierror.Internal(err))
return
}
writeJSON(w, http.StatusOK, notificationEmailBodyOf(s))
}
// handleUpdateNotificationEmail implements PUT /api/admin/notification-email.
// A whole-row write; the digest reads it on its next tick.
func (h *handlers) handleUpdateNotificationEmail(w http.ResponseWriter, r *http.Request) {
var req notificationEmailBody
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
writeErr(w, apierror.BadRequest("invalid_body", "malformed JSON"))
return
}
saved, err := notifications.SaveEmailSettings(r.Context(), dbq.New(h.pool), notifications.EmailSettings{
SummaryHour: req.SummaryHour,
BatchWindowMinutes: req.BatchWindowMinutes,
})
if err != nil {
if errors.Is(err, notifications.ErrEmailSettingOutOfRange) {
writeErr(w, apierror.BadRequest("invalid_setting", err.Error()))
return
}
writeErrWithLog(w, h.logger, "admin notification email: update failed", apierror.Internal(err))
return
}
writeJSON(w, http.StatusOK, notificationEmailBodyOf(saved))
}