From c13411da69a6457ba810c071a5d7f462eaa1531e Mon Sep 17 00:00:00 2001 From: luhaoling <2198702716@qq.com> Date: Thu, 30 Nov 2023 18:43:04 +0800 Subject: [PATCH] feat: add GetConversationsUnreadSeqAndMaxSeq func --- go.mod | 12 ++++++----- go.sum | 4 ++-- internal/api/msg.go | 13 ++++++++++++ internal/api/route.go | 1 + internal/rpc/msg/as_read.go | 41 +++++++++++++++++++++++++++++++++++++ 5 files changed, 64 insertions(+), 7 deletions(-) diff --git a/go.mod b/go.mod index 8d767dbc1..6e2dab0e4 100644 --- a/go.mod +++ b/go.mod @@ -40,8 +40,13 @@ require ( github.com/OpenIMSDK/protocol v0.0.31 github.com/OpenIMSDK/tools v0.0.17 github.com/aliyun/aliyun-oss-go-sdk v2.2.9+incompatible + github.com/aws/aws-sdk-go-v2 v1.23.1 + github.com/aws/aws-sdk-go-v2/config v1.25.4 + github.com/aws/aws-sdk-go-v2/credentials v1.16.3 + github.com/aws/aws-sdk-go-v2/service/s3 v1.43.1 github.com/go-redis/redis v6.15.9+incompatible github.com/go-sql-driver/mysql v1.7.1 + github.com/qiniu/go-sdk/v7 v7.18.2 github.com/redis/go-redis/v9 v9.2.1 github.com/tencentyun/cos-go-sdk-v5 v0.7.45 go.uber.org/automaxprocs v1.5.3 @@ -58,10 +63,7 @@ require ( cloud.google.com/go/iam v1.1.2 // indirect cloud.google.com/go/longrunning v0.5.1 // indirect cloud.google.com/go/storage v1.30.1 // indirect - github.com/aws/aws-sdk-go-v2 v1.23.1 // indirect github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.1 // indirect - github.com/aws/aws-sdk-go-v2/config v1.25.4 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.16.3 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.5 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.4 // indirect github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.4 // indirect @@ -71,7 +73,6 @@ require ( github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.4 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.4 // indirect github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.4 // indirect - github.com/aws/aws-sdk-go-v2/service/s3 v1.43.1 // indirect github.com/aws/aws-sdk-go-v2/service/sso v1.17.3 // indirect github.com/aws/aws-sdk-go-v2/service/ssooidc v1.20.1 // indirect github.com/aws/aws-sdk-go-v2/service/sts v1.25.4 // indirect @@ -133,7 +134,6 @@ require ( github.com/prometheus/client_model v0.4.1-0.20230718164431-9a2bf3000d16 // indirect github.com/prometheus/common v0.44.0 // indirect github.com/prometheus/procfs v0.11.1 // indirect - github.com/qiniu/go-sdk/v7 v7.18.2 // indirect github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect github.com/rs/xid v1.5.0 // indirect github.com/sergi/go-diff v1.0.0 // indirect @@ -175,3 +175,5 @@ require ( golang.org/x/crypto v0.14.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect ) + +replace github.com/OpenIMSDK/protocol v0.0.31 => github.com/luhaoling/protocol v0.0.0-20231130102222-4fd608e76fe6 diff --git a/go.sum b/go.sum index 640b11e89..5686377a5 100644 --- a/go.sum +++ b/go.sum @@ -18,8 +18,6 @@ firebase.google.com/go v3.13.0+incompatible/go.mod h1:xlah6XbEyW6tbfSklcfe5FHJIw github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/IBM/sarama v1.41.3 h1:MWBEJ12vHC8coMjdEXFq/6ftO6DUZnQlFYcxtOJFa7c= github.com/IBM/sarama v1.41.3/go.mod h1:Xxho9HkHd4K/MDUo/T/sOqwtX/17D33++E9Wib6hUdQ= -github.com/OpenIMSDK/protocol v0.0.31 h1:ax43x9aqA6EKNXNukS5MT5BSTqkUmwO4uTvbJLtzCgE= -github.com/OpenIMSDK/protocol v0.0.31/go.mod h1:F25dFrwrIx3lkNoiuf6FkCfxuwf8L4Z8UIsdTHP/r0Y= github.com/OpenIMSDK/tools v0.0.17 h1:1E1HUOL2W09YUHBb4wBwrXoTSZm5ONVwLxlEX1GhlKw= github.com/OpenIMSDK/tools v0.0.17/go.mod h1:eg+q4A34Qmu73xkY0mt37FHGMCMfC6CtmOnm0kFEGFI= github.com/QcloudApi/qcloud_sign_golang v0.0.0-20141224014652-e4130a326409/go.mod h1:1pk82RBxDY/JZnPQrtqHlUFfCctgdorsd9M06fMynOM= @@ -276,6 +274,8 @@ github.com/lestrrat-go/strftime v1.0.6 h1:CFGsDEt1pOpFNU+TJB0nhz9jl+K0hZSLE205Ah github.com/lestrrat-go/strftime v1.0.6/go.mod h1:f7jQKgV5nnJpYgdEasS+/y7EsTb8ykN2z68n3TtcTaw= github.com/lithammer/shortuuid v3.0.0+incompatible h1:NcD0xWW/MZYXEHa6ITy6kaXN5nwm/V115vj2YXfhS0w= github.com/lithammer/shortuuid v3.0.0+incompatible/go.mod h1:FR74pbAuElzOUuenUHTK2Tciko1/vKuIKS9dSkDrA4w= +github.com/luhaoling/protocol v0.0.0-20231130102222-4fd608e76fe6 h1:6AUtZlgujfj/7YrIJ7YTR0/F9s9BDDJWDJAaqEtLbII= +github.com/luhaoling/protocol v0.0.0-20231130102222-4fd608e76fe6/go.mod h1:F25dFrwrIx3lkNoiuf6FkCfxuwf8L4Z8UIsdTHP/r0Y= github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= diff --git a/internal/api/msg.go b/internal/api/msg.go index 67b5f1eff..3f9dc2fdb 100644 --- a/internal/api/msg.go +++ b/internal/api/msg.go @@ -125,6 +125,10 @@ func (m *MessageApi) GetConversationsHasReadAndMaxSeq(c *gin.Context) { a2r.Call(msg.MsgClient.GetConversationsHasReadAndMaxSeq, m.Client, c) } +func (m *MessageApi) GetConversationsUnreadSeqAndMaxSeq(c *gin.Context) { + a2r.Call(msg.MsgClient.GetConversationsUnreadSeqAndMaxSeq, m.Client, c) +} + func (m *MessageApi) SetConversationHasReadSeq(c *gin.Context) { a2r.Call(msg.MsgClient.SetConversationHasReadSeq, m.Client, c) } @@ -191,6 +195,9 @@ func (m *MessageApi) SendMessage(c *gin.Context) { apiresp.GinError(c, errs.ErrArgs.WithDetail(err.Error()).Wrap()) return } + if req.RecvID == "" { + apiresp.GinError(c, errs.ErrArgs.Wrap("recvId is empty")) + } if !authverify.IsAppManagerUid(c) { apiresp.GinError(c, errs.ErrNoPermission.Wrap("only app manager can send message")) return @@ -231,6 +238,12 @@ func (m *MessageApi) SendBusinessNotification(c *gin.Context) { apiresp.GinError(c, errs.ErrArgs.WithDetail(err.Error()).Wrap()) return } + if req.SendUserID == "" { + apiresp.GinError(c, errs.ErrArgs.Wrap("sendUserID is empty")) + } + if req.RecvUserID == "" { + apiresp.GinError(c, errs.ErrArgs.Wrap("recvUserID is empty")) + } if !authverify.IsAppManagerUid(c) { apiresp.GinError(c, errs.ErrNoPermission.Wrap("only app manager can send message")) return diff --git a/internal/api/route.go b/internal/api/route.go index 7a331d643..360c42828 100644 --- a/internal/api/route.go +++ b/internal/api/route.go @@ -175,6 +175,7 @@ func NewGinRouter(discov discoveryregistry.SvcDiscoveryRegistry, rdb redis.Unive msgGroup.POST("/mark_msgs_as_read", m.MarkMsgsAsRead) msgGroup.POST("/mark_conversation_as_read", m.MarkConversationAsRead) msgGroup.POST("/get_conversations_has_read_and_max_seq", m.GetConversationsHasReadAndMaxSeq) + msgGroup.POST("/get_conversations_unread_seq_and_max_seq", m.GetConversationsUnreadSeqAndMaxSeq) msgGroup.POST("/set_conversation_has_read_seq", m.SetConversationHasReadSeq) msgGroup.POST("/clear_conversation_msg", m.ClearConversationsMsg) diff --git a/internal/rpc/msg/as_read.go b/internal/rpc/msg/as_read.go index 49113aa0b..35893a5af 100644 --- a/internal/rpc/msg/as_read.go +++ b/internal/rpc/msg/as_read.go @@ -71,6 +71,47 @@ func (m *msgServer) GetConversationsHasReadAndMaxSeq(ctx context.Context, req *m return resp, nil } +func (m *msgServer) GetConversationsUnreadSeqAndMaxSeq(ctx context.Context, req *msg.GetConversationsUnreadSeqAndMaxSeqReq) (resp *msg.GetConversationsUnreadSeqAndMaxSeqResp, err error) { + var conversationIDs []string + if len(req.ConversationIDs) == 0 { + conversationIDs, err = m.ConversationLocalCache.GetConversationIDs(ctx, req.UserID) + if err != nil { + return nil, err + } + } else { + conversationIDs = req.ConversationIDs + } + hasReadSeqs, err := m.MsgDatabase.GetHasReadSeqs(ctx, req.UserID, conversationIDs) + if err != nil { + return nil, err + } + conversations, err := m.Conversation.GetConversations(ctx, req.UserID, conversationIDs) + if err != nil { + return nil, err + } + conversationMaxSeqMap := make(map[string]int64) + for _, conversation := range conversations { + if conversation.MaxSeq != 0 { + conversationMaxSeqMap[conversation.ConversationID] = conversation.MaxSeq + } + } + maxSeqs, err := m.MsgDatabase.GetMaxSeqs(ctx, conversationIDs) + if err != nil { + return nil, err + } + resp = &msg.GetConversationsUnreadSeqAndMaxSeqResp{Seqs: make(map[string]*msg.UnreadSeqs)} + for conversarionID, maxSeq := range maxSeqs { + resp.Seqs[conversarionID] = &msg.UnreadSeqs{ + UnreadSeq: hasReadSeqs[conversarionID], + MaxSeq: maxSeq, + } + if v, ok := conversationMaxSeqMap[conversarionID]; ok { + resp.Seqs[conversarionID].MaxSeq = v + } + } + return resp, nil +} + func (m *msgServer) SetConversationHasReadSeq( ctx context.Context, req *msg.SetConversationHasReadSeqReq,