ribbit/model_user.go

146 lines
2.8 KiB
Go

package main
import (
"errors"
"fmt"
"strings"
"github.com/pborman/uuid"
)
type User struct {
Username string `json:username`
Uuid string `json:uuid`
SubSlugs []string `json:subs`
}
func NewUser(un string) *User {
u := new(User)
u.Username = un
u.Uuid = uuid.New()
return u
}
func (u *User) UpdateFeed() error {
for _, slug := range u.SubSlugs {
pts := strings.Split(slug, ";")
if len(pts) != 2 {
continue
}
if comic, err := m.GetComic(pts[0], pts[1]); err == nil {
comic.Update()
}
}
return nil
}
func (m *model) SaveUser(u *User) error {
var err error
if err = m.bolt.OpenDB(); err != nil {
return err
}
defer m.bolt.CloseDB()
bkt := []string{"users", u.Uuid}
if err = m.bolt.MkBucketPath(bkt); err != nil {
return err
}
if err = m.bolt.SetValue(bkt, "username", u.Username); err != nil {
return err
}
var newSubs []string
for _, v := range u.SubSlugs {
if strings.TrimSpace(v) != "" {
newSubs = append(newSubs, v)
}
}
slugs := strings.Join(newSubs, ",")
if err = m.bolt.SetValue(bkt, "subs", slugs); err != nil {
return err
}
return nil
}
func (m *model) GetUser(uid string) (*User, error) {
var err error
if err = m.bolt.OpenDB(); err != nil {
return nil, err
}
defer m.bolt.CloseDB()
ret := new(User)
bkt := []string{"users", uid}
ret.Uuid = uid
if ret.Username, err = m.bolt.GetValue(bkt, "username"); err != nil {
fmt.Println("Error getting username value:", err.Error())
return nil, err
}
var subs string
if subs, err = m.bolt.GetValue(bkt, "subs"); err != nil {
return nil, err
}
ret.SubSlugs = strings.Split(subs, ",")
return ret, nil
}
func (m *model) SaveAllUsers(users []User) {
var err error
if err = m.bolt.OpenDB(); err != nil {
return
}
defer m.bolt.CloseDB()
for i := range users {
m.SaveUser(&users[i])
}
}
func (m *model) LoadUsers() error {
m.Users = m.GetAllUsers()
return nil
}
func (m *model) GetAllUsers() []User {
var err error
var ret []User
if err = m.bolt.OpenDB(); err != nil {
return ret
}
defer m.bolt.CloseDB()
uids := m.GetUserIdList()
for _, uid := range uids {
if u, e := m.GetUser(uid); e == nil {
ret = append(ret, *u)
}
}
return ret
}
func (m *model) GetUserByName(nm string) (*User, error) {
var err error
if err = m.bolt.OpenDB(); err != nil {
return nil, err
}
defer m.bolt.CloseDB()
usrids := m.GetUserIdList()
for i := range usrids {
bkt := []string{"users", usrids[i]}
var tstuname string
if tstuname, _ = m.bolt.GetValue(bkt, "username"); tstuname == nm {
// Found it
return m.GetUser(usrids[i])
}
}
return nil, errors.New("No user with username " + nm + " found")
}
func (m *model) GetUserIdList() []string {
var ret []string
var err error
if err = m.bolt.OpenDB(); err != nil {
return ret
}
defer m.bolt.CloseDB()
bkt := []string{"users"}
ret, _ = m.bolt.GetBucketList(bkt)
return ret
}