package setting import ( "encoding/json" "errors" "git.kor-elf.net/kor-elf/gui-for-ffmpeg/db" "go.etcd.io/bbolt" ) type RepositoryContract interface { Create(setting Setting) (Setting, error) CreateOrUpdate(code string, value string) (Setting, error) GetValue(code string) (value string, err error) } type Repository struct { db *bbolt.DB } func NewRepository(db *bbolt.DB) *Repository { return &Repository{db} } func (r Repository) GetValue(code string) (value string, err error) { var setting Setting err = r.db.View(func(tx *bbolt.Tx) error { b := tx.Bucket([]byte("settings")) if b == nil { return errors.New("bucket 'settings' not found") } val := b.Get([]byte(code)) if val == nil { return db.ErrRecordNotFound } return json.Unmarshal(val, &setting) }) if err != nil { return "", err } return setting.Value, nil } func (r Repository) Create(setting Setting) (Setting, error) { err := r.db.Update(func(tx *bbolt.Tx) error { b := tx.Bucket([]byte("settings")) if b == nil { return errors.New("bucket 'settings' not found") } data, err := json.Marshal(setting) if err != nil { return err } return b.Put([]byte(setting.Code), data) }) return setting, err } func (r Repository) CreateOrUpdate(code string, value string) (Setting, error) { var setting Setting setting.Code = code setting.Value = value err := r.db.Update(func(tx *bbolt.Tx) error { b := tx.Bucket([]byte("settings")) if b == nil { return errors.New("bucket 'settings' not found") } data, err := json.Marshal(setting) if err != nil { return err } return b.Put([]byte(code), data) }) return setting, err }