Files
sub-store/internal/database/settings_repo.go
T

70 lines
1.6 KiB
Go

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
}