package database import ( "database/sql" "time" "github.com/jmoiron/sqlx" "github.com/peterqiu0516/sub-store/internal/util" ) const settingsID = "default" type SettingsRepo struct { db *sqlx.DB } func NewSettingsRepo(db *sqlx.DB) *SettingsRepo { return &SettingsRepo{db: db} } func (r *SettingsRepo) Get() (map[string]any, error) { var valueJSON string err := r.db.Get(&valueJSON, "SELECT value_json FROM app_settings WHERE id = ?", settingsID) if err != nil { if err == sql.ErrNoRows { return map[string]any{}, nil } return map[string]any{}, err } var settings map[string]any jsonUnmarshal(valueJSON, &settings) if settings == nil { settings = map[string]any{} } return settings, nil } func (r *SettingsRepo) Update(next map[string]any) (map[string]any, error) { current, err := r.Get() if err != nil { return nil, err } merged := util.MergeDeep(current, next) now := time.Now().UnixMilli() mergedJSON := marshalJSON(merged) _, err = r.db.Exec( `INSERT INTO app_settings (id, value_json, updated_at) VALUES (?, ?, ?) ON CONFLICT(id) DO UPDATE SET value_json = excluded.value_json, updated_at = excluded.updated_at`, settingsID, mergedJSON, now, ) if err != nil { return nil, err } return merged, nil } func (r *SettingsRepo) Replace(settings map[string]any) error { now := time.Now().UnixMilli() mergedJSON := marshalJSON(settings) _, err := r.db.Exec( `INSERT INTO app_settings (id, value_json, updated_at) VALUES (?, ?, ?) ON CONFLICT(id) DO UPDATE SET value_json = excluded.value_json, updated_at = excluded.updated_at`, settingsID, mergedJSON, now, ) return err }