Files
bookhoard/internal/handlers/system_settings.go
T
john-okeefe 1e05470fbb refactor(handlers): update all handlers for Echo v5 compatibility
Update all handler functions to use *echo.Context (pointer) instead of echo.Context (value) as required by Echo v5.

Changes across all handler files:
- analytics.go: Update handler signatures
- auth.go: Update authentication handler signatures
- book_matching.go: Update matching handler signatures
- collections.go: Update collection handler signatures
- collections_preview_test.go: Update test signatures
- commonhandlers.go: Update common handler signatures
- conflicts.go: Update conflict handler signatures
- context.go: Update context handler signatures
- dashboard.go: Update dashboard handler signatures
- devices.go: Update device handler signatures
- jobs.go: Update job handler signatures
- kobo.go: Update Kobo handler signatures
- koreader.go: Update Koreader handler signatures
- library.go: Update library handler signatures
- matching.go: Update matching handler signatures
- media.go: Update media handler signatures
- opds.go: Update OPDS handler signatures
- progress.go: Update progress handler signatures
- queue.go: Update queue handler signatures
- refresh_token.go: Update token handler signatures
- scanner.go: Update scanner handler signatures
- sidecar.go: Update sidecar handler signatures
- sync.go: Update sync handler signatures
- system_settings.go: Update settings handler signatures
- websocket.go: Update WebSocket handler signatures

All handlers now properly implement Echo v5's pointer-based context pattern.
This change is necessary for type safety and compatibility with Echo v5's
improved context handling and WebSocket support.
2026-03-06 14:00:28 -05:00

112 lines
3.6 KiB
Go

package handlers
import (
"bookhoard/internal/database"
"net/http"
"strconv"
"github.com/jackc/pgx/v5"
"github.com/labstack/echo/v5"
)
type SystemSettingsHandler struct {
db *database.Queries
}
func NewSystemSettingsHandler(db *database.Queries) *SystemSettingsHandler {
return &SystemSettingsHandler{
db: db,
}
}
type UpdateScanSettingsRequest struct {
ScanPollIntervalSeconds int32 `json:"scan_poll_interval_seconds" validate:"required,min=1,max=3600"`
AutoScanEnabled bool `json:"auto_scan_enabled"`
}
type ScanSettingsResponse struct {
ScanPollIntervalSeconds int32 `json:"scan_poll_interval_seconds"`
AutoScanEnabled bool `json:"auto_scan_enabled"`
Message string `json:"message,omitempty"`
}
func (h *SystemSettingsHandler) UpdateScanSettings(c *echo.Context) error {
var req UpdateScanSettingsRequest
if err := c.Bind(&req); err != nil {
return c.JSON(http.StatusBadRequest, map[string]string{"error": "invalid request"})
}
if err := c.Validate(&req); err != nil {
return c.JSON(http.StatusBadRequest, map[string]string{"error": err.Error()})
}
scanFrequencyValue := strconv.FormatInt(int64(req.ScanPollIntervalSeconds), 10)
autoScanValue := strconv.FormatBool(req.AutoScanEnabled)
err := h.db.UpdateSystemSetting(c.Request().Context(), database.UpdateSystemSettingParams{
SettingKey: "scan_poll_interval_seconds",
SettingValue: scanFrequencyValue,
})
if err != nil {
if err == pgx.ErrNoRows {
return c.JSON(http.StatusNotFound, map[string]string{"error": "system setting not found"})
}
return c.JSON(http.StatusInternalServerError, map[string]string{"error": err.Error()})
}
err = h.db.UpdateSystemSetting(c.Request().Context(), database.UpdateSystemSettingParams{
SettingKey: "auto_scan_enabled",
SettingValue: autoScanValue,
})
if err != nil {
if err == pgx.ErrNoRows {
return c.JSON(http.StatusNotFound, map[string]string{"error": "system setting not found"})
}
return c.JSON(http.StatusInternalServerError, map[string]string{"error": err.Error()})
}
return c.JSON(http.StatusOK, ScanSettingsResponse{
ScanPollIntervalSeconds: req.ScanPollIntervalSeconds,
AutoScanEnabled: req.AutoScanEnabled,
Message: "scan settings updated successfully",
})
}
func (h *SystemSettingsHandler) GetScanSettings(c *echo.Context) error {
scanFrequencySetting, err := h.db.GetSystemSetting(c.Request().Context(), "scan_poll_interval_seconds")
if err != nil {
if err == pgx.ErrNoRows {
return c.JSON(http.StatusOK, ScanSettingsResponse{
ScanPollIntervalSeconds: 60,
AutoScanEnabled: true,
})
}
return c.JSON(http.StatusInternalServerError, map[string]string{"error": err.Error()})
}
autoScanSetting, err := h.db.GetSystemSetting(c.Request().Context(), "auto_scan_enabled")
if err != nil {
if err == pgx.ErrNoRows {
return c.JSON(http.StatusOK, ScanSettingsResponse{
ScanPollIntervalSeconds: 60,
AutoScanEnabled: true,
})
}
return c.JSON(http.StatusInternalServerError, map[string]string{"error": err.Error()})
}
scanFrequency, err := strconv.ParseInt(scanFrequencySetting, 10, 32)
if err != nil {
return c.JSON(http.StatusInternalServerError, map[string]string{"error": "invalid scan frequency setting"})
}
autoScanEnabled, err := strconv.ParseBool(autoScanSetting)
if err != nil {
return c.JSON(http.StatusInternalServerError, map[string]string{"error": "invalid auto scan setting"})
}
return c.JSON(http.StatusOK, ScanSettingsResponse{
ScanPollIntervalSeconds: int32(scanFrequency),
AutoScanEnabled: autoScanEnabled,
})
}