mirror of
https://github.com/openimsdk/open-im-server.git
synced 2025-12-03 02:42:19 +08:00
fix: fix openim api err code
This commit is contained in:
parent
db1f1284f4
commit
c842343ab7
1
.github/workflows/e2e-test.yml
vendored
1
.github/workflows/e2e-test.yml
vendored
@ -105,6 +105,7 @@ jobs:
|
||||
|
||||
- name: Exec OpenIM E2E Test
|
||||
run: |
|
||||
sudo make test-e2e
|
||||
echo "" >> ./tmp/test.md
|
||||
echo "## OpenIM E2E Test" >> ./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()
|
||||
err := server.Shutdown(ctx)
|
||||
if err != nil {
|
||||
return errs.Wrap(err, "shutdown err")
|
||||
return errs.Wrap(err, "api shutdown err")
|
||||
}
|
||||
case <-netDone:
|
||||
close(netDone)
|
||||
|
||||
@ -20,19 +20,16 @@ import (
|
||||
"github.com/OpenIMSDK/protocol/constant"
|
||||
)
|
||||
|
||||
// RequiredIf validates if the specified field is required based on the session type.
|
||||
func RequiredIf(fl validator.FieldLevel) bool {
|
||||
sessionType := fl.Parent().FieldByName("SessionType").Int()
|
||||
|
||||
switch sessionType {
|
||||
case constant.SingleChatType, constant.NotificationChatType:
|
||||
if fl.FieldName() == "RecvID" {
|
||||
return fl.Field().String() != ""
|
||||
}
|
||||
return fl.FieldName() != "RecvID" || fl.Field().String() != ""
|
||||
case constant.GroupChatType, constant.SuperGroupChatType:
|
||||
if fl.FieldName() == "GroupID" {
|
||||
return fl.Field().String() != ""
|
||||
}
|
||||
return fl.FieldName() != "GroupID" || fl.Field().String() != ""
|
||||
default:
|
||||
return true
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
@ -225,6 +225,7 @@ func NewGinRouter(discov discoveryregistry.SvcDiscoveryRegistry, rdb redis.Unive
|
||||
return r
|
||||
}
|
||||
|
||||
// GinParseToken is a middleware that parses the token in the request header and verifies it.
|
||||
func GinParseToken(rdb redis.UniversalClient) gin.HandlerFunc {
|
||||
dataBase := controller.NewAuthDatabase(
|
||||
cache.NewMsgCacheModel(rdb),
|
||||
@ -232,57 +233,52 @@ func GinParseToken(rdb redis.UniversalClient) gin.HandlerFunc {
|
||||
config.Config.TokenPolicy.Expire,
|
||||
)
|
||||
return func(c *gin.Context) {
|
||||
switch c.Request.Method {
|
||||
case http.MethodPost:
|
||||
token := c.Request.Header.Get(constant.Token)
|
||||
if token == "" {
|
||||
log.ZWarn(c, "header get token error", errs.ErrArgs.Wrap("header must have token"))
|
||||
apiresp.GinError(c, errs.ErrArgs.Wrap("header must have token"))
|
||||
c.Abort()
|
||||
return
|
||||
}
|
||||
claims, err := tokenverify.GetClaimFromToken(token, authverify.Secret())
|
||||
if err != nil {
|
||||
log.ZWarn(c, "jwt get token error", errs.ErrTokenUnknown.Wrap())
|
||||
apiresp.GinError(c, errs.ErrTokenUnknown.Wrap())
|
||||
c.Abort()
|
||||
return
|
||||
}
|
||||
m, err := dataBase.GetTokensWithoutError(c, claims.UserID, claims.PlatformID)
|
||||
if err != nil {
|
||||
log.ZWarn(c, "cache get token error", errs.ErrTokenNotExist.Wrap())
|
||||
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
|
||||
}
|
||||
if v, ok := m[token]; ok {
|
||||
switch v {
|
||||
case constant.NormalToken:
|
||||
case constant.KickedToken:
|
||||
log.ZWarn(c, "cache kicked token error", errs.ErrTokenKicked.Wrap())
|
||||
apiresp.GinError(c, errs.ErrTokenKicked.Wrap())
|
||||
c.Abort()
|
||||
return
|
||||
default:
|
||||
log.ZWarn(c, "cache unknown token error", errs.ErrTokenUnknown.Wrap())
|
||||
apiresp.GinError(c, errs.ErrTokenUnknown.Wrap())
|
||||
c.Abort()
|
||||
return
|
||||
}
|
||||
} else {
|
||||
apiresp.GinError(c, errs.ErrTokenNotExist.Wrap())
|
||||
c.Abort()
|
||||
return
|
||||
}
|
||||
c.Set(constant.OpUserPlatform, constant.PlatformIDToName(claims.PlatformID))
|
||||
c.Set(constant.OpUserID, claims.UserID)
|
||||
if c.Request.Method != http.MethodPost {
|
||||
c.Next()
|
||||
return
|
||||
}
|
||||
|
||||
token := c.Request.Header.Get(constant.Token)
|
||||
if token == "" {
|
||||
handleGinError(c, "header get token error", errs.ErrArgs, "header must have token")
|
||||
return
|
||||
}
|
||||
|
||||
claims, err := tokenverify.GetClaimFromToken(token, authverify.Secret())
|
||||
if err != nil {
|
||||
handleGinError(c, "jwt get token error", errs.ErrTokenUnknown, "")
|
||||
return
|
||||
}
|
||||
|
||||
m, err := dataBase.GetTokensWithoutError(c, claims.UserID, claims.PlatformID)
|
||||
if err != nil || len(m) == 0 {
|
||||
handleGinError(c, "cache get token error", errs.ErrTokenNotExist, "")
|
||||
return
|
||||
}
|
||||
|
||||
if v, ok := m[token]; ok {
|
||||
if v == constant.KickedToken {
|
||||
handleGinError(c, "cache kicked token error", errs.ErrTokenKicked, "")
|
||||
return
|
||||
} else if v != constant.NormalToken {
|
||||
handleGinError(c, "cache unknown token error", errs.ErrTokenUnknown, "")
|
||||
return
|
||||
}
|
||||
} else {
|
||||
handleGinError(c, "token does not exist error", errs.ErrTokenNotExist, "")
|
||||
return
|
||||
}
|
||||
|
||||
c.Set(constant.OpUserPlatform, constant.PlatformIDToName(claims.PlatformID))
|
||||
c.Set(constant.OpUserID, claims.UserID)
|
||||
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)
|
||||
}
|
||||
|
||||
// GetUsersOnlineStatus Get user online status.
|
||||
// GetUsersOnlineStatus retrieves the online status of users.
|
||||
func (u *UserApi) GetUsersOnlineStatus(c *gin.Context) {
|
||||
var req msggateway.GetUsersOnlineStatusReq
|
||||
if err := c.BindJSON(&req); err != nil {
|
||||
apiresp.GinError(c, errs.ErrArgs.WithDetail(err.Error()).Wrap())
|
||||
apiresp.GinError(c, err)
|
||||
return
|
||||
}
|
||||
|
||||
conns, err := u.Discov.GetConns(c, config.Config.RpcRegisterName.OpenImMessageGatewayName)
|
||||
if err != nil {
|
||||
apiresp.GinError(c, err)
|
||||
return
|
||||
}
|
||||
|
||||
var wsResult []*msggateway.GetUsersOnlineStatusResp_SuccessResult
|
||||
var respResult []*msggateway.GetUsersOnlineStatusResp_SuccessResult
|
||||
flag := false
|
||||
|
||||
// Online push message
|
||||
for _, v := range conns {
|
||||
msgClient := msggateway.NewMsgGatewayClient(v)
|
||||
wsResult := make([]*msggateway.GetUsersOnlineStatusResp_SuccessResult, 0)
|
||||
for _, conn := range conns {
|
||||
msgClient := msggateway.NewMsgGatewayClient(conn)
|
||||
reply, err := msgClient.GetUsersOnlineStatus(c, &req)
|
||||
if err != nil {
|
||||
log.ZWarn(c, "GetUsersOnlineStatus rpc err", err)
|
||||
|
||||
parseError := apiresp.ParseError(err)
|
||||
if parseError.ErrCode == errs.NoPermissionError {
|
||||
apiresp.GinError(c, err)
|
||||
log.ZInfo(c, "GetUsersOnlineStatus rpc error", err)
|
||||
if apiresp.ParseError(err).ErrCode == errs.NoPermissionError {
|
||||
apiresp.GinError(c, errs.Wrap(err))
|
||||
return
|
||||
}
|
||||
} else {
|
||||
wsResult = append(wsResult, reply.SuccessResult...)
|
||||
continue
|
||||
}
|
||||
wsResult = append(wsResult, reply.SuccessResult...)
|
||||
}
|
||||
// Traversing the userIDs in the api request body
|
||||
for _, v1 := range req.UserIDs {
|
||||
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
|
||||
|
||||
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
|
||||
}
|
||||
for _, result := range wsResult {
|
||||
if result.UserID == userID {
|
||||
res.Status = constant.OnlineStatus
|
||||
res.DetailPlatformStatus = append(res.DetailPlatformStatus, v2.DetailPlatformStatus...)
|
||||
res.DetailPlatformStatus = append(res.DetailPlatformStatus, result.DetailPlatformStatus...)
|
||||
break
|
||||
}
|
||||
}
|
||||
if !flag {
|
||||
res.UserID = v1
|
||||
res.Status = constant.OfflineStatus
|
||||
}
|
||||
respResult = append(respResult, res)
|
||||
}
|
||||
apiresp.GinSuccess(c, respResult)
|
||||
return respResult
|
||||
}
|
||||
|
||||
func (u *UserApi) UserRegisterCount(c *gin.Context) {
|
||||
|
||||
@ -142,6 +142,7 @@ func (r *RootCmd) getPortFlag(cmd *cobra.Command) int {
|
||||
return port
|
||||
}
|
||||
|
||||
// GetPortFlag returns the port flag
|
||||
func (r *RootCmd) GetPortFlag() int {
|
||||
return r.port
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user