package models import ( "fmt" "os" "time" "github.com/toolkits/pkg/logger" "github.com/toolkits/pkg/str" ) type UserToken struct { UserId int64 `json:"user_id"` Username string `json:"username"` Token string `json:"token"` } func (UserToken) TableName() string { return "user_token" } func UserTokenGet(where string, args ...interface{}) (*UserToken, error) { var obj UserToken has, err := DB.Where(where, args...).Get(&obj) if err != nil { logger.Errorf("mysql.error: query user_token fail: %v", err) return nil, internalServerError } if !has { return nil, nil } return &obj, nil } func UserTokenGets(where string, args ...interface{}) ([]UserToken, error) { var objs []UserToken err := DB.Where(where, args...).OrderBy("token").Find(&objs) if err != nil { logger.Errorf("mysql.error: list user_token fail: %v", err) return objs, internalServerError } if objs == nil { return []UserToken{}, nil } return objs, nil } func UserTokenNew(userId int64, username string) (*UserToken, error) { items, err := UserTokenGets("user_id=?", userId) if err != nil { return nil, err } if len(items) >= 2 { return nil, _e("Each user has at most two tokens") } obj := UserToken{ UserId: userId, Username: username, Token: genToken(userId), } err = DBInsertOne(obj) if err != nil { return nil, err } return &obj, nil } func UserTokenReset(userId int64, token string) (*UserToken, error) { obj, err := UserTokenGet("token=? and user_id=?", token, userId) if err != nil { return nil, err } if obj == nil { return nil, _e("No such token") } obj.Token = genToken(userId) _, err = DB.Where("user_id=? and token=?", userId, token).Cols("token").Update(obj) if err != nil { logger.Errorf("mysql.error: update user_token fail: %v", err) return nil, internalServerError } return obj, nil } func genToken(userId int64) string { now := time.Now().UnixNano() rls := str.RandLetters(6) return str.MD5(fmt.Sprintf("%d%d%d%s", os.Getpid(), userId, now, rls)) }