fix: fix openim api err code

pull/1906/head
Xinwei Xiong (cubxxw) 2 years ago
parent db1f1284f4
commit c842343ab7

@ -105,6 +105,7 @@ jobs:
- name: Exec OpenIM E2E Test - name: Exec OpenIM E2E Test
run: | run: |
sudo make test-e2e
echo "" >> ./tmp/test.md echo "" >> ./tmp/test.md
echo "## OpenIM E2E Test" >> ./tmp/test.md echo "## OpenIM E2E Test" >> ./tmp/test.md
echo "<details><summary>Command Output for OpenIM E2E Test</summary>" >> ./tmp/test.md echo "<details><summary>Command Output for OpenIM E2E Test</summary>" >> ./tmp/test.md

@ -122,7 +122,7 @@ func run(port int, proPort int) error {
util.SIGTERMExit() util.SIGTERMExit()
err := server.Shutdown(ctx) err := server.Shutdown(ctx)
if err != nil { if err != nil {
return errs.Wrap(err, "shutdown err") return errs.Wrap(err, "api shutdown err")
} }
case <-netDone: case <-netDone:
close(netDone) close(netDone)

@ -20,19 +20,16 @@ import (
"github.com/OpenIMSDK/protocol/constant" "github.com/OpenIMSDK/protocol/constant"
) )
// RequiredIf validates if the specified field is required based on the session type.
func RequiredIf(fl validator.FieldLevel) bool { func RequiredIf(fl validator.FieldLevel) bool {
sessionType := fl.Parent().FieldByName("SessionType").Int() sessionType := fl.Parent().FieldByName("SessionType").Int()
switch sessionType { switch sessionType {
case constant.SingleChatType, constant.NotificationChatType: case constant.SingleChatType, constant.NotificationChatType:
if fl.FieldName() == "RecvID" { return fl.FieldName() != "RecvID" || fl.Field().String() != ""
return fl.Field().String() != ""
}
case constant.GroupChatType, constant.SuperGroupChatType: case constant.GroupChatType, constant.SuperGroupChatType:
if fl.FieldName() == "GroupID" { return fl.FieldName() != "GroupID" || fl.Field().String() != ""
return fl.Field().String() != ""
}
default: default:
return true return true
} }
return true
} }

