package models import ( "errors" "fmt" "github.com/globalsign/mgo/bson" ) //User model type User struct { ID bson.ObjectId `bson:"_id,omitempty"` Email string `bson:"email"` Name string `bson:"name"` Username string `bson:"username"` Password string `bson:"password"` PrimaryGroup bson.ObjectId `bson:"primarygroup,omitempty"` Groups []bson.ObjectId `bson:"groups,omitempty"` Session string } //Create user func (u *User) Create() error { var user User read("user", "email", u.Email, &user) if u.Email == user.Email { return errors.New("Email all ready used") } return create("user", &u) } //Read user func (u *User) Read(key string, value interface{}) error { err := read("user", key, value, &u) if err != nil { return errors.New("User doesn't exist") } return nil } //ReadAll users func (u *User) ReadAll() ([]User, error) { var users []User var err error err = readAll("user", "", nil, &users) return users, err } //Update user func (u *User) Update() error { return update("user", "_id", u.ID, &u) } //Delete user func (u *User) Delete(key string, value string) error { err := delete("user", key, value) return err } //HasPermission check if a given user is admin or has a given permisssion func (u *User) HasPermission(perm string) bool { var group Group //Check primary group err := group.Read("_id", u.PrimaryGroup) fmt.Println(group.Admin) if err == nil && (group.Admin == true || group.Permissions[perm] == true) { return true } //Check other groups for id := range u.Groups { err = group.Read("_id", id) if err == nil && (group.Admin || group.Permissions[perm]) { return true } } return false }