|
@@ -0,0 +1,148 @@
|
|
|
+package models
|
|
|
+
|
|
|
+import (
|
|
|
+ "errors"
|
|
|
+ "fmt"
|
|
|
+ "strings"
|
|
|
+ "time"
|
|
|
+
|
|
|
+ "github.com/dchest/scrypt"
|
|
|
+) // user type
|
|
|
+const (
|
|
|
+ Individual = iota + 1
|
|
|
+ Organization
|
|
|
+)
|
|
|
+
|
|
|
+// login type
|
|
|
+const (
|
|
|
+ Plain = iota + 1
|
|
|
+ LDAP
|
|
|
+)
|
|
|
+
|
|
|
+type User struct {
|
|
|
+ Id int64
|
|
|
+ LowerName string `xorm:"unique not null"`
|
|
|
+ Name string `xorm:"unique not null"`
|
|
|
+ Email string `xorm:"unique not null"`
|
|
|
+ Passwd string `xorm:"not null"`
|
|
|
+ LoginType int
|
|
|
+ Type int
|
|
|
+ NumFollowers int
|
|
|
+ NumFollowings int
|
|
|
+ NumStars int
|
|
|
+ NumRepos int
|
|
|
+ Avatar string `xorm:"varchar(2048) not null"`
|
|
|
+ Created time.Time `xorm:"created"`
|
|
|
+ Updated time.Time `xorm:"updated"`
|
|
|
+}
|
|
|
+
|
|
|
+type Follow struct {
|
|
|
+ Id int64
|
|
|
+ UserId int64 `xorm:"unique(s)"`
|
|
|
+ FollowId int64 `xorm:"unique(s)"`
|
|
|
+ Created time.Time `xorm:"created"`
|
|
|
+}
|
|
|
+
|
|
|
+const (
|
|
|
+ OpCreateRepo = iota + 1
|
|
|
+ OpDeleteRepo
|
|
|
+ OpStarRepo
|
|
|
+ OpFollowRepo
|
|
|
+ OpCommitRepo
|
|
|
+ OpPullRequest
|
|
|
+)
|
|
|
+
|
|
|
+type Action struct {
|
|
|
+ Id int64
|
|
|
+ UserId int64
|
|
|
+ OpType int
|
|
|
+ RepoId int64
|
|
|
+ Content string
|
|
|
+ Created time.Time `xorm:"created"`
|
|
|
+}
|
|
|
+
|
|
|
+var (
|
|
|
+ ErrUserNotExist = errors.New("User not exist")
|
|
|
+)
|
|
|
+
|
|
|
+// user's name should be noncased unique
|
|
|
+func IsUserExist(name string) (bool, error) {
|
|
|
+ return orm.Get(&User{LowerName: strings.ToLower(name)})
|
|
|
+}
|
|
|
+
|
|
|
+func RegisterUser(user *User) error {
|
|
|
+ _, err := orm.Insert(user)
|
|
|
+ return err
|
|
|
+}
|
|
|
+
|
|
|
+func UpdateUser(user *User) error {
|
|
|
+ _, err := orm.Id(user.Id).Update(user)
|
|
|
+ return err
|
|
|
+}
|
|
|
+
|
|
|
+func (user *User) EncodePasswd(pass string) error {
|
|
|
+ newPasswd, err := scrypt.Key([]byte(user.Passwd), []byte("!#@FDEWREWR&*("), 16384, 8, 1, 64)
|
|
|
+ user.Passwd = fmt.Sprintf("%x", newPasswd)
|
|
|
+ return err
|
|
|
+}
|
|
|
+
|
|
|
+func LoginUserPlain(name, passwd string) (*User, error) {
|
|
|
+ user := User{Name: name}
|
|
|
+ err := user.EncodePasswd(passwd)
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+
|
|
|
+ has, err := orm.Get(&user)
|
|
|
+ if !has {
|
|
|
+ err = ErrUserNotExist
|
|
|
+ }
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ return &user, nil
|
|
|
+}
|
|
|
+
|
|
|
+func FollowUser(userId int64, followId int64) error {
|
|
|
+ session := orm.NewSession()
|
|
|
+ defer session.Close()
|
|
|
+ session.Begin()
|
|
|
+ _, err := session.Insert(&Follow{UserId: userId, FollowId: followId})
|
|
|
+ if err != nil {
|
|
|
+ session.Rollback()
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ _, err = session.Exec("update user set num_followers = num_followers + 1 where id = ?", followId)
|
|
|
+ if err != nil {
|
|
|
+ session.Rollback()
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ _, err = session.Exec("update user set num_followings = num_followings + 1 where id = ?", userId)
|
|
|
+ if err != nil {
|
|
|
+ session.Rollback()
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ return session.Commit()
|
|
|
+}
|
|
|
+
|
|
|
+func UnFollowUser(userId int64, unFollowId int64) error {
|
|
|
+ session := orm.NewSession()
|
|
|
+ defer session.Close()
|
|
|
+ session.Begin()
|
|
|
+ _, err := session.Delete(&Follow{UserId: userId, FollowId: unFollowId})
|
|
|
+ if err != nil {
|
|
|
+ session.Rollback()
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ _, err = session.Exec("update user set num_followers = num_followers - 1 where id = ?", unFollowId)
|
|
|
+ if err != nil {
|
|
|
+ session.Rollback()
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ _, err = session.Exec("update user set num_followings = num_followings - 1 where id = ?", userId)
|
|
|
+ if err != nil {
|
|
|
+ session.Rollback()
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ return session.Commit()
|
|
|
+}
|