mirror of
https://github.com/sascha-hemi/spaceDevices.git
synced 2026-03-21 05:06:36 +01:00
86 lines
1.7 KiB
Go
86 lines
1.7 KiB
Go
package db
|
|
|
|
import (
|
|
"encoding/json"
|
|
"io/ioutil"
|
|
"sync"
|
|
|
|
"github.com/ktt-ol/spaceDevices/internal/conf"
|
|
log "github.com/sirupsen/logrus"
|
|
)
|
|
|
|
type UserDb interface {
|
|
Get(mac string) (UserDbEntry, bool)
|
|
Set(mac string, info UserDbEntry)
|
|
Delete(mac string)
|
|
}
|
|
|
|
type UserDbEntry struct {
|
|
Name string `json:"name"`
|
|
DeviceName string `json:"device-name"`
|
|
Visibility Visibility `json:"visibility"`
|
|
// last change in ms
|
|
Ts int64 `json:"ts"`
|
|
}
|
|
|
|
type PersistentUserDb struct {
|
|
userMap map[string]UserDbEntry
|
|
lock sync.RWMutex
|
|
config conf.MacDbConf
|
|
}
|
|
|
|
func NewUserDb(config conf.MacDbConf) UserDb {
|
|
instance := &PersistentUserDb{config: config}
|
|
instance.loadDb()
|
|
return instance
|
|
}
|
|
|
|
func (db *PersistentUserDb) Get(mac string) (UserDbEntry, bool) {
|
|
db.lock.RLock()
|
|
value, ok := db.userMap[mac]
|
|
db.lock.RUnlock()
|
|
return value, ok
|
|
}
|
|
|
|
func (db *PersistentUserDb) Set(mac string, info UserDbEntry) {
|
|
db.lock.Lock()
|
|
defer db.lock.Unlock()
|
|
db.userMap[mac] = info
|
|
db.saveDb()
|
|
}
|
|
|
|
func (db *PersistentUserDb) Delete(mac string) {
|
|
db.lock.Lock()
|
|
defer db.lock.Unlock()
|
|
delete(db.userMap, mac)
|
|
db.saveDb()
|
|
}
|
|
|
|
func (db *PersistentUserDb) loadDb() {
|
|
db.lock.Lock()
|
|
defer db.lock.Unlock()
|
|
|
|
file, err := ioutil.ReadFile(db.config.UserFile)
|
|
if err != nil {
|
|
log.Fatal("UserFile error: ", err)
|
|
}
|
|
|
|
var parsed map[string]UserDbEntry
|
|
if err = json.Unmarshal(file, &parsed); err != nil {
|
|
log.Fatal("UserFile unmarshal err: ", err)
|
|
}
|
|
|
|
db.userMap = parsed
|
|
}
|
|
|
|
func (db *PersistentUserDb) saveDb() {
|
|
bytes, err := json.MarshalIndent(db.userMap, "", " ")
|
|
if err != nil {
|
|
log.Fatal("Can't marshal the userDb: ", err)
|
|
}
|
|
|
|
if err = ioutil.WriteFile(db.config.UserFile, bytes, 0644); err != nil {
|
|
log.Fatal("Can't save the userDb: ", err)
|
|
}
|
|
}
|