mirror of
https://github.com/openimsdk/open-im-server.git
synced 2025-04-06 04:15:46 +08:00
msg update
This commit is contained in:
parent
c036d27b36
commit
b05e89cd67
23
internal/api/custom_validator.go
Normal file
23
internal/api/custom_validator.go
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
package api
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/constant"
|
||||||
|
"github.com/go-playground/validator/v10"
|
||||||
|
)
|
||||||
|
|
||||||
|
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() != ""
|
||||||
|
}
|
||||||
|
case constant.GroupChatType, constant.SuperGroupChatType:
|
||||||
|
if fl.FieldName() == "GroupID" {
|
||||||
|
return fl.Field().String() != ""
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
@ -2,7 +2,6 @@ package api
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/config"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/config"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/constant"
|
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/log"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/log"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/mw"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/mw"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/prome"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/prome"
|
||||||
@ -162,20 +161,3 @@ func NewGinRouter(zk discoveryregistry.SvcDiscoveryRegistry, rdb redis.Universal
|
|||||||
}
|
}
|
||||||
return r
|
return r
|
||||||
}
|
}
|
||||||
|
|
||||||
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() != ""
|
|
||||||
}
|
|
||||||
case constant.GroupChatType, constant.SuperGroupChatType:
|
|
||||||
if fl.FieldName() == "GroupID" {
|
|
||||||
return fl.Field().String() != ""
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
@ -1,9 +1,3 @@
|
|||||||
/*
|
|
||||||
** description("").
|
|
||||||
** copyright('open-im,www.open-im.io').
|
|
||||||
** author("fg,Gordon@open-im.io").
|
|
||||||
** time(2021/3/22 15:33).
|
|
||||||
*/
|
|
||||||
package push
|
package push
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
@ -1,9 +1,3 @@
|
|||||||
/*
|
|
||||||
** description("").
|
|
||||||
** copyright('OpenIM,www.OpenIM.io').
|
|
||||||
** author("fg,Gordon@tuoyun.net").
|
|
||||||
** time(2021/5/13 10:33).
|
|
||||||
*/
|
|
||||||
package push
|
package push
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
@ -1,9 +1,3 @@
|
|||||||
/*
|
|
||||||
** description("").
|
|
||||||
** copyright('open-im,www.open-im.io').
|
|
||||||
** author("fg,Gordon@open-im.io").
|
|
||||||
** time(2021/3/5 14:31).
|
|
||||||
*/
|
|
||||||
package push
|
package push
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
61
internal/rpc/msg/MessageInterceptor.go
Normal file
61
internal/rpc/msg/MessageInterceptor.go
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
package msg
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/config"
|
||||||
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/constant"
|
||||||
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/log"
|
||||||
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/errs"
|
||||||
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/msg"
|
||||||
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/sdkws"
|
||||||
|
)
|
||||||
|
|
||||||
|
type MessageInterceptorFunc func(ctx context.Context, req *msg.SendMsgReq) (*sdkws.MsgData, error)
|
||||||
|
|
||||||
|
func MessageHasReadEnabled(_ context.Context, req *msg.SendMsgReq) (*sdkws.MsgData, error) {
|
||||||
|
switch req.MsgData.ContentType {
|
||||||
|
case constant.HasReadReceipt:
|
||||||
|
if config.Config.SingleMessageHasReadReceiptEnable {
|
||||||
|
return req.MsgData, nil
|
||||||
|
} else {
|
||||||
|
return nil, errs.ErrMessageHasReadDisable.Wrap()
|
||||||
|
}
|
||||||
|
case constant.GroupHasReadReceipt:
|
||||||
|
if config.Config.GroupMessageHasReadReceiptEnable {
|
||||||
|
return req.MsgData, nil
|
||||||
|
} else {
|
||||||
|
return nil, errs.ErrMessageHasReadDisable.Wrap()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return req.MsgData, nil
|
||||||
|
}
|
||||||
|
func MessageModifyCallback(ctx context.Context, req *msg.SendMsgReq) (*sdkws.MsgData, error) {
|
||||||
|
if err := CallbackMsgModify(ctx, req); err != nil && err != errs.ErrCallbackContinue {
|
||||||
|
log.ZWarn(ctx, "CallbackMsgModify failed", err, "req", req.String())
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return req.MsgData, nil
|
||||||
|
}
|
||||||
|
func MessageBeforeSendCallback(ctx context.Context, req *msg.SendMsgReq) (*sdkws.MsgData, error) {
|
||||||
|
switch req.MsgData.SessionType {
|
||||||
|
case constant.SingleChatType:
|
||||||
|
if err := CallbackBeforeSendSingleMsg(ctx, req); err != nil && err != errs.ErrCallbackContinue {
|
||||||
|
log.ZWarn(ctx, "CallbackBeforeSendSingleMsg failed", err, "req", req.String())
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
case constant.GroupChatType:
|
||||||
|
if err := CallbackBeforeSendGroupMsg(ctx, req); err != nil && err != errs.ErrCallbackContinue {
|
||||||
|
log.ZWarn(ctx, "CallbackBeforeSendGroupMsg failed", err, "req", req.String())
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
case constant.NotificationChatType:
|
||||||
|
case constant.SuperGroupChatType:
|
||||||
|
if err := CallbackBeforeSendGroupMsg(ctx, req); err != nil && err != errs.ErrCallbackContinue {
|
||||||
|
log.ZWarn(ctx, "CallbackBeforeSendGroupMsg failed", err, "req", req.String())
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return nil, errs.ErrArgs.Wrap("unknown sessionType")
|
||||||
|
}
|
||||||
|
return req.MsgData, nil
|
||||||
|
}
|
@ -16,11 +16,6 @@ import (
|
|||||||
func (m *msgServer) sendMsgSuperGroupChat(ctx context.Context, req *msg.SendMsgReq) (resp *msg.SendMsgResp, err error) {
|
func (m *msgServer) sendMsgSuperGroupChat(ctx context.Context, req *msg.SendMsgReq) (resp *msg.SendMsgResp, err error) {
|
||||||
resp = &msg.SendMsgResp{}
|
resp = &msg.SendMsgResp{}
|
||||||
promePkg.Inc(promePkg.WorkSuperGroupChatMsgRecvSuccessCounter)
|
promePkg.Inc(promePkg.WorkSuperGroupChatMsgRecvSuccessCounter)
|
||||||
// callback
|
|
||||||
if err = CallbackBeforeSendGroupMsg(ctx, req); err != nil && err != errs.ErrCallbackContinue {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
if _, err = m.messageVerification(ctx, req); err != nil {
|
if _, err = m.messageVerification(ctx, req); err != nil {
|
||||||
promePkg.Inc(promePkg.WorkSuperGroupChatMsgProcessFailedCounter)
|
promePkg.Inc(promePkg.WorkSuperGroupChatMsgProcessFailedCounter)
|
||||||
return nil, err
|
return nil, err
|
||||||
@ -63,9 +58,6 @@ func (m *msgServer) sendMsgNotification(ctx context.Context, req *msg.SendMsgReq
|
|||||||
|
|
||||||
func (m *msgServer) sendMsgSingleChat(ctx context.Context, req *msg.SendMsgReq) (resp *msg.SendMsgResp, err error) {
|
func (m *msgServer) sendMsgSingleChat(ctx context.Context, req *msg.SendMsgReq) (resp *msg.SendMsgResp, err error) {
|
||||||
promePkg.Inc(promePkg.SingleChatMsgRecvSuccessCounter)
|
promePkg.Inc(promePkg.SingleChatMsgRecvSuccessCounter)
|
||||||
if err = CallbackBeforeSendSingleMsg(ctx, req); err != nil && err != errs.ErrCallbackContinue {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
_, err = m.messageVerification(ctx, req)
|
_, err = m.messageVerification(ctx, req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@ -103,10 +95,6 @@ func (m *msgServer) sendMsgSingleChat(ctx context.Context, req *msg.SendMsgReq)
|
|||||||
func (m *msgServer) sendMsgGroupChat(ctx context.Context, req *msg.SendMsgReq) (resp *msg.SendMsgResp, err error) {
|
func (m *msgServer) sendMsgGroupChat(ctx context.Context, req *msg.SendMsgReq) (resp *msg.SendMsgResp, err error) {
|
||||||
// callback
|
// callback
|
||||||
promePkg.Inc(promePkg.GroupChatMsgRecvSuccessCounter)
|
promePkg.Inc(promePkg.GroupChatMsgRecvSuccessCounter)
|
||||||
err = CallbackBeforeSendGroupMsg(ctx, req)
|
|
||||||
if err != nil && err != errs.ErrCallbackContinue {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var memberUserIDList []string
|
var memberUserIDList []string
|
||||||
if memberUserIDList, err = m.messageVerification(ctx, req); err != nil {
|
if memberUserIDList, err = m.messageVerification(ctx, req); err != nil {
|
||||||
|
@ -18,6 +18,7 @@ import (
|
|||||||
"google.golang.org/grpc"
|
"google.golang.org/grpc"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type MessageInterceptorChain []MessageInterceptorFunc
|
||||||
type msgServer struct {
|
type msgServer struct {
|
||||||
RegisterCenter discoveryregistry.SvcDiscoveryRegistry
|
RegisterCenter discoveryregistry.SvcDiscoveryRegistry
|
||||||
MsgDatabase controller.MsgDatabase
|
MsgDatabase controller.MsgDatabase
|
||||||
@ -29,8 +30,22 @@ type msgServer struct {
|
|||||||
*localcache.GroupLocalCache
|
*localcache.GroupLocalCache
|
||||||
black *check.BlackChecker
|
black *check.BlackChecker
|
||||||
MessageLocker MessageLocker
|
MessageLocker MessageLocker
|
||||||
|
Handlers MessageInterceptorChain
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (m *msgServer) addInterceptorHandler(interceptorFunc ...MessageInterceptorFunc) {
|
||||||
|
m.Handlers = append(m.Handlers, interceptorFunc...)
|
||||||
|
}
|
||||||
|
func (m *msgServer) execInterceptorHandler(ctx context.Context, req *msg.SendMsgReq) error {
|
||||||
|
for _, handler := range m.Handlers {
|
||||||
|
msgData, err := handler(ctx, req)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
req.MsgData = msgData
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
func Start(client discoveryregistry.SvcDiscoveryRegistry, server *grpc.Server) error {
|
func Start(client discoveryregistry.SvcDiscoveryRegistry, server *grpc.Server) error {
|
||||||
rdb, err := cache.NewRedis()
|
rdb, err := cache.NewRedis()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -40,7 +55,6 @@ func Start(client discoveryregistry.SvcDiscoveryRegistry, server *grpc.Server) e
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
cacheModel := cache.NewCacheModel(rdb)
|
cacheModel := cache.NewCacheModel(rdb)
|
||||||
msgDocModel := unrelation.NewMsgMongoDriver(mongo.GetDatabase())
|
msgDocModel := unrelation.NewMsgMongoDriver(mongo.GetDatabase())
|
||||||
extendMsgModel := unrelation.NewExtendMsgSetMongoDriver(mongo.GetDatabase())
|
extendMsgModel := unrelation.NewExtendMsgSetMongoDriver(mongo.GetDatabase())
|
||||||
@ -60,6 +74,7 @@ func Start(client discoveryregistry.SvcDiscoveryRegistry, server *grpc.Server) e
|
|||||||
friend: check.NewFriendChecker(client),
|
friend: check.NewFriendChecker(client),
|
||||||
MessageLocker: NewLockerMessage(cacheModel),
|
MessageLocker: NewLockerMessage(cacheModel),
|
||||||
}
|
}
|
||||||
|
s.addInterceptorHandler(MessageHasReadEnabled, MessageModifyCallback)
|
||||||
s.initPrometheus()
|
s.initPrometheus()
|
||||||
msg.RegisterMsgServer(server, s)
|
msg.RegisterMsgServer(server, s)
|
||||||
return nil
|
return nil
|
||||||
|
@ -472,7 +472,7 @@ func Unwrap(err error) error {
|
|||||||
|
|
||||||
// NotNilReplace 当new_不为空时, 将old设置为new_
|
// NotNilReplace 当new_不为空时, 将old设置为new_
|
||||||
func NotNilReplace[T any](old, new_ *T) {
|
func NotNilReplace[T any](old, new_ *T) {
|
||||||
if old == nil || new_ == nil {
|
if new_ == nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
*old = *new_
|
*old = *new_
|
||||||
|
Loading…
x
Reference in New Issue
Block a user