package handler import ( "net/http" ddnscron "goflare/internal/cron" "goflare/internal/database/queries" "github.com/labstack/echo/v4" ) type SettingsHandler struct { q *queries.Queries updater *ddnscron.DDNSUpdater } func NewSettingsHandler(q *queries.Queries, updater *ddnscron.DDNSUpdater) *SettingsHandler { return &SettingsHandler{q: q, updater: updater} } type settingsResponse struct { CronSchedule string `json:"cron_schedule"` } type settingsRequest struct { CronSchedule string `json:"cron_schedule"` } func (h *SettingsHandler) Get(c echo.Context) error { schedule := h.updater.Schedule() return c.JSON(http.StatusOK, settingsResponse{CronSchedule: schedule}) } func (h *SettingsHandler) Update(c echo.Context) error { var req settingsRequest if err := c.Bind(&req); err != nil { return c.JSON(http.StatusBadRequest, map[string]string{"error": "invalid request body"}) } if req.CronSchedule == "" { return c.JSON(http.StatusBadRequest, map[string]string{"error": "cron_schedule is required"}) } if err := h.updater.Reschedule(req.CronSchedule); err != nil { return c.JSON(http.StatusBadRequest, map[string]string{"error": err.Error()}) } ctx := c.Request().Context() if err := h.q.UpsertSetting(ctx, queries.UpsertSettingParams{ Key: "cron_schedule", Value: req.CronSchedule, }); err != nil { return c.JSON(http.StatusInternalServerError, map[string]string{"error": "failed to save setting"}) } return c.JSON(http.StatusOK, settingsResponse{CronSchedule: req.CronSchedule}) }