Zippytal-Node/zoneUsersDBHandler.go
2021-12-08 15:58:40 +01:00

210 lines
5.4 KiB
Go

package localserver
import (
"encoding/json"
"path/filepath"
"github.com/dgraph-io/badger/v3"
)
type User struct {
ID string `json:"id"`
Name string `json:"name"`
ChatRights string `json:"chatRights"`
AudioChannelRights string `json:"audioChannelRights"`
VideoChannelRights string `json:"videoChannelRights"`
MediaRights string `json:"mediaRights"`
FileRights string `json:"fileRights"`
KnownChatsId []string `json:"knownChatsId"`
KnownAudioChannelsId []string `json:"knownAudioChannelsId"`
KnownVideoChannelsId []string `json:"knownVideoChannelsId"`
KnownMediaFolderId []string `json:"knownMediaFolderId"`
KnownFileFolderId []string `json:"knownFileFolderId"`
Admin bool `json:"admin"`
Owner bool `json:"owner"`
}
type ZoneUsersDBHandler struct {
ZoneID string
db func(func(*badger.DB) (err error)) (err error)
}
func NewZoneUsersDBHandler(zoneId string, owner string, authorizedMembers []string, init bool) (zoneChatDBHandler *ZoneUsersDBHandler, err error) {
db := func(f func(*badger.DB) (err error)) (err error) {
db, err := badger.Open(badger.DefaultOptions(filepath.Join("data", "zones", zoneId, "users")).WithLogger(dbLogger))
if err != nil {
return
}
defer db.Close()
err = f(db)
return
}
if init {
admin := &User{
ID: owner,
Name: owner,
ChatRights: "",
AudioChannelRights: "",
VideoChannelRights: "",
MediaRights: "",
FileRights: "",
KnownChatsId: []string{},
KnownAudioChannelsId: []string{},
KnownVideoChannelsId: []string{},
KnownMediaFolderId: make([]string, 0),
KnownFileFolderId: make([]string, 0),
Admin: true,
Owner: true,
}
bs, jsonErr := json.Marshal(admin)
if jsonErr != nil {
return nil, jsonErr
}
if err = db(func(d *badger.DB) (err error) {
err = d.Update(func(txn *badger.Txn) (err error) {
err = txn.Set([]byte(owner), bs)
return
})
return
}); err != nil {
return
}
}
if err = db(func(d *badger.DB) (err error) {
err = d.Update(func(txn *badger.Txn) (err error) {
for _, member := range authorizedMembers {
if member != owner {
if _, berr := txn.Get([]byte(member)); berr == badger.ErrKeyNotFound {
logger.Println("creating new user", member)
user := &User{
ID: member,
Name: member,
ChatRights: "",
AudioChannelRights: "",
VideoChannelRights: "",
MediaRights: "",
FileRights: "",
KnownChatsId: []string{},
KnownAudioChannelsId: []string{},
KnownVideoChannelsId: []string{},
KnownMediaFolderId: make([]string, 0),
KnownFileFolderId: make([]string, 0),
Admin: false,
Owner: false,
}
bs, jsonErr := json.Marshal(user)
if jsonErr != nil {
return jsonErr
}
if err = txn.Set([]byte(member), bs); err != nil {
return
}
}
}
}
return nil
})
return
}); err != nil {
return
}
zoneChatDBHandler = &ZoneUsersDBHandler{
db: db,
ZoneID: zoneId,
}
return
}
func (zcdbh *ZoneUsersDBHandler) AddNewUser(user *User) (err error) {
bs, err := json.Marshal(user)
if err != nil {
return
}
if err = zcdbh.db(func(d *badger.DB) (err error) {
err = d.Update(func(txn *badger.Txn) error {
if _, notFoundErr := txn.Get([]byte(user.ID)); notFoundErr == badger.ErrKeyNotFound {
if updateErr := txn.Set([]byte(user.ID), bs); updateErr != nil {
return updateErr
}
}
return nil
})
return
}); err != nil {
return
}
return
}
func (zcdbh *ZoneUsersDBHandler) DeleteUser(id string) (err error) {
err = zcdbh.db(func(d *badger.DB) (err error) {
err = d.Update(func(txn *badger.Txn) (err error) {
err = txn.Delete([]byte(id))
return
})
return
})
return
}
func (zcdbh *ZoneUsersDBHandler) ListUsers(lastIndex int, limit int) (users []*User, err error) {
err = zcdbh.db(func(d *badger.DB) (err error) {
err = d.View(func(txn *badger.Txn) error {
opt := badger.DefaultIteratorOptions
opt.Reverse = true
it := txn.NewIterator(opt)
defer it.Close()
users = make([]*User, 0)
for it.Rewind(); it.Valid(); it.Next() {
item := it.Item()
if err = item.Value(func(val []byte) error {
var user *User
if jsonErr := json.Unmarshal(val, &user); jsonErr != nil {
return jsonErr
}
users = append(users, user)
return nil
}); err != nil {
return err
}
}
return nil
})
return
})
return
}
func (zcdbh *ZoneUsersDBHandler) GetUser(id string) (user *User, err error) {
err = zcdbh.db(func(d *badger.DB) (err error) {
err = d.View(func(txn *badger.Txn) error {
item, err := txn.Get([]byte(id))
if err != nil {
return err
}
err = item.Value(func(val []byte) (err error) {
err = json.Unmarshal(val, &user)
return
})
return err
})
return
})
return
}
func (zcdbh *ZoneUsersDBHandler) ModifyUser(id string, user *User) (err error) {
bs, err := json.Marshal(user)
if err != nil {
return
}
err = zcdbh.db(func(d *badger.DB) (err error) {
err = d.Update(func(txn *badger.Txn) (err error) {
err = txn.Set([]byte(id), bs)
return
})
return
})
return
}