153 lines
4.1 KiB
Go
153 lines
4.1 KiB
Go
package logic
|
|
|
|
import (
|
|
"context"
|
|
"strconv"
|
|
"time"
|
|
|
|
"lone-services/pkg/redis"
|
|
"lone-services/pkg/utils"
|
|
user "lone-services/rpc/user/pb"
|
|
"lone-services/services/user/internal/config"
|
|
"lone-services/services/user/internal/dao"
|
|
|
|
jsoniter "github.com/json-iterator/go"
|
|
)
|
|
|
|
func okResponse(data any) *user.Response {
|
|
buf, _ := jsoniter.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.DecryptPhone(mobile)
|
|
if err != nil {
|
|
return utils.StringEmpty
|
|
}
|
|
return plain
|
|
}
|
|
|
|
func subjectTypeToUserType(subjectType string) uint8 {
|
|
switch subjectType {
|
|
case dao.SubjectTypeSale:
|
|
return dao.TypeSale
|
|
case dao.SubjectTypeStore:
|
|
return dao.TypeStore
|
|
case dao.SubjectTypeUser:
|
|
return dao.TypeUser
|
|
default:
|
|
return dao.TypeUser
|
|
}
|
|
}
|
|
|
|
func toSession(info dao.UserRow, mobilePlain string, client *dao.Client, saleId int64) dao.UserLoginSession {
|
|
userType := dao.TypeUser
|
|
clientCode := utils.StringEmpty
|
|
if client != nil {
|
|
clientCode = client.Code
|
|
userType = subjectTypeToUserType(client.SubjectType)
|
|
}
|
|
return dao.UserLoginSession{
|
|
Id: info.Id,
|
|
Name: info.Name,
|
|
Avatar: info.Avatar,
|
|
Mobile: mobilePlain,
|
|
Gender: info.Gender,
|
|
Birthday: info.Birthday.DateString(),
|
|
Type: userType,
|
|
ClientCode: clientCode,
|
|
SaleId: saleId,
|
|
}
|
|
}
|
|
|
|
func sessionClaims(session dao.UserLoginSession, tokenType string) utils.Claims {
|
|
return utils.Claims{
|
|
UserID: session.Id,
|
|
Name: session.Name,
|
|
Avatar: session.Avatar,
|
|
Mobile: session.Mobile,
|
|
Gender: session.Gender,
|
|
Birthday: session.Birthday,
|
|
Type: session.Type,
|
|
ClientCode: session.ClientCode,
|
|
SaleId: session.SaleId,
|
|
StoreId: session.StoreId,
|
|
TokenType: tokenType,
|
|
}
|
|
}
|
|
|
|
func buildJwtToken(jwtAuth *config.JWTAuth, session dao.UserLoginSession) (dao.Token, error) {
|
|
accessToken, err := jwtAuth.Access.Sign(sessionClaims(session, utils.TokenTypeAccess))
|
|
if err != nil {
|
|
return dao.Token{}, err
|
|
}
|
|
refreshToken, err := jwtAuth.Refresh.Sign(sessionClaims(session, utils.TokenTypeRefresh))
|
|
if err != nil {
|
|
return dao.Token{}, err
|
|
}
|
|
return dao.Token{
|
|
AccessToken: accessToken,
|
|
RefreshToken: refreshToken,
|
|
Info: session,
|
|
}, nil
|
|
}
|
|
|
|
func setLogin(jwtAuth *config.JWTAuth, accessToken, refreshToken string, session dao.UserLoginSession) utils.Status {
|
|
accessExpire := time.Duration(jwtAuth.Access.TTL) * time.Second
|
|
refreshExpire := time.Duration(jwtAuth.Refresh.TTL) * time.Second
|
|
|
|
ctx := context.Background()
|
|
userStr, _ := jsoniter.Marshal(session)
|
|
|
|
redisKey := utils.GetLoginKey(utils.LoginTypeUser, accessToken)
|
|
if err := redis.Client.Set(ctx, redisKey, userStr, accessExpire).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 = accessToken
|
|
loginInfo.Refresh = refreshToken
|
|
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, refreshToken)
|
|
if err := redis.Client.Set(ctx, refreshKey, strconv.FormatInt(session.Id, utils.NumberTen), refreshExpire).Err(); err != nil {
|
|
return utils.Fail
|
|
}
|
|
return utils.Ok
|
|
}
|