69 lines
1.8 KiB
Go
69 lines
1.8 KiB
Go
package catalog
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
"github.com/jackc/pgx/v5/pgxpool"
|
|
)
|
|
|
|
// ServerSettingsRepo provides CRUD access to the server_settings table.
|
|
type ServerSettingsRepo struct {
|
|
pool *pgxpool.Pool
|
|
}
|
|
|
|
// NewServerSettingsRepo creates a new ServerSettingsRepo.
|
|
func NewServerSettingsRepo(pool *pgxpool.Pool) *ServerSettingsRepo {
|
|
return &ServerSettingsRepo{pool: pool}
|
|
}
|
|
|
|
// Get retrieves a single setting by key. Returns empty string if not found.
|
|
func (r *ServerSettingsRepo) Get(ctx context.Context, key string) (string, error) {
|
|
var value string
|
|
err := r.pool.QueryRow(ctx,
|
|
`SELECT value FROM server_settings WHERE key = $1`, key,
|
|
).Scan(&value)
|
|
if err != nil {
|
|
if err.Error() == "no rows in result set" {
|
|
return "", nil
|
|
}
|
|
return "", fmt.Errorf("server_settings get %q: %w", key, err)
|
|
}
|
|
return value, nil
|
|
}
|
|
|
|
// Set upserts a setting.
|
|
func (r *ServerSettingsRepo) Set(ctx context.Context, key, value string) error {
|
|
_, err := r.pool.Exec(ctx,
|
|
`INSERT INTO server_settings (key, value) VALUES ($1, $2)
|
|
ON CONFLICT (key) DO UPDATE SET value = EXCLUDED.value`,
|
|
key, value,
|
|
)
|
|
if err != nil {
|
|
return fmt.Errorf("server_settings set %q: %w", key, err)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// GetAll retrieves all settings as a map.
|
|
func (r *ServerSettingsRepo) GetAll(ctx context.Context) (map[string]string, error) {
|
|
rows, err := r.pool.Query(ctx, `SELECT key, value FROM server_settings`)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("server_settings get all: %w", err)
|
|
}
|
|
defer rows.Close()
|
|
|
|
settings := make(map[string]string)
|
|
for rows.Next() {
|
|
var k, v string
|
|
if err := rows.Scan(&k, &v); err != nil {
|
|
return nil, fmt.Errorf("server_settings scan: %w", err)
|
|
}
|
|
settings[k] = v
|
|
}
|
|
if err := rows.Err(); err != nil {
|
|
return nil, fmt.Errorf("server_settings iterate: %w", err)
|
|
}
|
|
return settings, nil
|
|
}
|