settings.go 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. package handler
  2. import (
  3. "net/http"
  4. ddnscron "goflare/internal/cron"
  5. "goflare/internal/database/queries"
  6. "github.com/labstack/echo/v4"
  7. )
  8. type SettingsHandler struct {
  9. q *queries.Queries
  10. updater *ddnscron.DDNSUpdater
  11. }
  12. func NewSettingsHandler(q *queries.Queries, updater *ddnscron.DDNSUpdater) *SettingsHandler {
  13. return &SettingsHandler{q: q, updater: updater}
  14. }
  15. type settingsResponse struct {
  16. CronSchedule string `json:"cron_schedule"`
  17. }
  18. type settingsRequest struct {
  19. CronSchedule string `json:"cron_schedule"`
  20. }
  21. func (h *SettingsHandler) Get(c echo.Context) error {
  22. schedule := h.updater.Schedule()
  23. return c.JSON(http.StatusOK, settingsResponse{CronSchedule: schedule})
  24. }
  25. func (h *SettingsHandler) Update(c echo.Context) error {
  26. var req settingsRequest
  27. if err := c.Bind(&req); err != nil {
  28. return c.JSON(http.StatusBadRequest, map[string]string{"error": "invalid request body"})
  29. }
  30. if req.CronSchedule == "" {
  31. return c.JSON(http.StatusBadRequest, map[string]string{"error": "cron_schedule is required"})
  32. }
  33. if err := h.updater.Reschedule(req.CronSchedule); err != nil {
  34. return c.JSON(http.StatusBadRequest, map[string]string{"error": err.Error()})
  35. }
  36. ctx := c.Request().Context()
  37. if err := h.q.UpsertSetting(ctx, queries.UpsertSettingParams{
  38. Key: "cron_schedule",
  39. Value: req.CronSchedule,
  40. }); err != nil {
  41. return c.JSON(http.StatusInternalServerError, map[string]string{"error": "failed to save setting"})
  42. }
  43. return c.JSON(http.StatusOK, settingsResponse{CronSchedule: req.CronSchedule})
  44. }