117 lines
3.0 KiB
Go
117 lines
3.0 KiB
Go
package logic
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"strconv"
|
|
"time"
|
|
|
|
"user/internal/dao"
|
|
"user/user"
|
|
|
|
jsoniter "github.com/json-iterator/go"
|
|
"pkg.local/redis"
|
|
"pkg.local/utils"
|
|
)
|
|
|
|
func okResponse(data any) *user.Response {
|
|
buf, _ := json.Marshal(data)
|
|
return &user.Response{
|
|
Code: utils.Ok.Code,
|
|
Msg: utils.Ok.Msg,
|
|
Data: string(buf),
|
|
}
|
|
}
|
|
|
|
func failResponse(status utils.Status) *user.Response {
|
|
return &user.Response{
|
|
Code: status.Code,
|
|
Msg: status.Msg,
|
|
}
|
|
}
|
|
|
|
func outResponse(status utils.Status, msg string) *user.Response {
|
|
return &user.Response{
|
|
Code: status.Code,
|
|
Msg: msg,
|
|
}
|
|
}
|
|
|
|
func decryptMobile(mobile string) string {
|
|
if mobile == utils.StringEmpty {
|
|
return utils.StringEmpty
|
|
}
|
|
plain, err := utils.Crypto{}.AESDecryptECB(mobile)
|
|
if err != nil {
|
|
return utils.StringEmpty
|
|
}
|
|
return plain
|
|
}
|
|
|
|
func toSession(info dao.UserInfo, mobilePlain string) dao.UserLoginSession {
|
|
return dao.UserLoginSession{
|
|
Id: info.Id,
|
|
Openid: info.Openid,
|
|
Username: info.Username,
|
|
Nickname: info.Nickname,
|
|
Avatar: info.Avatar,
|
|
Mobile: mobilePlain,
|
|
Gender: info.Gender,
|
|
Birthday: info.Birthday,
|
|
Type: info.Type,
|
|
Account: info.Account,
|
|
AppId: info.AppId,
|
|
LastTime: utils.Now(),
|
|
}
|
|
}
|
|
|
|
func buildToken(session dao.UserLoginSession) dao.Token {
|
|
seed := session.Mobile + session.Openid + utils.Now().String()
|
|
token := utils.MD5Encrypt(seed)
|
|
return dao.Token{
|
|
Token: token,
|
|
Refresh: utils.MD5Encrypt(seed + token),
|
|
Info: session,
|
|
}
|
|
}
|
|
|
|
func setLogin(token, refresh string, session dao.UserLoginSession) utils.Status {
|
|
expireMin := utils.GetConfigInt("base.login_out_time")
|
|
expire := time.Duration(expireMin) * time.Minute
|
|
refreshMin := utils.GetConfigInt("base.login_refresh_out_time")
|
|
refreshExpire := time.Duration(refreshMin) * time.Minute
|
|
|
|
ctx := context.Background()
|
|
userStr, _ := jsoniter.Marshal(session)
|
|
|
|
redisKey := utils.GetLoginKey(utils.LoginTypeUser, token)
|
|
if err := redis.Client.Set(ctx, redisKey, userStr, expire).Err(); err != nil {
|
|
return utils.Fail
|
|
}
|
|
|
|
redisKeysKey := utils.GetLoginKeysKey(utils.LoginTypeUser, strconv.FormatInt(session.Id, utils.NumberTen))
|
|
var loginInfo utils.LoginRedis
|
|
if oldAuth, err := redis.Client.Get(ctx, redisKeysKey).Result(); err == nil {
|
|
_ = jsoniter.Unmarshal([]byte(oldAuth), &loginInfo)
|
|
if len(loginInfo.Token) > utils.NumberOne {
|
|
redis.Client.Del(ctx, utils.GetLoginKey(utils.LoginTypeUser, loginInfo.Token))
|
|
}
|
|
if len(loginInfo.Refresh) > utils.NumberOne {
|
|
redis.Client.Del(ctx, utils.GetLoginRefreshKey(utils.LoginTypeUser, loginInfo.Refresh))
|
|
}
|
|
}
|
|
|
|
loginInfo.Token = token
|
|
loginInfo.Refresh = refresh
|
|
loginInfo.Info = userStr
|
|
newStr, _ := jsoniter.Marshal(loginInfo)
|
|
if err := redis.Client.Set(ctx, redisKeysKey, newStr, refreshExpire).Err(); err != nil {
|
|
return utils.Fail
|
|
}
|
|
refreshKey := utils.GetLoginRefreshKey(utils.LoginTypeUser, refresh)
|
|
if err := redis.Client.Set(ctx, refreshKey, strconv.FormatInt(session.Id, utils.NumberTen), refreshExpire).Err(); err != nil {
|
|
return utils.Fail
|
|
}
|
|
return utils.Ok
|
|
}
|