@ -225,6 +225,7 @@ func NewGinRouter(discov discoveryregistry.SvcDiscoveryRegistry, rdb redis.Unive
return r return r
} }
// GinParseToken is a middleware that parses the token in the request header and verifies it.
func GinParseToken(rdb redis.UniversalClient) gin.HandlerFunc { func GinParseToken(rdb redis.UniversalClient) gin.HandlerFunc {
dataBase := controller.NewAuthDatabase( dataBase := controller.NewAuthDatabase(
cache.NewMsgCacheModel(rdb), cache.NewMsgCacheModel(rdb),
@ -232,57 +233,52 @@ func GinParseToken(rdb redis.UniversalClient) gin.HandlerFunc {
config.Config.TokenPolicy.Expire, config.Config.TokenPolicy.Expire,
) )
return func(c *gin.Context) { return func(c *gin.Context) {
switch c.Request.Method { if c.Request.Method != http.MethodPost {
case http.MethodPost: c.Next()
return
}
token := c.Request.Header.Get(constant.Token) token := c.Request.Header.Get(constant.Token)
if token == "" { if token == "" {
log.ZWarn(c, "header get token error", errs.ErrArgs.Wrap("header must have token")) handleGinError(c, "header get token error", errs.ErrArgs, "header must have token")
apiresp.GinError(c, errs.ErrArgs.Wrap("header must have token"))
c.Abort()
return return
} }
claims, err := tokenverify.GetClaimFromToken(token, authverify.Secret()) claims, err := tokenverify.GetClaimFromToken(token, authverify.Secret())
if err != nil { if err != nil {
log.ZWarn(c, "jwt get token error", errs.ErrTokenUnknown.Wrap()) handleGinError(c, "jwt get token error", errs.ErrTokenUnknown, "")
apiresp.GinError(c, errs.ErrTokenUnknown.Wrap())
c.Abort()
return return
} }
m, err := dataBase.GetTokensWithoutError(c, claims.UserID, claims.PlatformID) m, err := dataBase.GetTokensWithoutError(c, claims.UserID, claims.PlatformID)
if err != nil { if err != nil || len(m) == 0 {
log.ZWarn(c, "cache get token error", errs.ErrTokenNotExist.Wrap()) handleGinError(c, "cache get token error", errs.ErrTokenNotExist, "")
apiresp.GinError(c, errs.ErrTokenNotExist.Wrap())
c.Abort()
return
}
if len(m) == 0 {
log.ZWarn(c, "cache do not exist token error", errs.ErrTokenNotExist.Wrap())
apiresp.GinError(c, errs.ErrTokenNotExist.Wrap())
c.Abort()
return return
} }
if v, ok := m[token]; ok { if v, ok := m[token]; ok {
switch v { if v == constant.KickedToken {
case constant.NormalToken: handleGinError(c, "cache kicked token error", errs.ErrTokenKicked, "")
case constant.KickedToken:
log.ZWarn(c, "cache kicked token error", errs.ErrTokenKicked.Wrap())
apiresp.GinError(c, errs.ErrTokenKicked.Wrap())
c.Abort()
return return
default: } else if v != constant.NormalToken {
log.ZWarn(c, "cache unknown token error", errs.ErrTokenUnknown.Wrap()) handleGinError(c, "cache unknown token error", errs.ErrTokenUnknown, "")
apiresp.GinError(c, errs.ErrTokenUnknown.Wrap())
c.Abort()
return return
} }
} else { } else {
apiresp.GinError(c, errs.ErrTokenNotExist.Wrap()) handleGinError(c, "token does not exist error", errs.ErrTokenNotExist, "")
c.Abort()
return return
} }
c.Set(constant.OpUserPlatform, constant.PlatformIDToName(claims.PlatformID)) c.Set(constant.OpUserPlatform, constant.PlatformIDToName(claims.PlatformID))
c.Set(constant.OpUserID, claims.UserID) c.Set(constant.OpUserID, claims.UserID)
c.Next() c.Next()
} }
} }
// handleGinError logs and returns an error response through Gin context.
func handleGinError(c *gin.Context, logMessage string, errType errs.CodeError, detail string) {
wrappedErr := errType.Wrap(detail)
log.ZInfo(c, logMessage, wrappedErr)
apiresp.GinError(c, wrappedErr)
c.Abort()
} }

@ -64,61 +64,57 @@ func (u *UserApi) GetUsers(c *gin.Context) {
a2r.Call(user.UserClient.GetPaginationUsers, u.Client, c) a2r.Call(user.UserClient.GetPaginationUsers, u.Client, c)
} }
// GetUsersOnlineStatus Get user online status. // GetUsersOnlineStatus retrieves the online status of users.
func (u *UserApi) GetUsersOnlineStatus(c *gin.Context) { func (u *UserApi) GetUsersOnlineStatus(c *gin.Context) {
var req msggateway.GetUsersOnlineStatusReq var req msggateway.GetUsersOnlineStatusReq
if err := c.BindJSON(&req); err != nil { if err := c.BindJSON(&req); err != nil {
apiresp.GinError(c, errs.ErrArgs.WithDetail(err.Error()).Wrap()) apiresp.GinError(c, err)
return return
} }
conns, err := u.Discov.GetConns(c, config.Config.RpcRegisterName.OpenImMessageGatewayName) conns, err := u.Discov.GetConns(c, config.Config.RpcRegisterName.OpenImMessageGatewayName)
if err != nil { if err != nil {
apiresp.GinError(c, err) apiresp.GinError(c, err)
return return
} }
var wsResult []*msggateway.GetUsersOnlineStatusResp_SuccessResult wsResult := make([]*msggateway.GetUsersOnlineStatusResp_SuccessResult, 0)
var respResult []*msggateway.GetUsersOnlineStatusResp_SuccessResult for _, conn := range conns {
flag := false msgClient := msggateway.NewMsgGatewayClient(conn)
// Online push message
for _, v := range conns {
msgClient := msggateway.NewMsgGatewayClient(v)
reply, err := msgClient.GetUsersOnlineStatus(c, &req) reply, err := msgClient.GetUsersOnlineStatus(c, &req)
if err != nil { if err != nil {
log.ZWarn(c, "GetUsersOnlineStatus rpc err", err) log.ZInfo(c, "GetUsersOnlineStatus rpc error", err)
if apiresp.ParseError(err).ErrCode == errs.NoPermissionError {
parseError := apiresp.ParseError(err) apiresp.GinError(c, errs.Wrap(err))
if parseError.ErrCode == errs.NoPermissionError {
apiresp.GinError(c, err)
return return
} }
} else { continue
}
wsResult = append(wsResult, reply.SuccessResult...) wsResult = append(wsResult, reply.SuccessResult...)
} }
respResult := compileResults(req.UserIDs, wsResult)
apiresp.GinSuccess(c, respResult)
}
// compileResults aggregates online status results for the provided userIDs.
func compileResults(userIDs []string, wsResult []*msggateway.GetUsersOnlineStatusResp_SuccessResult) []*msggateway.GetUsersOnlineStatusResp_SuccessResult {
respResult := make([]*msggateway.GetUsersOnlineStatusResp_SuccessResult, 0, len(userIDs))
for _, userID := range userIDs {
res := &msggateway.GetUsersOnlineStatusResp_SuccessResult{
UserID: userID,
Status: constant.OfflineStatus, // Default to offline
} }
// Traversing the userIDs in the api request body for _, result := range wsResult {
for _, v1 := range req.UserIDs { if result.UserID == userID {
flag = false
res := new(msggateway.GetUsersOnlineStatusResp_SuccessResult)
// Iterate through the online results fetched from various gateways
for _, v2 := range wsResult {
// If matches the above description on the line, and vice versa
if v2.UserID == v1 {
flag = true
res.UserID = v1
res.Status = constant.OnlineStatus res.Status = constant.OnlineStatus
res.DetailPlatformStatus = append(res.DetailPlatformStatus, v2.DetailPlatformStatus...) res.DetailPlatformStatus = append(res.DetailPlatformStatus, result.DetailPlatformStatus...)
break break
} }
} }
if !flag {
res.UserID = v1
res.Status = constant.OfflineStatus
}
respResult = append(respResult, res) respResult = append(respResult, res)
} }
apiresp.GinSuccess(c, respResult) return respResult
} }
func (u *UserApi) UserRegisterCount(c *gin.Context) { func (u *UserApi) UserRegisterCount(c *gin.Context) {

@ -142,6 +142,7 @@ func (r *RootCmd) getPortFlag(cmd *cobra.Command) int {
return port return port
} }
// GetPortFlag returns the port flag
func (r *RootCmd) GetPortFlag() int { func (r *RootCmd) GetPortFlag() int {
return r.port return r.port
} }

Loading…
Cancel
Save