This repository has been archived on 2026-07-15. You can view files and clone it, but you cannot make any changes to it's state, such as pushing and creating new issues, pull requests or comments.
drive/backend/handlers/settings.go
Elijah 71ba029fbc
All checks were successful
Automated Container Build / build-and-push (push) Successful in 1m18s
feat: implement trash auto-purge, settings layout update, larger folder icons, and legacy version cleanup
2026-05-22 18:41:16 -07:00

94 lines
2.5 KiB
Go

package handlers
import (
"git.elijahkuntz.com/Elijah/drive/database"
"github.com/gofiber/fiber/v2"
)
type SettingsHandler struct {
DB *database.DB
}
// GetSettings returns all application settings.
// GET /api/settings
func (h *SettingsHandler) GetSettings(c *fiber.Ctx) error {
rows, err := h.DB.Query("SELECT key, value FROM settings")
if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": "database error"})
}
defer rows.Close()
settings := make(map[string]string)
for rows.Next() {
var key, value string
if err := rows.Scan(&key, &value); err != nil {
continue
}
settings[key] = value
}
return c.JSON(fiber.Map{"settings": settings})
}
// UpdateSettings updates multiple settings at once.
// PUT /api/settings
func (h *SettingsHandler) UpdateSettings(c *fiber.Ctx) error {
var body map[string]string
if err := c.BodyParser(&body); err != nil {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "invalid request body"})
}
allowedKeys := map[string]bool{
"theme": true,
"thumbnail_images": true,
"thumbnail_videos": true,
"trash_auto_purge_days": true,
}
for key, value := range body {
if !allowedKeys[key] {
continue // Skip unknown keys silently
}
if err := h.DB.SetSetting(key, value); err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": "failed to update setting: " + key})
}
h.DB.AddAuditLog("setting_changed", key+"="+value, c.IP())
}
return c.JSON(fiber.Map{"message": "settings updated"})
}
// GetAuditLog returns the audit log entries.
// GET /api/audit
func (h *SettingsHandler) GetAuditLog(c *fiber.Ctx) error {
limit := c.QueryInt("limit", 100)
offset := c.QueryInt("offset", 0)
rows, err := h.DB.Query(
"SELECT id, action, details, ip_address, created_at FROM audit_log ORDER BY created_at DESC LIMIT ? OFFSET ?",
limit, offset,
)
if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": "database error"})
}
defer rows.Close()
type AuditEntry struct {
ID int `json:"id"`
Action string `json:"action"`
Details string `json:"details"`
IP string `json:"ip"`
CreatedAt string `json:"created_at"`
}
entries := []AuditEntry{}
for rows.Next() {
var e AuditEntry
if err := rows.Scan(&e.ID, &e.Action, &e.Details, &e.IP, &e.CreatedAt); err != nil {
continue
}
entries = append(entries, e)
}
return c.JSON(fiber.Map{"entries": entries, "count": len(entries)})
}