From d40321685e2a82bafdfdb2891fb17d354db925dd Mon Sep 17 00:00:00 2001 From: LordMathis Date: Sat, 11 Oct 2025 21:04:01 +0200 Subject: [PATCH] Remove system settings functionality and related database migrations --- README.md | 2 +- server/internal/db/db.go | 4 +- .../postgres/001_initial_schema.down.sql | 1 - .../postgres/001_initial_schema.up.sql | 8 -- .../sqlite/001_initial_schema.down.sql | 1 - .../sqlite/001_initial_schema.up.sql | 8 -- server/internal/db/migrations_test.go | 1 - server/internal/db/system.go | 51 ---------- server/internal/db/system_test.go | 94 ------------------- 9 files changed, 2 insertions(+), 168 deletions(-) diff --git a/README.md b/README.md index 6efa5fc..e185d4f 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ Lemma can be configured using environment variables. Here are the available conf - `LEMMA_PORT`: Port to run the server on (default: "8080") - `LEMMA_DOMAIN`: Domain name where the application is hosted for cookie authentication - `LEMMA_CORS_ORIGINS`: Comma-separated list of allowed CORS origins -- `LEMMA_JWT_SIGNING_KEY`: Key used for signing JWT tokens +- `LEMMA_JWT_SIGNING_KEY`: Key used for signing JWT tokens. If not provided, a key will be automatically generated and stored in `{LEMMA_WORKDIR}/secrets/jwt_signing_key` - `LEMMA_LOG_LEVEL`: Logging level (defaults to DEBUG in development mode, INFO in production) - `LEMMA_RATE_LIMIT_REQUESTS`: Number of allowed requests per window (default: 100) - `LEMMA_RATE_LIMIT_WINDOW`: Duration of the rate limit window (default: 15m) diff --git a/server/internal/db/db.go b/server/internal/db/db.go index a5865b6..20925ed 100644 --- a/server/internal/db/db.go +++ b/server/internal/db/db.go @@ -68,11 +68,9 @@ type SessionStore interface { CleanExpiredSessions() error } -// SystemStore defines the methods for interacting with system settings and stats in the database +// SystemStore defines the methods for interacting with system stats in the database type SystemStore interface { GetSystemStats() (*UserStats, error) - GetSystemSetting(key string) (string, error) - SetSystemSetting(key, value string) error } type StructScanner interface { diff --git a/server/internal/db/migrations/postgres/001_initial_schema.down.sql b/server/internal/db/migrations/postgres/001_initial_schema.down.sql index e95e055..6e9a1c0 100644 --- a/server/internal/db/migrations/postgres/001_initial_schema.down.sql +++ b/server/internal/db/migrations/postgres/001_initial_schema.down.sql @@ -5,5 +5,4 @@ DROP INDEX IF EXISTS idx_sessions_user_id; DROP INDEX IF EXISTS idx_workspaces_user_id; DROP TABLE IF EXISTS sessions; DROP TABLE IF EXISTS workspaces; -DROP TABLE IF EXISTS system_settings; DROP TABLE IF EXISTS users; \ No newline at end of file diff --git a/server/internal/db/migrations/postgres/001_initial_schema.up.sql b/server/internal/db/migrations/postgres/001_initial_schema.up.sql index fca49c6..3d08d60 100644 --- a/server/internal/db/migrations/postgres/001_initial_schema.up.sql +++ b/server/internal/db/migrations/postgres/001_initial_schema.up.sql @@ -46,14 +46,6 @@ CREATE TABLE IF NOT EXISTS sessions ( FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE ); --- Create system_settings table for application settings -CREATE TABLE IF NOT EXISTS system_settings ( - key TEXT PRIMARY KEY, - value TEXT NOT NULL, - created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP -); - -- Create indexes for performance CREATE INDEX IF NOT EXISTS idx_sessions_user_id ON sessions(user_id); CREATE INDEX IF NOT EXISTS idx_sessions_expires_at ON sessions(expires_at); diff --git a/server/internal/db/migrations/sqlite/001_initial_schema.down.sql b/server/internal/db/migrations/sqlite/001_initial_schema.down.sql index ba0f7de..742ff14 100644 --- a/server/internal/db/migrations/sqlite/001_initial_schema.down.sql +++ b/server/internal/db/migrations/sqlite/001_initial_schema.down.sql @@ -5,5 +5,4 @@ DROP INDEX IF EXISTS idx_sessions_user_id; DROP INDEX IF EXISTS idx_workspaces_user_id; DROP TABLE IF EXISTS sessions; DROP TABLE IF EXISTS workspaces; -DROP TABLE IF EXISTS system_settings; DROP TABLE IF EXISTS users; \ No newline at end of file diff --git a/server/internal/db/migrations/sqlite/001_initial_schema.up.sql b/server/internal/db/migrations/sqlite/001_initial_schema.up.sql index 40ef090..a718161 100644 --- a/server/internal/db/migrations/sqlite/001_initial_schema.up.sql +++ b/server/internal/db/migrations/sqlite/001_initial_schema.up.sql @@ -45,14 +45,6 @@ CREATE TABLE IF NOT EXISTS sessions ( FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE ); --- Create system_settings table for application settings -CREATE TABLE IF NOT EXISTS system_settings ( - key TEXT PRIMARY KEY, - value TEXT NOT NULL, - created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP -); - -- Create indexes for performance CREATE INDEX IF NOT EXISTS idx_sessions_user_id ON sessions(user_id); CREATE INDEX IF NOT EXISTS idx_sessions_expires_at ON sessions(expires_at); diff --git a/server/internal/db/migrations_test.go b/server/internal/db/migrations_test.go index 4998db2..7732de9 100644 --- a/server/internal/db/migrations_test.go +++ b/server/internal/db/migrations_test.go @@ -26,7 +26,6 @@ func TestMigrate(t *testing.T) { "users", "workspaces", "sessions", - "system_settings", "schema_migrations", } diff --git a/server/internal/db/system.go b/server/internal/db/system.go index 18ada6a..1a200a2 100644 --- a/server/internal/db/system.go +++ b/server/internal/db/system.go @@ -1,8 +1,6 @@ package db import ( - "crypto/rand" - "encoding/base64" "fmt" ) @@ -13,55 +11,6 @@ type UserStats struct { ActiveUsers int `json:"activeUsers"` // Users with activity in last 30 days } -// GetSystemSetting retrieves a system setting by key -func (db *database) GetSystemSetting(key string) (string, error) { - var value string - query := db.NewQuery(). - Select("value"). - From("system_settings"). - Where("key = "). - Placeholder(key) - err := db.QueryRow(query.String(), query.args...).Scan(&value) - if err != nil { - return "", err - } - - return value, nil -} - -// SetSystemSetting stores or updates a system setting -func (db *database) SetSystemSetting(key, value string) error { - query := db.NewQuery(). - Insert("system_settings", "key", "value"). - Values(2). - AddArgs(key, value). - Write("ON CONFLICT(key) DO UPDATE SET value = "). - Placeholder(value) - - _, err := db.Exec(query.String(), query.args...) - - if err != nil { - return fmt.Errorf("failed to store system setting: %w", err) - } - - return nil -} - -// generateRandomSecret generates a cryptographically secure random string -func generateRandomSecret(bytes int) (string, error) { - log := getLogger().WithGroup("system") - log.Debug("generating random secret", "bytes", bytes) - - b := make([]byte, bytes) - _, err := rand.Read(b) - if err != nil { - return "", fmt.Errorf("failed to generate random bytes: %w", err) - } - - secret := base64.StdEncoding.EncodeToString(b) - return secret, nil -} - // GetSystemStats returns system-wide statistics func (db *database) GetSystemStats() (*UserStats, error) { stats := &UserStats{} diff --git a/server/internal/db/system_test.go b/server/internal/db/system_test.go index 87ddd9c..38055f7 100644 --- a/server/internal/db/system_test.go +++ b/server/internal/db/system_test.go @@ -2,7 +2,6 @@ package db_test import ( "fmt" - "strings" "testing" "time" @@ -24,99 +23,6 @@ func TestSystemOperations(t *testing.T) { t.Fatalf("failed to run migrations: %v", err) } - t.Run("GetSystemSettings", func(t *testing.T) { - t.Run("non-existent setting", func(t *testing.T) { - _, err := database.GetSystemSetting("nonexistent-key") - if err == nil { - t.Error("expected error for non-existent key, got nil") - } - }) - - t.Run("existing setting", func(t *testing.T) { - // First set a value - err := database.SetSystemSetting("test-key", "test-value") - if err != nil { - t.Fatalf("failed to set system setting: %v", err) - } - - // Then get it back - value, err := database.GetSystemSetting("test-key") - if err != nil { - t.Fatalf("failed to get system setting: %v", err) - } - - if value != "test-value" { - t.Errorf("got value %q, want %q", value, "test-value") - } - }) - }) - - t.Run("SetSystemSettings", func(t *testing.T) { - testCases := []struct { - name string - key string - value string - wantErr bool - errContains string - }{ - { - name: "new setting", - key: "new-key", - value: "new-value", - wantErr: false, - }, - { - name: "update existing setting", - key: "update-key", - value: "original-value", - wantErr: false, - }, - } - - for _, tc := range testCases { - t.Run(tc.name, func(t *testing.T) { - err := database.SetSystemSetting(tc.key, tc.value) - if tc.wantErr { - if err == nil { - t.Error("expected error, got nil") - } else if !strings.Contains(err.Error(), tc.errContains) { - t.Errorf("error = %v, want error containing %v", err, tc.errContains) - } - return - } - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - - // Verify the setting was stored - stored, err := database.GetSystemSetting(tc.key) - if err != nil { - t.Fatalf("failed to retrieve stored setting: %v", err) - } - if stored != tc.value { - t.Errorf("got value %q, want %q", stored, tc.value) - } - - // For the update case, test updating the value - if tc.name == "update existing setting" { - newValue := "updated-value" - err := database.SetSystemSetting(tc.key, newValue) - if err != nil { - t.Fatalf("failed to update setting: %v", err) - } - - stored, err := database.GetSystemSetting(tc.key) - if err != nil { - t.Fatalf("failed to retrieve updated setting: %v", err) - } - if stored != newValue { - t.Errorf("got updated value %q, want %q", stored, newValue) - } - } - }) - } - }) - t.Run("GetSystemStats", func(t *testing.T) { // Create some test users and sessions users := []*models.User{