70 lines
1.6 KiB
Go
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
|
|
}
|