Files
sbv/internal/settings.go
T

113 lines
2.5 KiB
Go

package internal
import (
"database/sql"
"encoding/json"
"net/http"
"time"
"github.com/labstack/echo/v4"
)
// Settings represents user settings stored as JSON
type Settings struct {
Conversations ConversationSettings `json:"conversations"`
}
// ConversationSettings contains settings for the conversation view
type ConversationSettings struct {
ShowCalls bool `json:"show_calls"`
MessageLimit int `json:"message_limit"`
}
// GetDefaultSettings returns the default settings
func GetDefaultSettings() Settings {
return Settings{
Conversations: ConversationSettings{
ShowCalls: true,
MessageLimit: 100000,
},
}
}
// GetUserSettings retrieves settings for a user
func GetUserSettings(userID string) (Settings, error) {
var settingsJSON string
var updatedAt int64
err := authDB.QueryRow(
"SELECT settings_json, updated_at FROM settings WHERE user_id = ?",
userID,
).Scan(&settingsJSON, &updatedAt)
if err == sql.ErrNoRows {
// Return default settings if no settings exist
return GetDefaultSettings(), nil
}
if err != nil {
return Settings{}, err
}
var settings Settings
if err := json.Unmarshal([]byte(settingsJSON), &settings); err != nil {
return Settings{}, err
}
return settings, nil
}
// SaveUserSettings saves settings for a user
func SaveUserSettings(userID string, settings Settings) error {
settingsJSON, err := json.Marshal(settings)
if err != nil {
return err
}
now := time.Now().Unix()
_, err = authDB.Exec(`
INSERT INTO settings (user_id, settings_json, updated_at)
VALUES (?, ?, ?)
ON CONFLICT(user_id) DO UPDATE SET
settings_json = excluded.settings_json,
updated_at = excluded.updated_at
`, userID, string(settingsJSON), now)
return err
}
// HandleGetSettings handles GET /api/settings
func HandleGetSettings(c echo.Context) error {
userID := c.Get("user_id").(string)
settings, err := GetUserSettings(userID)
if err != nil {
return c.JSON(http.StatusInternalServerError, map[string]string{
"error": "Failed to get settings",
})
}
return c.JSON(http.StatusOK, settings)
}
// HandleUpdateSettings handles PUT /api/settings
func HandleUpdateSettings(c echo.Context) error {
userID := c.Get("user_id").(string)
var settings Settings
if err := c.Bind(&settings); err != nil {
return c.JSON(http.StatusBadRequest, map[string]string{
"error": "Invalid settings data",
})
}
if err := SaveUserSettings(userID, settings); err != nil {
return c.JSON(http.StatusInternalServerError, map[string]string{
"error": "Failed to save settings",
})
}
return c.JSON(http.StatusOK, settings)
}