210 lines
5.4 KiB
Go
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
|
|
}
|