From 69b171e08b2e75ae6c2ac31eb9a9099afe7c3a7d Mon Sep 17 00:00:00 2001 From: "Xinwei Xiong (cubxxw)" <3293172751nss@gmail.com> Date: Fri, 22 Mar 2024 17:50:15 +0800 Subject: [PATCH 1/5] feat: add http client --- .golangci.yml | 1 + pkg/common/http/http_client.go | 1 + 2 files changed, 2 insertions(+) diff --git a/.golangci.yml b/.golangci.yml index ea839cc57..f272d4229 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -172,6 +172,7 @@ linters-settings: - ^init$ - ^os.Exit$ - ^fmt.Print.*$ + - errors.New.*$ - ^fmt.Println.*$ - ^panic$ - painc diff --git a/pkg/common/http/http_client.go b/pkg/common/http/http_client.go index cd4dcce0c..5afe3447f 100644 --- a/pkg/common/http/http_client.go +++ b/pkg/common/http/http_client.go @@ -18,6 +18,7 @@ import ( "bytes" "context" "encoding/json" + "errors" "io" "net/http" "time" From 37e773deeb49496c58746c28387b942a40795186 Mon Sep 17 00:00:00 2001 From: "Xinwei Xiong (cubxxw)" <3293172751nss@gmail.com> Date: Mon, 25 Mar 2024 10:50:20 +0800 Subject: [PATCH 2/5] feat: fix http client to tools --- pkg/common/http/http_client.go | 1 - 1 file changed, 1 deletion(-) diff --git a/pkg/common/http/http_client.go b/pkg/common/http/http_client.go index 5afe3447f..cd4dcce0c 100644 --- a/pkg/common/http/http_client.go +++ b/pkg/common/http/http_client.go @@ -18,7 +18,6 @@ import ( "bytes" "context" "encoding/json" - "errors" "io" "net/http" "time" From 05c8d3dac3ac9ac64449cee63d51dd7473cb4ea9 Mon Sep 17 00:00:00 2001 From: Gordon <46924906+FGadvancer@users.noreply.github.com> Date: Mon, 25 Mar 2024 14:43:38 +0800 Subject: [PATCH 3/5] fix: errs handle. --- go.mod | 2 +- go.sum | 2 ++ pkg/common/startrpc/start.go | 3 +-- tools/url2im/pkg/manage.go | 6 +++--- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index a282f6fa7..fab33e8d6 100644 --- a/go.mod +++ b/go.mod @@ -16,7 +16,7 @@ require ( github.com/mitchellh/mapstructure v1.5.0 github.com/openimsdk/localcache v0.0.1 github.com/openimsdk/protocol v0.0.58-google - github.com/openimsdk/tools v0.0.46-alpha.16 + github.com/openimsdk/tools v0.0.46-alpha.16.0.20240322040503-5ee151e04e7d github.com/pkg/errors v0.9.1 // indirect github.com/prometheus/client_golang v1.18.0 github.com/sirupsen/logrus v1.9.3 // indirect diff --git a/go.sum b/go.sum index 57ea6df3c..0ffb0f630 100644 --- a/go.sum +++ b/go.sum @@ -272,6 +272,8 @@ github.com/openimsdk/protocol v0.0.58-google h1:cGNUVaXO9LqcFgIb4NvrtEOrv0spGeco github.com/openimsdk/protocol v0.0.58-google/go.mod h1:OZQA9FR55lseYoN2Ql1XAHYKHJGu7OMNkUbuekrKCM8= github.com/openimsdk/tools v0.0.46-alpha.16 h1:4ouPoTrCuyREF1UPBaka+Oge4x0XsICfNMoGxJuziKU= github.com/openimsdk/tools v0.0.46-alpha.16/go.mod h1:hMH6pHDVhOXjA8NQ25P7mOtfRXb5lsPAv/uUDR8342Y= +github.com/openimsdk/tools v0.0.46-alpha.16.0.20240322040503-5ee151e04e7d h1:XqhSyp3iHMSzUVRFWpoentayDfteybGHW7wT8WuvVEg= +github.com/openimsdk/tools v0.0.46-alpha.16.0.20240322040503-5ee151e04e7d/go.mod h1:Czxh+12vxUMypTIDZBHcTHwYL6o+DGMrC1ZmHqAk/tc= github.com/pelletier/go-buffruneio v0.2.0/go.mod h1:JkE26KsDizTr40EUHkXVtNPvgGtbSNq5BcowyYOWdKo= github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ= github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4= diff --git a/pkg/common/startrpc/start.go b/pkg/common/startrpc/start.go index b1ee2d2ed..6f26f583d 100644 --- a/pkg/common/startrpc/start.go +++ b/pkg/common/startrpc/start.go @@ -16,7 +16,6 @@ package startrpc import ( "context" - "errors" "fmt" "net" "net/http" @@ -161,7 +160,7 @@ func gracefulStopWithCtx(ctx context.Context, f func()) error { }() select { case <-ctx.Done(): - return errs.Wrap(errors.New("timeout, ctx graceful stop")) + return errs.New("timeout, ctx graceful stop") case <-done: return nil } diff --git a/tools/url2im/pkg/manage.go b/tools/url2im/pkg/manage.go index a3c32c368..5b3c555c6 100644 --- a/tools/url2im/pkg/manage.go +++ b/tools/url2im/pkg/manage.go @@ -20,8 +20,8 @@ import ( "crypto/md5" "encoding/hex" "encoding/json" - "errors" "fmt" + "github.com/openimsdk/tools/errs" "io" "log" "net/http" @@ -256,10 +256,10 @@ func (m *Manage) RunTask(ctx context.Context, task Task) (string, error) { func (m *Manage) partSize(size int64) (int64, error) { if size <= 0 { - return 0, errors.New("size must be greater than 0") + return 0, errs.New("size must be greater than 0") } if size > m.partLimit.MaxPartSize*int64(m.partLimit.MaxNumSize) { - return 0, fmt.Errorf("size must be less than %db", m.partLimit.MaxPartSize*int64(m.partLimit.MaxNumSize)) + return 0, errs.New("size must be less than", "size", m.partLimit.MaxPartSize*int64(m.partLimit.MaxNumSize)) } if size <= m.partLimit.MinPartSize*int64(m.partLimit.MaxNumSize) { return m.partLimit.MinPartSize, nil From 0bd7269f1e20691bf1ecbbbacd72179e3d7ed367 Mon Sep 17 00:00:00 2001 From: Gordon <46924906+FGadvancer@users.noreply.github.com> Date: Mon, 25 Mar 2024 21:17:35 +0800 Subject: [PATCH 4/5] fix: message gateway update. --- go.mod | 2 +- internal/msggateway/client.go | 4 ++-- internal/msggateway/context.go | 8 +++++--- internal/msggateway/hub_server.go | 4 ++-- internal/msggateway/message_handler.go | 10 +++++----- internal/msggateway/n_ws_server.go | 12 ++++++------ internal/msggateway/user_map.go | 4 ++-- 7 files changed, 23 insertions(+), 21 deletions(-) diff --git a/go.mod b/go.mod index fab33e8d6..59a9b291e 100644 --- a/go.mod +++ b/go.mod @@ -16,7 +16,7 @@ require ( github.com/mitchellh/mapstructure v1.5.0 github.com/openimsdk/localcache v0.0.1 github.com/openimsdk/protocol v0.0.58-google - github.com/openimsdk/tools v0.0.46-alpha.16.0.20240322040503-5ee151e04e7d + github.com/openimsdk/tools v0.0.46 github.com/pkg/errors v0.9.1 // indirect github.com/prometheus/client_golang v1.18.0 github.com/sirupsen/logrus v1.9.3 // indirect diff --git a/internal/msggateway/client.go b/internal/msggateway/client.go index 7a6d6832f..babf9567a 100644 --- a/internal/msggateway/client.go +++ b/internal/msggateway/client.go @@ -18,6 +18,7 @@ import ( "context" "errors" "fmt" + "github.com/openimsdk/tools/utils/stringutil" "runtime/debug" "sync" "sync/atomic" @@ -29,7 +30,6 @@ import ( "github.com/openimsdk/tools/errs" "github.com/openimsdk/tools/log" "github.com/openimsdk/tools/mcontext" - "github.com/openimsdk/tools/utils" "google.golang.org/protobuf/proto" ) @@ -91,7 +91,7 @@ type Client struct { func (c *Client) ResetClient(ctx *UserConnContext, conn LongConn, isBackground, isCompress bool, longConnServer LongConnServer, token string) { c.w = new(sync.Mutex) c.conn = conn - c.PlatformID = utils.StringToInt(ctx.GetPlatformID()) + c.PlatformID = stringutil.StringToInt(ctx.GetPlatformID()) c.IsCompress = isCompress c.IsBackground = isBackground c.UserID = ctx.GetUserID() diff --git a/internal/msggateway/context.go b/internal/msggateway/context.go index 9c12ee1f7..7139f9e9c 100644 --- a/internal/msggateway/context.go +++ b/internal/msggateway/context.go @@ -15,13 +15,15 @@ package msggateway import ( + "github.com/openimsdk/tools/utils/encrypt" + "github.com/openimsdk/tools/utils/stringutil" + "github.com/openimsdk/tools/utils/timeutil" "net/http" "net/url" "strconv" "time" "github.com/openimsdk/protocol/constant" - "github.com/openimsdk/tools/utils" ) type UserConnContext struct { @@ -54,7 +56,7 @@ func (c *UserConnContext) Value(key any) any { case constant.ConnID: return c.GetConnID() case constant.OpUserPlatform: - return constant.PlatformIDToName(utils.StringToInt(c.GetPlatformID())) + return constant.PlatformIDToName(stringutil.StringToInt(c.GetPlatformID())) case constant.RemoteAddr: return c.RemoteAddr default: @@ -69,7 +71,7 @@ func newContext(respWriter http.ResponseWriter, req *http.Request) *UserConnCont Path: req.URL.Path, Method: req.Method, RemoteAddr: req.RemoteAddr, - ConnID: utils.Md5(req.RemoteAddr + "_" + strconv.Itoa(int(utils.GetCurrentTimestampByMill()))), + ConnID: encrypt.Md5(req.RemoteAddr + "_" + strconv.Itoa(int(timeutil.GetCurrentTimestampByMill()))), } } diff --git a/internal/msggateway/hub_server.go b/internal/msggateway/hub_server.go index e29fbfc93..92f4bcec4 100644 --- a/internal/msggateway/hub_server.go +++ b/internal/msggateway/hub_server.go @@ -23,14 +23,14 @@ import ( "github.com/openimsdk/open-im-server/v3/pkg/common/startrpc" "github.com/openimsdk/protocol/constant" "github.com/openimsdk/protocol/msggateway" - "github.com/openimsdk/tools/discoveryregistry" + "github.com/openimsdk/tools/discovery" "github.com/openimsdk/tools/errs" "github.com/openimsdk/tools/log" "github.com/openimsdk/tools/mcontext" "google.golang.org/grpc" ) -func (s *Server) InitServer(ctx context.Context, config *config.GlobalConfig, disCov discoveryregistry.SvcDiscoveryRegistry, server *grpc.Server) error { +func (s *Server) InitServer(ctx context.Context, config *config.GlobalConfig, disCov discovery.SvcDiscoveryRegistry, server *grpc.Server) error { rdb, err := cache.NewRedis(ctx, &config.Redis) if err != nil { return err diff --git a/internal/msggateway/message_handler.go b/internal/msggateway/message_handler.go index d527f2697..0b7df65ba 100644 --- a/internal/msggateway/message_handler.go +++ b/internal/msggateway/message_handler.go @@ -16,6 +16,8 @@ package msggateway import ( "context" + "github.com/openimsdk/tools/discovery" + "github.com/openimsdk/tools/utils/goassist" "sync" "github.com/go-playground/validator/v10" @@ -24,9 +26,7 @@ import ( "github.com/openimsdk/protocol/msg" "github.com/openimsdk/protocol/push" "github.com/openimsdk/protocol/sdkws" - "github.com/openimsdk/tools/discoveryregistry" "github.com/openimsdk/tools/errs" - "github.com/openimsdk/tools/utils" "google.golang.org/protobuf/proto" ) @@ -46,7 +46,7 @@ func (r *Req) String() string { tReq.SendID = r.SendID tReq.OperationID = r.OperationID tReq.MsgIncr = r.MsgIncr - return utils.StructToJsonString(tReq) + return goassist.StructToJsonString(tReq) } var reqPool = sync.Pool{ @@ -86,7 +86,7 @@ func (r *Resp) String() string { tResp.OperationID = r.OperationID tResp.ErrCode = r.ErrCode tResp.ErrMsg = r.ErrMsg - return utils.StructToJsonString(tResp) + return goassist.StructToJsonString(tResp) } type MessageHandler interface { @@ -106,7 +106,7 @@ type GrpcHandler struct { validate *validator.Validate } -func NewGrpcHandler(validate *validator.Validate, client discoveryregistry.SvcDiscoveryRegistry, rpcRegisterName *config.RpcRegisterName) *GrpcHandler { +func NewGrpcHandler(validate *validator.Validate, client discovery.SvcDiscoveryRegistry, rpcRegisterName *config.RpcRegisterName) *GrpcHandler { msgRpcClient := rpcclient.NewMessageRpcClient(client, rpcRegisterName.OpenImMsgName) pushRpcClient := rpcclient.NewPushRpcClient(client, rpcRegisterName.OpenImPushName) return &GrpcHandler{ diff --git a/internal/msggateway/n_ws_server.go b/internal/msggateway/n_ws_server.go index cdc75c1e4..770dc4c1f 100644 --- a/internal/msggateway/n_ws_server.go +++ b/internal/msggateway/n_ws_server.go @@ -19,6 +19,8 @@ import ( "encoding/json" "errors" "fmt" + "github.com/openimsdk/tools/discovery" + "github.com/openimsdk/tools/utils/stringutil" "net/http" "strconv" "sync" @@ -34,10 +36,8 @@ import ( "github.com/openimsdk/protocol/constant" "github.com/openimsdk/protocol/msggateway" "github.com/openimsdk/tools/apiresp" - "github.com/openimsdk/tools/discoveryregistry" "github.com/openimsdk/tools/errs" "github.com/openimsdk/tools/log" - "github.com/openimsdk/tools/utils" "github.com/redis/go-redis/v9" "golang.org/x/sync/errgroup" ) @@ -49,7 +49,7 @@ type LongConnServer interface { GetUserPlatformCons(userID string, platform int) ([]*Client, bool, bool) Validate(s any) error SetCacheHandler(cache cache.TokenModel) - SetDiscoveryRegistry(client discoveryregistry.SvcDiscoveryRegistry, config *config.GlobalConfig) + SetDiscoveryRegistry(client discovery.SvcDiscoveryRegistry, config *config.GlobalConfig) KickUserConn(client *Client) error UnRegister(c *Client) SetKickHandlerInfo(i *kickHandler) @@ -81,7 +81,7 @@ type WsServer struct { validate *validator.Validate cache cache.TokenModel userClient *rpcclient.UserRpcClient - disCov discoveryregistry.SvcDiscoveryRegistry + disCov discovery.SvcDiscoveryRegistry Compressor Encoder MessageHandler @@ -93,7 +93,7 @@ type kickHandler struct { newClient *Client } -func (ws *WsServer) SetDiscoveryRegistry(disCov discoveryregistry.SvcDiscoveryRegistry, config *config.GlobalConfig) { +func (ws *WsServer) SetDiscoveryRegistry(disCov discovery.SvcDiscoveryRegistry, config *config.GlobalConfig) { ws.MessageHandler = NewGrpcHandler(ws.validate, disCov, &config.RpcRegisterName) u := rpcclient.NewUserRpcClient(disCov, config.RpcRegisterName.OpenImUserName, &config.Manager, &config.IMAdmin) ws.userClient = &u @@ -176,7 +176,7 @@ func (ws *WsServer) Run(done chan error) error { shutdownDone = make(chan struct{}, 1) ) - server := http.Server{Addr: ":" + utils.IntToString(ws.port), Handler: nil} + server := http.Server{Addr: ":" + stringutil.IntToString(ws.port), Handler: nil} go func() { for { diff --git a/internal/msggateway/user_map.go b/internal/msggateway/user_map.go index 91a29a5bd..66e566745 100644 --- a/internal/msggateway/user_map.go +++ b/internal/msggateway/user_map.go @@ -16,10 +16,10 @@ package msggateway import ( "context" + "github.com/openimsdk/tools/utils/goassist" "sync" "github.com/openimsdk/tools/log" - "github.com/openimsdk/tools/utils" ) type UserMap struct { @@ -93,7 +93,7 @@ func (u *UserMap) delete(key string, connRemoteAddr string) (isDeleteUser bool) } func (u *UserMap) deleteClients(key string, clients []*Client) (isDeleteUser bool) { - m := utils.SliceToMapAny(clients, func(c *Client) (string, struct{}) { + m := goassist.SliceToMapAny(clients, func(c *Client) (string, struct{}) { return c.ctx.GetRemoteAddr(), struct{}{} }) allClients, existed := u.m.Load(key) From 3165317634db178af3864dae34afd16a2f082aed Mon Sep 17 00:00:00 2001 From: Gordon <46924906+FGadvancer@users.noreply.github.com> Date: Tue, 26 Mar 2024 14:43:51 +0800 Subject: [PATCH 5/5] fix: err handle. --- internal/rpc/msg/as_read.go | 14 ++--- pkg/common/servererrs/code.go | 88 ++++++++++++++++++++++++++++++ pkg/common/servererrs/predefine.go | 62 +++++++++++++++++++++ pkg/common/servererrs/relation.go | 58 ++++++++++++++++++++ 4 files changed, 215 insertions(+), 7 deletions(-) create mode 100644 pkg/common/servererrs/code.go create mode 100644 pkg/common/servererrs/predefine.go create mode 100644 pkg/common/servererrs/relation.go diff --git a/internal/rpc/msg/as_read.go b/internal/rpc/msg/as_read.go index 3eb182a6a..33f26558c 100644 --- a/internal/rpc/msg/as_read.go +++ b/internal/rpc/msg/as_read.go @@ -16,6 +16,7 @@ package msg import ( "context" + "github.com/openimsdk/tools/utils/goassist" cbapi "github.com/openimsdk/open-im-server/v3/pkg/callbackstruct" "github.com/openimsdk/protocol/constant" @@ -23,7 +24,6 @@ import ( "github.com/openimsdk/protocol/sdkws" "github.com/openimsdk/tools/errs" "github.com/openimsdk/tools/log" - utils2 "github.com/openimsdk/tools/utils" "github.com/redis/go-redis/v9" ) @@ -59,13 +59,13 @@ func (m *msgServer) GetConversationsHasReadAndMaxSeq(ctx context.Context, req *m return nil, err } resp = &msg.GetConversationsHasReadAndMaxSeqResp{Seqs: make(map[string]*msg.Seqs)} - for conversarionID, maxSeq := range maxSeqs { - resp.Seqs[conversarionID] = &msg.Seqs{ - HasReadSeq: hasReadSeqs[conversarionID], + for conversationID, maxSeq := range maxSeqs { + resp.Seqs[conversationID] = &msg.Seqs{ + HasReadSeq: hasReadSeqs[conversationID], MaxSeq: maxSeq, } - if v, ok := conversationMaxSeqMap[conversarionID]; ok { - resp.Seqs[conversarionID].MaxSeq = v + if v, ok := conversationMaxSeqMap[conversationID]; ok { + resp.Seqs[conversationID].MaxSeq = v } } return resp, nil @@ -157,7 +157,7 @@ func (m *msgServer) MarkConversationAsRead(ctx context.Context, req *msg.MarkCon } // avoid client missed call MarkConversationMessageAsRead by order for _, val := range req.Seqs { - if !utils2.Contain(val, seqs...) { + if !goassist.Contain(val, seqs...) { seqs = append(seqs, val) } } diff --git a/pkg/common/servererrs/code.go b/pkg/common/servererrs/code.go new file mode 100644 index 000000000..444e19707 --- /dev/null +++ b/pkg/common/servererrs/code.go @@ -0,0 +1,88 @@ +// Copyright © 2023 OpenIM. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package servererrs + +// UnknownCode represents the error code when code is not parsed or parsed code equals 0. +const UnknownCode = 1000 + +// Error codes for various error scenarios. +const ( + FormattingError = 10001 // Error in formatting + HasRegistered = 10002 // User has already registered + NotRegistered = 10003 // User is not registered + PasswordErr = 10004 // Password error + GetIMTokenErr = 10005 // Error in getting IM token + RepeatSendCode = 10006 // Repeat sending code + MailSendCodeErr = 10007 // Error in sending code via email + SmsSendCodeErr = 10008 // Error in sending code via SMS + CodeInvalidOrExpired = 10009 // Code is invalid or expired + RegisterFailed = 10010 // Registration failed + ResetPasswordFailed = 10011 // Resetting password failed + RegisterLimit = 10012 // Registration limit exceeded + LoginLimit = 10013 // Login limit exceeded + InvitationError = 10014 // Error in invitation +) + +// General error codes. +const ( + NoError = 0 // No error + DatabaseError = 90002 // Database error (redis/mysql, etc.) + NetworkError = 90004 // Network error + DataError = 90007 // Data error + + CallbackError = 80000 + + // Account error codes. + UserIDNotFoundError = 1101 // UserID does not exist or is not registered + RegisteredAlreadyError = 1102 // User is already registered + + // Group error codes. + GroupIDNotFoundError = 1201 // GroupID does not exist + GroupIDExisted = 1202 // GroupID already exists + NotInGroupYetError = 1203 // Not in the group yet + DismissedAlreadyError = 1204 // Group has already been dismissed + GroupTypeNotSupport = 1205 + GroupRequestHandled = 1206 + + // Relationship error codes. + CanNotAddYourselfError = 1301 // Cannot add yourself as a friend + BlockedByPeer = 1302 // Blocked by the peer + NotPeersFriend = 1303 // Not the peer's friend + RelationshipAlreadyError = 1304 // Already in a friend relationship + + // Message error codes. + MessageHasReadDisable = 1401 + MutedInGroup = 1402 // Member muted in the group + MutedGroup = 1403 // Group is muted + MsgAlreadyRevoke = 1404 // Message already revoked + + // Token error codes. + TokenExpiredError = 1501 + TokenInvalidError = 1502 + TokenMalformedError = 1503 + TokenNotValidYetError = 1504 + TokenUnknownError = 1505 + TokenKickedError = 1506 + TokenNotExistError = 1507 + + // Long connection gateway error codes. + ConnOverMaxNumLimit = 1601 + ConnArgsErr = 1602 + PushMsgErr = 1603 + IOSBackgroundPushErr = 1604 + + // S3 error codes. + FileUploadedExpiredError = 1701 // Upload expired +) diff --git a/pkg/common/servererrs/predefine.go b/pkg/common/servererrs/predefine.go new file mode 100644 index 000000000..9eb1a5b8a --- /dev/null +++ b/pkg/common/servererrs/predefine.go @@ -0,0 +1,62 @@ +// Copyright © 2023 OpenIM. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package servererrs + +import "github.com/openimsdk/tools/errs" + +var ( + ErrDatabase = errs.NewCodeError(DatabaseError, "DatabaseError") + ErrNetwork = errs.NewCodeError(NetworkError, "NetworkError") + ErrCallback = errs.NewCodeError(CallbackError, "CallbackError") + ErrCallbackContinue = errs.NewCodeError(CallbackError, "ErrCallbackContinue") + + ErrUserIDNotFound = errs.NewCodeError(UserIDNotFoundError, "UserIDNotFoundError") + ErrGroupIDNotFound = errs.NewCodeError(GroupIDNotFoundError, "GroupIDNotFoundError") + ErrGroupIDExisted = errs.NewCodeError(GroupIDExisted, "GroupIDExisted") + + ErrNotInGroupYet = errs.NewCodeError(NotInGroupYetError, "NotInGroupYetError") + ErrDismissedAlready = errs.NewCodeError(DismissedAlreadyError, "DismissedAlreadyError") + ErrRegisteredAlready = errs.NewCodeError(RegisteredAlreadyError, "RegisteredAlreadyError") + ErrGroupTypeNotSupport = errs.NewCodeError(GroupTypeNotSupport, "") + ErrGroupRequestHandled = errs.NewCodeError(GroupRequestHandled, "GroupRequestHandled") + + ErrData = errs.NewCodeError(DataError, "DataError") + ErrTokenExpired = errs.NewCodeError(TokenExpiredError, "TokenExpiredError") + ErrTokenInvalid = errs.NewCodeError(TokenInvalidError, "TokenInvalidError") // + ErrTokenMalformed = errs.NewCodeError(TokenMalformedError, "TokenMalformedError") // + ErrTokenNotValidYet = errs.NewCodeError(TokenNotValidYetError, "TokenNotValidYetError") // + ErrTokenUnknown = errs.NewCodeError(TokenUnknownError, "TokenUnknownError") // + ErrTokenKicked = errs.NewCodeError(TokenKickedError, "TokenKickedError") + ErrTokenNotExist = errs.NewCodeError(TokenNotExistError, "TokenNotExistError") // + + ErrMessageHasReadDisable = errs.NewCodeError(MessageHasReadDisable, "MessageHasReadDisable") + + ErrCanNotAddYourself = errs.NewCodeError(CanNotAddYourselfError, "CanNotAddYourselfError") + ErrBlockedByPeer = errs.NewCodeError(BlockedByPeer, "BlockedByPeer") + ErrNotPeersFriend = errs.NewCodeError(NotPeersFriend, "NotPeersFriend") + ErrRelationshipAlready = errs.NewCodeError(RelationshipAlreadyError, "RelationshipAlreadyError") + + ErrMutedInGroup = errs.NewCodeError(MutedInGroup, "MutedInGroup") + ErrMutedGroup = errs.NewCodeError(MutedGroup, "MutedGroup") + ErrMsgAlreadyRevoke = errs.NewCodeError(MsgAlreadyRevoke, "MsgAlreadyRevoke") + + ErrConnOverMaxNumLimit = errs.NewCodeError(ConnOverMaxNumLimit, "ConnOverMaxNumLimit") + + ErrConnArgsErr = errs.NewCodeError(ConnArgsErr, "args err, need token, sendID, platformID") + ErrPushMsgErr = errs.NewCodeError(PushMsgErr, "push msg err") + ErrIOSBackgroundPushErr = errs.NewCodeError(IOSBackgroundPushErr, "ios background push err") + + ErrFileUploadedExpired = errs.NewCodeError(FileUploadedExpiredError, "FileUploadedExpiredError") +) diff --git a/pkg/common/servererrs/relation.go b/pkg/common/servererrs/relation.go new file mode 100644 index 000000000..62b056147 --- /dev/null +++ b/pkg/common/servererrs/relation.go @@ -0,0 +1,58 @@ +// Copyright © 2023 OpenIM. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package servererrs + +import "github.com/openimsdk/tools/errs" + +var Relation = &relation{m: make(map[int]map[int]struct{})} + +func init() { + Relation.Add(errs.RecordNotFoundError, UserIDNotFoundError) + Relation.Add(errs.RecordNotFoundError, GroupIDNotFoundError) + Relation.Add(errs.DuplicateKeyError, GroupIDExisted) +} + +type relation struct { + m map[int]map[int]struct{} +} + +func (r *relation) Add(codes ...int) { + if len(codes) < 2 { + panic("codes length must be greater than 2") + } + for i := 1; i < len(codes); i++ { + parent := codes[i-1] + s, ok := r.m[parent] + if !ok { + s = make(map[int]struct{}) + r.m[parent] = s + } + for _, code := range codes[i:] { + s[code] = struct{}{} + } + } +} + +func (r *relation) Is(parent, child int) bool { + if parent == child { + return true + } + s, ok := r.m[parent] + if !ok { + return false + } + _, ok = s[child] + return ok +}