|  | @@ -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()
 | 
	
		
			
				|  |  | +}
 |