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
|
- 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:
|
|
||||||
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)
|
|
||||||
c.Next()
|
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)
|
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...)
|
||||||
}
|
}
|
||||||
// Traversing the userIDs in the api request body
|
|
||||||
for _, v1 := range req.UserIDs {
|
respResult := compileResults(req.UserIDs, wsResult)
|
||||||
flag = false
|
apiresp.GinSuccess(c, respResult)
|
||||||
res := new(msggateway.GetUsersOnlineStatusResp_SuccessResult)
|
}
|
||||||
// Iterate through the online results fetched from various gateways
|
|
||||||
for _, v2 := range wsResult {
|
// compileResults aggregates online status results for the provided userIDs.
|
||||||
// If matches the above description on the line, and vice versa
|
func compileResults(userIDs []string, wsResult []*msggateway.GetUsersOnlineStatusResp_SuccessResult) []*msggateway.GetUsersOnlineStatusResp_SuccessResult {
|
||||||
if v2.UserID == v1 {
|
respResult := make([]*msggateway.GetUsersOnlineStatusResp_SuccessResult, 0, len(userIDs))
|
||||||
flag = true
|
for _, userID := range userIDs {
|
||||||
res.UserID = v1
|
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.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…
x
Reference in New Issue
Block a user