113 lines
2.5 KiB
Go
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)
|
|
}
|