From 9dbad9ce53777bb2af242bb424edba0d16d525b8 Mon Sep 17 00:00:00 2001 From: wenxu12345 <44203734@qq.com> Date: Tue, 7 Dec 2021 15:44:12 +0800 Subject: [PATCH] ReceiveMessageOpt --- internal/api/conversation/conversation.go | 46 ++++++++++++++++--- pkg/utils/utils.go | 55 +++++++++++++++++++++++ 2 files changed, 95 insertions(+), 6 deletions(-) create mode 100644 pkg/utils/utils.go diff --git a/internal/api/conversation/conversation.go b/internal/api/conversation/conversation.go index 4046f611c..41d82474a 100644 --- a/internal/api/conversation/conversation.go +++ b/internal/api/conversation/conversation.go @@ -6,6 +6,7 @@ import ( "Open_IM/pkg/common/token_verify" "Open_IM/pkg/grpc-etcdv3/getcdv3" "Open_IM/pkg/proto/user" + "Open_IM/pkg/utils" "context" "github.com/gin-gonic/gin" "net/http" @@ -18,10 +19,15 @@ type paramsSetReceiveMessageOpt struct { ConversationIdList []string `json:"conversationIdList" binding:"required"` } +type OptResult struct { + ConversationId string `json:"conversationId" binding:"required"` + Result int32 `json:"result" binding:"required"` +} + type SetReceiveMessageOptResp struct { - ErrCode int32 `json:"errCode"` - ErrMsg string `json:"errMsg"` - Data []*user.OptResult `json:"data"` + ErrCode int32 `json:"errCode"` + ErrMsg string `json:"errMsg"` + Data []OptResult `json:"data"` } type paramGetReceiveMessageOpt struct { @@ -41,6 +47,8 @@ type GetAllConversationMessageOptResp struct { SetReceiveMessageOptResp } +//CopyStructFields + func GetAllConversationMessageOpt(c *gin.Context) { params := paramGetAllConversationMessageOpt{} if err := c.BindJSON(¶ms); err != nil { @@ -72,7 +80,15 @@ func GetAllConversationMessageOpt(c *gin.Context) { var ginResp GetAllConversationMessageOptResp ginResp.ErrCode = resp.ErrCode ginResp.ErrMsg = resp.ErrMsg - ginResp.Data = resp.ConversationOptResult + for _, v := range resp.ConversationOptResult { + var opt OptResult + err := utils.CopyStructFields(&opt, v) + if err != nil { + log.NewError(req.OperationID, "CopyStructFields failed ", err.Error()) + continue + } + ginResp.Data = append(ginResp.Data, opt) + } log.NewInfo(req.OperationID, "GetAllConversationMsgOpt resp: ", ginResp, req) c.JSON(http.StatusOK, ginResp) } @@ -109,7 +125,16 @@ func GetReceiveMessageOpt(c *gin.Context) { var ginResp GetReceiveMessageOptResp ginResp.ErrCode = resp.ErrCode ginResp.ErrMsg = resp.ErrMsg - ginResp.Data = resp.ConversationOptResult + + for _, v := range resp.ConversationOptResult { + var opt OptResult + err := utils.CopyStructFields(&opt, v) + if err != nil { + log.NewError(req.OperationID, "CopyStructFields failed ", err.Error()) + continue + } + ginResp.Data = append(ginResp.Data, opt) + } log.NewInfo(req.OperationID, "GetReceiveMessageOpt resp: ", ginResp) c.JSON(http.StatusOK, ginResp) } @@ -148,7 +173,16 @@ func SetReceiveMessageOpt(c *gin.Context) { ginResp := SetReceiveMessageOptResp{ ErrCode: resp.ErrCode, ErrMsg: resp.ErrMsg, - Data: resp.OptResult, + } + + for _, v := range resp.OptResult { + var opt OptResult + err := utils.CopyStructFields(&opt, v) + if err != nil { + log.NewError(req.OperationID, "CopyStructFields failed ", err.Error()) + continue + } + ginResp.Data = append(ginResp.Data, opt) } log.NewInfo(req.OperationID, "SetReceiveMessageOpt resp: ", ginResp) c.JSON(http.StatusOK, ginResp) diff --git a/pkg/utils/utils.go b/pkg/utils/utils.go new file mode 100644 index 000000000..5f6e9a6ca --- /dev/null +++ b/pkg/utils/utils.go @@ -0,0 +1,55 @@ +package utils + +import ( + "fmt" + "reflect" +) + +// copy a by b b->a +func CopyStructFields(a interface{}, b interface{}, fields ...string) (err error) { + at := reflect.TypeOf(a) + av := reflect.ValueOf(a) + bt := reflect.TypeOf(b) + bv := reflect.ValueOf(b) + + if at.Kind() != reflect.Ptr { + err = fmt.Errorf("a must be a struct pointer") + return err + } + av = reflect.ValueOf(av.Interface()) + + _fields := make([]string, 0) + if len(fields) > 0 { + _fields = fields + } else { + for i := 0; i < bv.NumField(); i++ { + _fields = append(_fields, bt.Field(i).Name) + } + } + + if len(_fields) == 0 { + err = fmt.Errorf("no fields to copy") + return err + } + + for i := 0; i < len(_fields); i++ { + name := _fields[i] + f := av.Elem().FieldByName(name) + bValue := bv.FieldByName(name) + + if f.IsValid() && f.Kind() == bValue.Kind() { + f.Set(bValue) + } + } + return nil +} + +type S1 struct { + Name string + Age int +} + +type S2 struct { + Name string + Age int32 +}