All checks were successful
Automated Container Build / build-and-push (push) Successful in 1m18s
94 lines
2.5 KiB
Go
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)})
|
|
}
|