diff --git a/src/msg_gateway/gate/logic.go b/src/msg_gateway/gate/logic.go index d8bc14e6e..ebd441ecb 100644 --- a/src/msg_gateway/gate/logic.go +++ b/src/msg_gateway/gate/logic.go @@ -6,11 +6,14 @@ import ( "Open_IM/src/common/log" "Open_IM/src/grpc-etcdv3/getcdv3" pbChat "Open_IM/src/proto/chat" + pbWs "Open_IM/src/proto/sdk_ws" "Open_IM/src/utils" "bytes" "context" "encoding/gob" + "encoding/json" "fmt" + "github.com/golang/protobuf/proto" "github.com/gorilla/websocket" "runtime" "strings" @@ -66,14 +69,17 @@ func (ws *WServer) msgParse(conn *UserConn, binaryMsg []byte) { } func (ws *WServer) newestSeqResp(conn *UserConn, m *Req, pb *pbChat.GetNewSeqResp) { - mReply := make(map[string]interface{}) - mData := make(map[string]interface{}) - mReply["reqIdentifier"] = m.ReqIdentifier - mReply["msgIncr"] = m.MsgIncr - mReply["errCode"] = pb.GetErrCode() - mReply["errMsg"] = pb.GetErrMsg() - mData["seq"] = pb.GetSeq() - mReply["data"] = mData + var mReplyData pbWs.GetNewSeqResp + mReplyData.Seq = pb.GetSeq() + b, _ := proto.Marshal(&mReplyData) + mReply := Resp{ + ReqIdentifier: m.ReqIdentifier, + MsgIncr: m.MsgIncr, + ErrCode: pb.GetErrCode(), + ErrMsg: pb.GetErrMsg(), + OperationID: m.OperationID, + Data: b, + } ws.sendMsg(conn, mReply) } func (ws *WServer) newestSeqReq(conn *UserConn, m *Req) { @@ -97,26 +103,28 @@ func (ws *WServer) newestSeqReq(conn *UserConn, m *Req) { } func (ws *WServer) pullMsgResp(conn *UserConn, m *Req, pb *pbChat.PullMessageResp) { - mReply := make(map[string]interface{}) - msg := make(map[string]interface{}) - mReply["reqIdentifier"] = m.ReqIdentifier - mReply["msgIncr"] = m.MsgIncr - mReply["errCode"] = pb.GetErrCode() - mReply["errMsg"] = pb.GetErrMsg() - //空切片 - if v := pb.GetSingleUserMsg(); v != nil { - msg["single"] = v - } else { - msg["single"] = []pbChat.GatherFormat{} + var mReplyData pbWs.PullMessageBySeqListResp + mReplyData.MaxSeq = pb.GetMaxSeq() + mReplyData.MinSeq = pb.GetMinSeq() + b, _ := json.Marshal(pb.GetSingleUserMsg) + err := json.Unmarshal(b, &mReplyData.SingleUserMsg) + if err != nil { + log.NewError(m.OperationID, "SingleUserMsg,json Unmarshal,err", err.Error()) } - if v := pb.GetGroupUserMsg(); v != nil { - msg["group"] = v - } else { - msg["group"] = []pbChat.GatherFormat{} + b, _ = json.Marshal(pb.GetGroupUserMsg()) + err = json.Unmarshal(b, &mReplyData.GroupUserMsg) + if err != nil { + log.NewError(m.OperationID, "GroupUserMsg,json Unmarshal,err", err.Error()) + } + c, _ := proto.Marshal(&mReplyData) + mReply := Resp{ + ReqIdentifier: m.ReqIdentifier, + MsgIncr: m.MsgIncr, + ErrCode: pb.GetErrCode(), + ErrMsg: pb.GetErrMsg(), + OperationID: m.OperationID, + Data: c, } - msg["maxSeq"] = pb.GetMaxSeq() - msg["minSeq"] = pb.GetMinSeq() - mReply["data"] = msg ws.sendMsg(conn, mReply) } @@ -153,7 +161,7 @@ func (ws *WServer) pullMsgBySeqListReq(conn *UserConn, m *Req) { isPass, errCode, errMsg, data := ws.argsValidate(m, constant.WSPullMsgBySeqList) if isPass { pbData := pbChat.PullMessageBySeqListReq{} - pbData.SeqList = data.(SeqListData).SeqList + pbData.SeqList = data.(pbWs.PullMessageBySeqListReq).SeqList pbData.UserID = m.SendID pbData.OperationID = m.OperationID grpcConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImOfflineMessageName) @@ -174,22 +182,19 @@ func (ws *WServer) pullMsgBySeqListReq(conn *UserConn, m *Req) { func (ws *WServer) sendMsgResp(conn *UserConn, m *Req, pb *pbChat.UserSendMsgResp, sendTime int64) { // := make(map[string]interface{}) - mReplyData := make(map[string]interface{}) - //mReply["reqIdentifier"] = m.ReqIdentifier - //mReply["msgIncr"] = m.MsgIncr - //mReply["errCode"] = pb.GetErrCode() - //mReply["errMsg"] = pb.GetErrMsg() - mReplyData["clientMsgID"] = pb.GetClientMsgID() - mReplyData["serverMsgID"] = pb.GetServerMsgID() - mReplyData["sendTime"] = utils.Int64ToString(sendTime) - //mReply["data"] = mReplyData + + var mReplyData pbWs.UserSendMsgResp + mReplyData.ClientMsgID = pb.GetClientMsgID() + mReplyData.ServerMsgID = pb.GetServerMsgID() + mReplyData.SendTime = sendTime + b, _ := proto.Marshal(&mReplyData) mReply := Resp{ ReqIdentifier: m.ReqIdentifier, MsgIncr: m.MsgIncr, ErrCode: pb.GetErrCode(), ErrMsg: pb.GetErrMsg(), OperationID: m.OperationID, - Data: mReplyData, + Data: b, } fmt.Println("test fmt send msg resp", m.OperationID, "reqIdentifier", m.ReqIdentifier, "sendID", m.SendID) ws.sendMsg(conn, mReply) @@ -200,7 +205,7 @@ func (ws *WServer) sendMsgReq(conn *UserConn, m *Req, sendTime int64) { reply := new(pbChat.UserSendMsgResp) isPass, errCode, errMsg, pData := ws.argsValidate(m, constant.WSSendMsg) if isPass { - data := pData.(MsgData) + data := pData.(pbWs.UserSendMsgReq) pbData := pbChat.UserSendMsgReq{ ReqIdentifier: m.ReqIdentifier, Token: m.Token, @@ -213,9 +218,8 @@ func (ws *WServer) sendMsgReq(conn *UserConn, m *Req, sendTime int64) { RecvID: data.RecvID, ForceList: data.ForceList, Content: data.Content, - Options: utils.MapToJsonString(data.Options), + Options: utils.MapIntToJsonString(data.Options), ClientMsgID: data.ClientMsgID, - OffLineInfo: utils.MapToJsonString(data.OfflineInfo), SendTime: sendTime, } log.InfoByKv("Ws call success to sendMsgReq", m.OperationID, "Parameters", m) diff --git a/src/msg_gateway/gate/validate.go b/src/msg_gateway/gate/validate.go index fbdaf41d9..5a8843a21 100644 --- a/src/msg_gateway/gate/validate.go +++ b/src/msg_gateway/gate/validate.go @@ -9,8 +9,8 @@ package gate import ( "Open_IM/src/common/constant" "Open_IM/src/common/log" - "bytes" - "encoding/gob" + pbWs "Open_IM/src/proto/sdk_ws" + "github.com/golang/protobuf/proto" ) type Req struct { @@ -22,12 +22,12 @@ type Req struct { Data []byte `json:"data"` } type Resp struct { - ReqIdentifier int32 `json:"reqIdentifier"` - MsgIncr string `json:"msgIncr"` - OperationID string `json:"operationID"` - ErrCode int32 `json:"errCode"` - ErrMsg string `json:"errMsg"` - Data interface{} `json:"data"` + ReqIdentifier int32 `json:"reqIdentifier"` + MsgIncr string `json:"msgIncr"` + OperationID string `json:"operationID"` + ErrCode int32 `json:"errCode"` + ErrMsg string `json:"errMsg"` + Data []byte `json:"data"` } type SeqData struct { @@ -47,37 +47,57 @@ type MsgData struct { OfflineInfo map[string]interface{} `mapstructure:"offlineInfo" validate:"required"` Ext map[string]interface{} `mapstructure:"ext"` } +type MaxSeqResp struct { + MaxSeq int64 `json:"maxSeq"` +} +type PullMessageResp struct { +} type SeqListData struct { SeqList []int64 `mapstructure:"seqList" validate:"required"` } -func (ws *WServer) argsValidate(m *Req, r int32) (isPass bool, errCode int32, errMsg string, data interface{}) { +func (ws *WServer) argsValidate(m *Req, r int32) (isPass bool, errCode int32, errMsg string, returnData interface{}) { switch r { - case constant.WSPullMsg: - data = SeqData{} case constant.WSSendMsg: - data = MsgData{} + data := pbWs.UserSendMsgReq{} + if err := proto.Unmarshal(m.Data, &data); err != nil { + log.ErrorByKv("Decode Data struct err", "", "err", err.Error(), "reqIdentifier", r) + return false, 203, err.Error(), nil + } + if err := validate.Struct(data); err != nil { + log.ErrorByKv("data args validate err", "", "err", err.Error(), "reqIdentifier", r) + return false, 204, err.Error(), nil + + } + return true, 0, "", data case constant.WSPullMsgBySeqList: - data = SeqListData{} + data := pbWs.PullMessageBySeqListReq{} + if err := proto.Unmarshal(m.Data, &data); err != nil { + log.ErrorByKv("Decode Data struct err", "", "err", err.Error(), "reqIdentifier", r) + return false, 203, err.Error(), nil + } + if err := validate.Struct(data); err != nil { + log.ErrorByKv("data args validate err", "", "err", err.Error(), "reqIdentifier", r) + return false, 204, err.Error(), nil + + } + return true, 0, "", data + default: } - b := bytes.NewBuffer(m.Data) - dec := gob.NewDecoder(b) - err := dec.Decode(&data) - if err != nil { - log.ErrorByKv("Decode Data struct err", "", "err", err.Error(), "reqIdentifier", r) - return false, 203, err.Error(), nil - } + + return false, 204, "args err", nil + + //b := bytes.NewBuffer(m.Data) + //dec := gob.NewDecoder(b) + //err := dec.Decode(&data) + //if err != nil { + // log.ErrorByKv("Decode Data struct err", "", "err", err.Error(), "reqIdentifier", r) + // return false, 203, err.Error(), nil + //} //if err := mapstructure.WeakDecode(m.Data, &data); err != nil { // log.ErrorByKv("map to Data struct err", "", "err", err.Error(), "reqIdentifier", r) // return false, 203, err.Error(), nil //} else - if err = validate.Struct(data); err != nil { - log.ErrorByKv("data args validate err", "", "err", err.Error(), "reqIdentifier", r) - return false, 204, err.Error(), nil - - } else { - return true, 0, "", data - } } diff --git a/src/proto/sdk_ws/ws.proto b/src/proto/sdk_ws/ws.proto index 581b9db18..94eccfeb2 100644 --- a/src/proto/sdk_ws/ws.proto +++ b/src/proto/sdk_ws/ws.proto @@ -1,6 +1,6 @@ syntax = "proto3"; -package pbWs;//The package name to which the proto file belongs -option go_package = "./sdk_ws;pbWs";//The generated go pb file is in the current directory, and the package name is pbChat +package open_im_sdk;//The package name to which the proto file belongs +option go_package = "./sdk_ws;open_im_sdk";//The generated go pb file is in the current directory, and the package name is open_im_sdk message PullMessageBySeqListResp { diff --git a/src/utils/map.go b/src/utils/map.go index c52cebf67..2807805db 100644 --- a/src/utils/map.go +++ b/src/utils/map.go @@ -106,6 +106,11 @@ func MapToJsonString(param map[string]interface{}) string { dataString := string(dataType) return dataString } +func MapIntToJsonString(param map[string]int32) string { + dataType, _ := json.Marshal(param) + dataString := string(dataType) + return dataString +} func JsonStringToMap(str string) (tempMap map[string]interface{}) { _ = json.Unmarshal([]byte(str), &tempMap) return tempMap