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 toSession(info dao.UserRow, mobilePlain string, client *dao.Client, saleId int64) dao.UserLoginSession { return dao.UserLoginSession{ Id: info.Id, Name: info.Name, Avatar: info.Avatar, Mobile: mobilePlain, Gender: info.Gender, Birthday: info.Birthday.DateString(), Type: client.Type, ClientCode: client.Code, 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 loginCacheType(client *dao.Client) string { if client == nil { return utils.LoginTypeUser } switch client.SubjectType { case dao.SubjectTypeSale: return utils.LoginTypeSale case dao.SubjectTypeStore: return utils.LoginTypeStore case dao.SubjectTypeUser: return utils.LoginTypeUser } switch client.Type { case dao.TypeSale: return utils.LoginTypeSale case dao.TypeStore: return utils.LoginTypeStore default: return utils.LoginTypeUser } } func setLogin(jwtAuth *config.JWTAuth, accessToken, refreshToken string, session dao.UserLoginSession, client *dao.Client) utils.Status { accessExpire := time.Duration(jwtAuth.Access.TTL) * time.Second refreshExpire := time.Duration(jwtAuth.Refresh.TTL) * time.Second loginType := loginCacheType(client) ctx := context.Background() userStr, _ := jsoniter.Marshal(session) redisKey := utils.GetLoginKey(loginType, accessToken) if err := redis.Client.Set(ctx, redisKey, userStr, accessExpire).Err(); err != nil { return utils.Fail } redisKeysKey := utils.GetLoginKeysKey(loginType, 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(loginType, loginInfo.Token)) } if len(loginInfo.Refresh) > utils.NumberOne { redis.Client.Del(ctx, utils.GetLoginRefreshKey(loginType, 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(loginType, refreshToken) if err := redis.Client.Set(ctx, refreshKey, strconv.FormatInt(session.Id, utils.NumberTen), refreshExpire).Err(); err != nil { return utils.Fail } return utils.Ok }