package one import ( "time" "zhiyuan/models" "zhiyuan/pkg/config" "zhiyuan/pkg/db" "zhiyuan/pkg/errcode" "zhiyuan/pkg/redis" "zhiyuan/pkg/utils" "zhiyuan/services/form" ) const tokenPrefix = "activity_one_user_token_" var User models.ActivityOneUser func Login(form form.ActivityLogin) (string, error) { userMap := map[string]interface{}{ "openid": form.OpenID, } userID := 0 if user, _ := GetOne(map[string]interface{}{"openid": form.OpenID}, nil, nil); user == nil { if id, err := db.InsertOne(User.TableName(), userMap); err != nil { return "", err } else { userID = int(id) } } else { db.Update(User.TableName(), map[string]interface{}{"id": user.ID}, userMap) userID = user.ID } return UpdateToken(userID) } func InsertOne(data map[string]interface{}) (int64, error) { return db.InsertOne(User.TableName(), data) } func GetOne(where map[string]interface{}, fields []string, retVal interface{}) (*models.ActivityOneUser, error) { return User.GetOne(where, fields, retVal) } func GetInfoByToken(token string, fields []string, retVal interface{}) (*models.ActivityOneUser, error) { return GetOne(map[string]interface{}{"access_token": token}, fields, retVal) } func CheckToken(token string) (*models.ActivityOneUser, errcode.Err) { result, err := redis.Get(tokenPrefix + token) var user *models.ActivityOneUser if err != nil { user, err = GetInfoByToken(token, nil, nil) if err != nil || user == nil { return nil, errcode.TokenInvalid } redis.Set(tokenPrefix+"_"+token, user, 3600) redis.Set(tokenPrefix+"_"+utils.ToStr(user.ID), tokenPrefix+token, 3600) } else { utils.JsonDecode(result).To(&user) } if user == nil || time.Now().Unix() >= utils.StrTo(utils.ToStr(user.AccessTokenExpired)).MustInt64() { return nil, errcode.TokenExpired } return user, errcode.Err{} } func UpdateToken(id int) (string, error) { token := utils.MD5(utils.ToStr(time.Now().UnixNano()) + string(utils.RandomCreateBytes(10, utils.RAND_KIND_ALL))) tokenExpired := int(time.Now().Unix()) + config.Cfg.App.TokenExpire _, err := db.Update(User.TableName(), map[string]interface{}{"id": id}, map[string]interface{}{ "access_token": token, "access_token_expired": tokenExpired}) if err != nil { return token, err } preToken, err := redis.Get(tokenPrefix + "_" + utils.ToStr(id)) if preToken != "" { redis.Del(preToken) } return token, nil }