diff --git a/cmd/rpc/third/main.go b/cmd/rpc/third/main.go new file mode 100644 index 000000000..687223e41 --- /dev/null +++ b/cmd/rpc/third/main.go @@ -0,0 +1 @@ +package third diff --git a/internal/api/conversation.go b/internal/api/conversation.go new file mode 100644 index 000000000..781a30a6f --- /dev/null +++ b/internal/api/conversation.go @@ -0,0 +1,56 @@ +package api + +import ( + "OpenIM/internal/api/a2r" + "OpenIM/pkg/common/config" + "OpenIM/pkg/proto/conversation" + "context" + "github.com/OpenIMSDK/openKeeper" + "github.com/gin-gonic/gin" +) + +var _ context.Context // 解决goland编辑器bug + +func NewConversation(zk *openKeeper.ZkClient) *Conversation { + return &Conversation{zk: zk} +} + +type Conversation struct { + zk *openKeeper.ZkClient +} + +func (o *Conversation) client() (conversation.ConversationClient, error) { + conn, err := o.zk.GetConn(config.Config.RpcRegisterName.OpenImGroupName) + if err != nil { + return nil, err + } + return conversation.NewConversationClient(conn), nil +} + +func (o *Conversation) GetAllConversations(c *gin.Context) { + a2r.Call(conversation.ConversationClient.GetAllConversations, o.client, c) +} + +func (o *Conversation) GetConversation(c *gin.Context) { + a2r.Call(conversation.ConversationClient.GetConversation, o.client, c) +} + +func (o *Conversation) GetConversations(c *gin.Context) { + a2r.Call(conversation.ConversationClient.GetConversations, o.client, c) +} + +func (o *Conversation) SetConversation(c *gin.Context) { + a2r.Call(conversation.ConversationClient.SetConversation, o.client, c) +} + +func (o *Conversation) BatchSetConversations(c *gin.Context) { + a2r.Call(conversation.ConversationClient.BatchSetConversations, o.client, c) +} + +func (o *Conversation) SetRecvMsgOpt(c *gin.Context) { + a2r.Call(conversation.ConversationClient.SetRecvMsgOpt, o.client, c) +} + +func (o *Conversation) ModifyConversationField(c *gin.Context) { + a2r.Call(conversation.ConversationClient.ModifyConversationField, o.client, c) +} diff --git a/internal/api/conversation/conversation.go b/internal/api/conversation/conversation.go deleted file mode 100644 index a0bf954cd..000000000 --- a/internal/api/conversation/conversation.go +++ /dev/null @@ -1,327 +0,0 @@ -package conversation - -import ( - api "OpenIM/pkg/apistruct" - "OpenIM/pkg/common/config" - "OpenIM/pkg/common/log" - pbConversation "OpenIM/pkg/proto/conversation" - pbUser "OpenIM/pkg/proto/user" - "OpenIM/pkg/utils" - "context" - "github.com/gin-gonic/gin" - "net/http" - "strings" -) - -func SetConversation(c *gin.Context) { - var ( - req api.SetConversationReq - resp api.SetConversationResp - reqPb pbUser.SetConversationReq - ) - if err := c.BindJSON(&req); err != nil { - log.NewError(req.OperationID, utils.GetSelfFuncName(), "bind json failed", err.Error()) - c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": "bind json failed " + err.Error()}) - return - } - log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "req: ", req) - reqPb.Conversation = &pbConversation.Conversation{} - err := utils.CopyStructFields(&reqPb, req) - err = utils.CopyStructFields(reqPb.Conversation, req.Conversation) - if err != nil { - log.NewDebug(req.OperationID, utils.GetSelfFuncName(), "CopyStructFields failed", err.Error()) - } - etcdConn := rpc.GetDefaultConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImUserName, req.OperationID) - if etcdConn == nil { - errMsg := req.OperationID + "getcdv3.GetDefaultConn == nil" - log.NewError(req.OperationID, errMsg) - c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg}) - return - } - client := pbUser.NewUserClient(etcdConn) - respPb, err := client.SetConversation(context.Background(), &reqPb) - if err != nil { - log.NewError(req.OperationID, utils.GetSelfFuncName(), "SetConversation rpc failed, ", reqPb.String(), err.Error()) - c.JSON(http.StatusBadRequest, gin.H{"errCode": 500, "errMsg": "GetAllConversationMsgOpt rpc failed, " + err.Error()}) - return - } - resp.ErrMsg = respPb.CommonResp.ErrMsg - resp.ErrCode = respPb.CommonResp.ErrCode - log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "resp: ", resp) - c.JSON(http.StatusOK, resp) -} -func ModifyConversationField(c *gin.Context) { - var ( - req api.ModifyConversationFieldReq - resp api.ModifyConversationFieldResp - reqPb pbConversation.ModifyConversationFieldReq - ) - if err := c.BindJSON(&req); err != nil { - log.NewError(req.OperationID, utils.GetSelfFuncName(), "bind json failed", err.Error()) - c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": "bind json failed " + err.Error()}) - return - } - log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "req: ", req) - reqPb.Conversation = &pbConversation.Conversation{} - err := utils.CopyStructFields(&reqPb, req) - err = utils.CopyStructFields(reqPb.Conversation, req.Conversation) - if err != nil { - log.NewDebug(req.OperationID, utils.GetSelfFuncName(), "CopyStructFields failed", err.Error()) - } - etcdConn := rpc.GetDefaultConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImConversationName, req.OperationID) - if etcdConn == nil { - errMsg := req.OperationID + "getcdv3.GetDefaultConn == nil" - log.NewError(req.OperationID, errMsg) - c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg}) - return - } - client := pbConversation.NewConversationClient(etcdConn) - respPb, err := client.ModifyConversationField(context.Background(), &reqPb) - if err != nil { - log.NewError(req.OperationID, utils.GetSelfFuncName(), "SetConversation rpc failed, ", reqPb.String(), err.Error()) - c.JSON(http.StatusBadRequest, gin.H{"errCode": 500, "errMsg": "GetAllConversationMsgOpt rpc failed, " + err.Error()}) - return - } - resp.ErrMsg = respPb.CommonResp.ErrMsg - resp.ErrCode = respPb.CommonResp.ErrCode - log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "resp: ", resp) - c.JSON(http.StatusOK, resp) -} - -func BatchSetConversations(c *gin.Context) { - var ( - req api.BatchSetConversationsReq - resp api.BatchSetConversationsResp - reqPb pbUser.BatchSetConversationsReq - ) - if err := c.BindJSON(&req); err != nil { - log.NewError(req.OperationID, utils.GetSelfFuncName(), "bind json failed", err.Error()) - c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": "bind json failed " + err.Error()}) - return - } - log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "req: ", req) - if err := utils.CopyStructFields(&reqPb, req); err != nil { - log.NewDebug(req.OperationID, utils.GetSelfFuncName(), "CopyStructFields failed", err.Error()) - } - etcdConn := rpc.GetDefaultConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImUserName, req.OperationID) - if etcdConn == nil { - errMsg := req.OperationID + "getcdv3.GetDefaultConn == nil" - log.NewError(req.OperationID, errMsg) - c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg}) - return - } - client := pbUser.NewUserClient(etcdConn) - respPb, err := client.BatchSetConversations(context.Background(), &reqPb) - if err != nil { - log.NewError(req.OperationID, utils.GetSelfFuncName(), "SetConversation rpc failed, ", reqPb.String(), err.Error()) - c.JSON(http.StatusBadRequest, gin.H{"errCode": 500, "errMsg": "GetAllConversationMsgOpt rpc failed, " + err.Error()}) - return - } - if err := utils.CopyStructFields(&resp.Data, respPb); err != nil { - log.NewDebug(req.OperationID, utils.GetSelfFuncName(), "CopyStructFields failed", err.Error()) - } - resp.ErrMsg = respPb.CommonResp.ErrMsg - resp.ErrCode = respPb.CommonResp.ErrCode - log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "resp: ", resp) - c.JSON(http.StatusOK, resp) -} - -// @Summary 获取用户所有会话 -// @Description 获取用户所有会话 -// @Tags 会话相关 -// @ID GetAllConversations -// @Accept json -// @Param token header string true "im token" -// @Param req body api.GetAllConversationsReq true "ownerUserID为要获取的用户ID" -// @Produce json -// @Success 0 {object} api.GetAllConversationsResp -// @Failure 500 {object} api.Swagger500Resp "errCode为500 一般为服务器内部错误" -// @Failure 400 {object} api.Swagger400Resp "errCode为400 一般为参数输入错误, token未带上等" -// @Router /msg/get_all_conversations [post] -func GetAllConversations(c *gin.Context) { - var ( - req api.GetAllConversationsReq - resp api.GetAllConversationsResp - reqPb pbUser.GetAllConversationsReq - ) - if err := c.BindJSON(&req); err != nil { - log.NewError(req.OperationID, utils.GetSelfFuncName(), "bind json failed", err.Error()) - c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": "bind json failed " + err.Error()}) - return - } - log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "req: ", req) - if err := utils.CopyStructFields(&reqPb, req); err != nil { - log.NewDebug(req.OperationID, utils.GetSelfFuncName(), "CopyStructFields failed", err.Error()) - } - etcdConn := rpc.GetDefaultConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImUserName, req.OperationID) - if etcdConn == nil { - errMsg := req.OperationID + "getcdv3.GetDefaultConn == nil" - log.NewError(req.OperationID, errMsg) - c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg}) - return - } - client := pbUser.NewUserClient(etcdConn) - respPb, err := client.GetAllConversations(context.Background(), &reqPb) - if err != nil { - log.NewError(req.OperationID, utils.GetSelfFuncName(), "SetConversation rpc failed, ", reqPb.String(), err.Error()) - c.JSON(http.StatusBadRequest, gin.H{"errCode": 500, "errMsg": "GetAllConversationMsgOpt rpc failed, " + err.Error()}) - return - } - resp.ErrMsg = respPb.CommonResp.ErrMsg - resp.ErrCode = respPb.CommonResp.ErrCode - if err := utils.CopyStructFields(&resp.Conversations, respPb.Conversations); err != nil { - log.NewDebug(req.OperationID, utils.GetSelfFuncName(), "CopyStructFields failed, ", err.Error()) - } - log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "resp: ", resp) - c.JSON(http.StatusOK, resp) -} - -// @Summary 根据会话ID获取会话 -// @Description 根据会话ID获取会话 -// @Tags 会话相关 -// @ID GetConversation -// @Accept json -// @Param token header string true "im token" -// @Param req body api.GetConversationReq true "ownerUserID为要获取的用户ID
conversationID为要获取的会话ID" -// @Produce json -// @Success 0 {object} api.GetConversationResp -// @Failure 500 {object} api.Swagger500Resp "errCode为500 一般为服务器内部错误" -// @Failure 400 {object} api.Swagger400Resp "errCode为400 一般为参数输入错误, token未带上等" -// @Router /msg/get_conversation [post] -func GetConversation(c *gin.Context) { - var ( - req api.GetConversationReq - resp api.GetConversationResp - reqPb pbUser.GetConversationReq - ) - if err := c.BindJSON(&req); err != nil { - log.NewError(req.OperationID, utils.GetSelfFuncName(), "bind json failed", err.Error()) - c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": "bind json failed " + err.Error()}) - return - } - log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "req: ", req) - if err := utils.CopyStructFields(&reqPb, req); err != nil { - log.NewDebug(req.OperationID, utils.GetSelfFuncName(), "CopyStructFields failed", err.Error()) - } - etcdConn := rpc.GetDefaultConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImUserName, req.OperationID) - if etcdConn == nil { - errMsg := req.OperationID + "getcdv3.GetDefaultConn == nil" - log.NewError(req.OperationID, errMsg) - c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg}) - return - } - client := pbUser.NewUserClient(etcdConn) - respPb, err := client.GetConversation(context.Background(), &reqPb) - if err != nil { - log.NewError(req.OperationID, utils.GetSelfFuncName(), "GetConversation rpc failed, ", reqPb.String(), err.Error()) - c.JSON(http.StatusBadRequest, gin.H{"errCode": 500, "errMsg": "GetAllConversationMsgOpt rpc failed, " + err.Error()}) - return - } - resp.ErrMsg = respPb.CommonResp.ErrMsg - resp.ErrCode = respPb.CommonResp.ErrCode - if err := utils.CopyStructFields(&resp.Conversation, respPb.Conversation); err != nil { - log.NewDebug(req.OperationID, utils.GetSelfFuncName(), "CopyStructFields failed", err.Error()) - } - log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "resp: ", resp) - c.JSON(http.StatusOK, resp) -} - -// @Summary 根据会话ID列表获取会话 -// @Description 根据会话ID列表获取会话 -// @Tags 会话相关 -// @ID GetConversations -// @Accept json -// @Param token header string true "im token" -// @Param req body api.GetConversationsReq true "ownerUserID为要获取的用户ID
conversationIDs为要获取的会话ID列表" -// @Produce json -// @Success 0 {object} api.GetConversationsResp -// @Failure 500 {object} api.Swagger500Resp "errCode为500 一般为服务器内部错误" -// @Failure 400 {object} api.Swagger400Resp "errCode为400 一般为参数输入错误, token未带上等" -// @Router /msg/get_conversations [post] -func GetConversations(c *gin.Context) { - var ( - req api.GetConversationsReq - resp api.GetConversationsResp - reqPb pbUser.GetConversationsReq - ) - if err := c.BindJSON(&req); err != nil { - log.NewError(req.OperationID, utils.GetSelfFuncName(), "bind json failed", err.Error()) - c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": "bind json failed " + err.Error()}) - return - } - log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "req: ", req) - if err := utils.CopyStructFields(&reqPb, req); err != nil { - log.NewDebug(req.OperationID, utils.GetSelfFuncName(), "CopyStructFields failed", err.Error()) - } - etcdConn := rpc.GetDefaultConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImUserName, req.OperationID) - if etcdConn == nil { - errMsg := req.OperationID + "getcdv3.GetDefaultConn == nil" - log.NewError(req.OperationID, errMsg) - c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg}) - return - } - client := pbUser.NewUserClient(etcdConn) - respPb, err := client.GetConversations(context.Background(), &reqPb) - if err != nil { - log.NewError(req.OperationID, utils.GetSelfFuncName(), "SetConversation rpc failed, ", reqPb.String(), err.Error()) - c.JSON(http.StatusBadRequest, gin.H{"errCode": 500, "errMsg": "GetAllConversationMsgOpt rpc failed, " + err.Error()}) - return - } - resp.ErrMsg = respPb.CommonResp.ErrMsg - resp.ErrCode = respPb.CommonResp.ErrCode - if err := utils.CopyStructFields(&resp.Conversations, respPb.Conversations); err != nil { - log.NewDebug(req.OperationID, utils.GetSelfFuncName(), "CopyStructFields failed", err.Error()) - } - log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "resp: ", resp) - c.JSON(http.StatusOK, resp) -} - -func SetRecvMsgOpt(c *gin.Context) { - var ( - req api.SetRecvMsgOptReq - resp api.SetRecvMsgOptResp - reqPb pbUser.SetRecvMsgOptReq - ) - if err := c.BindJSON(&req); err != nil { - log.NewError(req.OperationID, utils.GetSelfFuncName(), "bind json failed", err.Error()) - c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": "bind json failed " + err.Error()}) - return - } - log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "req: ", req) - if err := utils.CopyStructFields(&reqPb, req); err != nil { - log.NewDebug(req.OperationID, utils.GetSelfFuncName(), "CopyStructFields failed", err.Error()) - } - etcdConn := rpc.GetDefaultConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImUserName, req.OperationID) - if etcdConn == nil { - errMsg := req.OperationID + "getcdv3.GetDefaultConn == nil" - log.NewError(req.OperationID, errMsg) - c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg}) - return - } - client := pbUser.NewUserClient(etcdConn) - respPb, err := client.SetRecvMsgOpt(context.Background(), &reqPb) - if err != nil { - log.NewError(req.OperationID, utils.GetSelfFuncName(), "SetRecvMsgOpt rpc failed, ", reqPb.String(), err.Error()) - c.JSON(http.StatusBadRequest, gin.H{"errCode": 500, "errMsg": "GetAllConversationMsgOpt rpc failed, " + err.Error()}) - return - } - resp.ErrMsg = respPb.CommonResp.ErrMsg - resp.ErrCode = respPb.CommonResp.ErrCode - log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "resp: ", resp) - c.JSON(http.StatusOK, resp) -} - -// Deprecated -func SetReceiveMessageOpt(c *gin.Context) { - -} - -// Deprecated -func GetReceiveMessageOpt(c *gin.Context) { - -} - -// Deprecated -func GetAllConversationMessageOpt(c *gin.Context) { - -} diff --git a/internal/api/friend.go b/internal/api/friend.go index 09b1db166..a717069f8 100644 --- a/internal/api/friend.go +++ b/internal/api/friend.go @@ -19,58 +19,58 @@ type Friend struct { zk *openKeeper.ZkClient } -func (f *Friend) getGroupClient() (friend.FriendClient, error) { - conn, err := f.zk.GetConn(config.Config.RpcRegisterName.OpenImGroupName) +func (o *Friend) client() (friend.FriendClient, error) { + conn, err := o.zk.GetConn(config.Config.RpcRegisterName.OpenImGroupName) if err != nil { return nil, err } return friend.NewFriendClient(conn), nil } -func (f *Friend) AddFriend(c *gin.Context) { - a2r.Call(friend.FriendClient.AddFriend, f.getGroupClient, c) +func (o *Friend) ApplyToAddFriend(c *gin.Context) { + a2r.Call(friend.FriendClient.ApplyToAddFriend, o.client, c) } -func (f *Friend) DeleteFriend(c *gin.Context) { - a2r.Call(friend.FriendClient.DeleteFriend, f.getGroupClient, c) +func (o *Friend) DeleteFriend(c *gin.Context) { + a2r.Call(friend.FriendClient.DeleteFriend, o.client, c) } -func (f *Friend) GetFriendApplyList(c *gin.Context) { - a2r.Call(friend.FriendClient.GetFriendApplyList, f.getGroupClient, c) +func (o *Friend) GetFriendApplyList(c *gin.Context) { + a2r.Call(friend.FriendClient.GetPaginationFriendsApplyFrom, o.client, c) } -func (f *Friend) GetSelfApplyList(c *gin.Context) { - a2r.Call(friend.FriendClient.GetSelfApplyList, f.getGroupClient, c) +func (o *Friend) GetSelfApplyList(c *gin.Context) { + a2r.Call(friend.FriendClient.GetPaginationFriendsApplyFrom, o.client, c) } -func (f *Friend) GetFriendList(c *gin.Context) { - a2r.Call(friend.FriendClient.GetFriendList, f.getGroupClient, c) +func (o *Friend) GetFriendList(c *gin.Context) { + a2r.Call(friend.FriendClient.GetDesignatedFriends, o.client, c) } -func (f *Friend) AddFriendResponse(c *gin.Context) { - a2r.Call(friend.FriendClient.AddFriendResponse, f.getGroupClient, c) +func (o *Friend) RespondFriendApply(c *gin.Context) { + a2r.Call(friend.FriendClient.RespondFriendApply, o.client, c) } -func (f *Friend) SetFriendRemark(c *gin.Context) { - a2r.Call(friend.FriendClient.SetFriendRemark, f.getGroupClient, c) +func (o *Friend) SetFriendRemark(c *gin.Context) { + a2r.Call(friend.FriendClient.SetFriendRemark, o.client, c) } -func (f *Friend) AddBlack(c *gin.Context) { - a2r.Call(friend.FriendClient.AddBlack, f.getGroupClient, c) +func (o *Friend) AddBlack(c *gin.Context) { + a2r.Call(friend.FriendClient.AddBlack, o.client, c) } -func (f *Friend) GetBlacklist(c *gin.Context) { - a2r.Call(friend.FriendClient.GetBlacklist, f.getGroupClient, c) +func (o *Friend) GetPaginationBlacks(c *gin.Context) { + a2r.Call(friend.FriendClient.GetPaginationBlacks, o.client, c) } -func (f *Friend) RemoveBlacklist(c *gin.Context) { - a2r.Call(friend.FriendClient.RemoveBlacklist, f.getGroupClient, c) +func (o *Friend) RemoveBlack(c *gin.Context) { + a2r.Call(friend.FriendClient.RemoveBlack, o.client, c) } -func (f *Friend) ImportFriend(c *gin.Context) { - a2r.Call(friend.FriendClient.ImportFriend, f.getGroupClient, c) +func (o *Friend) ImportFriends(c *gin.Context) { + a2r.Call(friend.FriendClient.ImportFriends, o.client, c) } -func (f *Friend) IsFriend(c *gin.Context) { - a2r.Call(friend.FriendClient.IsFriend, f.getGroupClient, c) +func (o *Friend) IsFriend(c *gin.Context) { + a2r.Call(friend.FriendClient.IsFriend, o.client, c) } diff --git a/internal/api/group.go b/internal/api/group.go index d7e481262..bd4e9bf56 100644 --- a/internal/api/group.go +++ b/internal/api/group.go @@ -19,106 +19,106 @@ type Group struct { zk *openKeeper.ZkClient } -func (g *Group) getGroupClient() (group.GroupClient, error) { - conn, err := g.zk.GetConn(config.Config.RpcRegisterName.OpenImGroupName) +func (o *Group) client() (group.GroupClient, error) { + conn, err := o.zk.GetConn(config.Config.RpcRegisterName.OpenImGroupName) if err != nil { return nil, err } return group.NewGroupClient(conn), nil } -func (g *Group) NewCreateGroup(c *gin.Context) { - a2r.Call(group.GroupClient.CreateGroup, g.getGroupClient, c) +func (o *Group) NewCreateGroup(c *gin.Context) { + a2r.Call(group.GroupClient.CreateGroup, o.client, c) } -func (g *Group) NewSetGroupInfo(c *gin.Context) { - a2r.Call(group.GroupClient.SetGroupInfo, g.getGroupClient, c) +func (o *Group) NewSetGroupInfo(c *gin.Context) { + a2r.Call(group.GroupClient.SetGroupInfo, o.client, c) } -func (g *Group) JoinGroup(c *gin.Context) { - a2r.Call(group.GroupClient.JoinGroup, g.getGroupClient, c) +func (o *Group) JoinGroup(c *gin.Context) { + a2r.Call(group.GroupClient.JoinGroup, o.client, c) } -func (g *Group) QuitGroup(c *gin.Context) { - a2r.Call(group.GroupClient.QuitGroup, g.getGroupClient, c) +func (o *Group) QuitGroup(c *gin.Context) { + a2r.Call(group.GroupClient.QuitGroup, o.client, c) } -func (g *Group) ApplicationGroupResponse(c *gin.Context) { - a2r.Call(group.GroupClient.GroupApplicationResponse, g.getGroupClient, c) +func (o *Group) ApplicationGroupResponse(c *gin.Context) { + a2r.Call(group.GroupClient.GroupApplicationResponse, o.client, c) } -func (g *Group) TransferGroupOwner(c *gin.Context) { - a2r.Call(group.GroupClient.TransferGroupOwner, g.getGroupClient, c) +func (o *Group) TransferGroupOwner(c *gin.Context) { + a2r.Call(group.GroupClient.TransferGroupOwner, o.client, c) } -func (g *Group) GetRecvGroupApplicationList(c *gin.Context) { - a2r.Call(group.GroupClient.GetGroupApplicationList, g.getGroupClient, c) +func (o *Group) GetRecvGroupApplicationList(c *gin.Context) { + a2r.Call(group.GroupClient.GetGroupApplicationList, o.client, c) } -func (g *Group) GetUserReqGroupApplicationList(c *gin.Context) { - a2r.Call(group.GroupClient.GetUserReqApplicationList, g.getGroupClient, c) +func (o *Group) GetUserReqGroupApplicationList(c *gin.Context) { + a2r.Call(group.GroupClient.GetUserReqApplicationList, o.client, c) } -func (g *Group) GetGroupsInfo(c *gin.Context) { - a2r.Call(group.GroupClient.GetGroupsInfo, g.getGroupClient, c) +func (o *Group) GetGroupsInfo(c *gin.Context) { + a2r.Call(group.GroupClient.GetGroupsInfo, o.client, c) } -func (g *Group) KickGroupMember(c *gin.Context) { - a2r.Call(group.GroupClient.KickGroupMember, g.getGroupClient, c) +func (o *Group) KickGroupMember(c *gin.Context) { + a2r.Call(group.GroupClient.KickGroupMember, o.client, c) } -func (g *Group) GetGroupMembersInfo(c *gin.Context) { - a2r.Call(group.GroupClient.GetGroupMembersInfo, g.getGroupClient, c) +func (o *Group) GetGroupMembersInfo(c *gin.Context) { + a2r.Call(group.GroupClient.GetGroupMembersInfo, o.client, c) } -func (g *Group) InviteUserToGroup(c *gin.Context) { - a2r.Call(group.GroupClient.InviteUserToGroup, g.getGroupClient, c) +func (o *Group) InviteUserToGroup(c *gin.Context) { + a2r.Call(group.GroupClient.InviteUserToGroup, o.client, c) } -func (g *Group) GetJoinedGroupList(c *gin.Context) { - a2r.Call(group.GroupClient.GetJoinedGroupList, g.getGroupClient, c) +func (o *Group) GetJoinedGroupList(c *gin.Context) { + a2r.Call(group.GroupClient.GetJoinedGroupList, o.client, c) } -func (g *Group) DismissGroup(c *gin.Context) { - a2r.Call(group.GroupClient.DismissGroup, g.getGroupClient, c) +func (o *Group) DismissGroup(c *gin.Context) { + a2r.Call(group.GroupClient.DismissGroup, o.client, c) } -func (g *Group) MuteGroupMember(c *gin.Context) { - a2r.Call(group.GroupClient.MuteGroupMember, g.getGroupClient, c) +func (o *Group) MuteGroupMember(c *gin.Context) { + a2r.Call(group.GroupClient.MuteGroupMember, o.client, c) } -func (g *Group) CancelMuteGroupMember(c *gin.Context) { - a2r.Call(group.GroupClient.CancelMuteGroupMember, g.getGroupClient, c) +func (o *Group) CancelMuteGroupMember(c *gin.Context) { + a2r.Call(group.GroupClient.CancelMuteGroupMember, o.client, c) } -func (g *Group) MuteGroup(c *gin.Context) { - a2r.Call(group.GroupClient.MuteGroup, g.getGroupClient, c) +func (o *Group) MuteGroup(c *gin.Context) { + a2r.Call(group.GroupClient.MuteGroup, o.client, c) } -func (g *Group) CancelMuteGroup(c *gin.Context) { - a2r.Call(group.GroupClient.CancelMuteGroup, g.getGroupClient, c) +func (o *Group) CancelMuteGroup(c *gin.Context) { + a2r.Call(group.GroupClient.CancelMuteGroup, o.client, c) } -func (g *Group) SetGroupMemberInfo(c *gin.Context) { - a2r.Call(group.GroupClient.SetGroupMemberInfo, g.getGroupClient, c) +func (o *Group) SetGroupMemberInfo(c *gin.Context) { + a2r.Call(group.GroupClient.SetGroupMemberInfo, o.client, c) } -func (g *Group) GetGroupAbstractInfo(c *gin.Context) { - a2r.Call(group.GroupClient.GetGroupAbstractInfo, g.getGroupClient, c) +func (o *Group) GetGroupAbstractInfo(c *gin.Context) { + a2r.Call(group.GroupClient.GetGroupAbstractInfo, o.client, c) } //func (g *Group) SetGroupMemberNickname(c *gin.Context) { -// a2r.Call(group.GroupClient.SetGroupMemberNickname, g.getGroupClient, c) +// a2r.Call(group.GroupClient.SetGroupMemberNickname, g.client, c) //} // //func (g *Group) GetGroupAllMemberList(c *gin.Context) { -// a2r.Call(group.GroupClient.GetGroupAllMember, g.getGroupClient, c) +// a2r.Call(group.GroupClient.GetGroupAllMember, g.client, c) //} -func (g *Group) GetJoinedSuperGroupList(c *gin.Context) { - a2r.Call(group.GroupClient.GetJoinedSuperGroupList, g.getGroupClient, c) +func (o *Group) GetJoinedSuperGroupList(c *gin.Context) { + a2r.Call(group.GroupClient.GetJoinedSuperGroupList, o.client, c) } -func (g *Group) GetSuperGroupsInfo(c *gin.Context) { - a2r.Call(group.GroupClient.GetSuperGroupsInfo, g.getGroupClient, c) +func (o *Group) GetSuperGroupsInfo(c *gin.Context) { + a2r.Call(group.GroupClient.GetSuperGroupsInfo, o.client, c) } diff --git a/internal/api/msg.go b/internal/api/msg.go new file mode 100644 index 000000000..0cbb6e224 --- /dev/null +++ b/internal/api/msg.go @@ -0,0 +1,84 @@ +package api + +import ( + "OpenIM/internal/api/a2r" + "OpenIM/pkg/common/config" + "OpenIM/pkg/proto/msg" + "context" + "github.com/OpenIMSDK/openKeeper" + "github.com/gin-gonic/gin" +) + +var _ context.Context // 解决goland编辑器bug + +func NewMsg(zk *openKeeper.ZkClient) *Conversation { + return &Conversation{zk: zk} +} + +type Msg struct { + zk *openKeeper.ZkClient +} + +func (o *Msg) client() (msg.MsgClient, error) { + conn, err := o.zk.GetConn(config.Config.RpcRegisterName.OpenImMsgName) + if err != nil { + return nil, err + } + return msg.NewMsgClient(conn), nil +} + +func (o *Msg) GetSeq(c *gin.Context) { + a2r.Call(msg.MsgClient.GetSeq, o.client, c) +} + +func (o *Msg) SendMsg(c *gin.Context) { + a2r.Call(msg.MsgClient.SendMsg, o.client, c) +} + +func (o *Msg) PullMsgBySeqList(c *gin.Context) { + a2r.Call(msg.MsgClient.PullMsgBySeqList, o.client, c) +} + +func (o *Msg) DelMsg(c *gin.Context) { + a2r.Call(msg.MsgClient.DelMsg, o.client, c) +} + +func (o *Msg) DelSuperGroupMsg(c *gin.Context) { + a2r.Call(msg.MsgClient.DelSuperGroupMsg, o.client, c) +} + +func (o *Msg) ClearMsg(c *gin.Context) { + a2r.Call(msg.MsgClient.ClearMsg, o.client, c) +} + +func (o *Msg) SetMsgMinSeq(c *gin.Context) { + a2r.Call(msg.MsgClient.SetMsgMinSeq, o.client, c) +} + +func (o *Msg) SetMessageReactionExtensions(c *gin.Context) { + a2r.Call(msg.MsgClient.SetMessageReactionExtensions, o.client, c) +} + +func (o *Msg) GetMessageListReactionExtensions(c *gin.Context) { + a2r.Call(msg.MsgClient.GetMessageListReactionExtensions, o.client, c) +} + +func (o *Msg) AddMessageReactionExtensions(c *gin.Context) { + a2r.Call(msg.MsgClient.AddMessageReactionExtensions, o.client, c) +} + +func (o *Msg) DeleteMessageReactionExtensions(c *gin.Context) { + a2r.Call(msg.MsgClient.DeleteMessageReactionExtensions, o.client, c) +} + +func (o *Msg) ManagementSendMsg(c *gin.Context) { + a2r.Call(msg.MsgClient.ManagementSendMsg, o.client, c) +} + +func (o *Msg) ManagementBatchSendMsg(c *gin.Context) { + a2r.Call(msg.MsgClient.ManagementBatchSendMsg, o.client, c) +} + +func (o *Msg) CheckMsgIsSendSuccess(c *gin.Context) { + a2r.Call(msg.MsgClient.CheckMsgIsSendSuccess, o.client, c) +} diff --git a/internal/api/msg/del_msg.go b/internal/api/msg/del_msg.go deleted file mode 100644 index d2b0b44aa..000000000 --- a/internal/api/msg/del_msg.go +++ /dev/null @@ -1,273 +0,0 @@ -package msg - -import ( - api "OpenIM/pkg/apistruct" - "OpenIM/pkg/common/config" - "OpenIM/pkg/common/constant" - "OpenIM/pkg/common/log" - "OpenIM/pkg/common/tokenverify" - rpc "OpenIM/pkg/proto/msg" - pbCommon "OpenIM/pkg/proto/sdkws" - "OpenIM/pkg/utils" - "context" - "github.com/gin-gonic/gin" - "github.com/golang/protobuf/proto" - "net/http" - "strings" -) - -// @Summary 根据seq列表删除消息 -// @Description 根据seq列表删除消息 -// @Tags 消息相关 -// @ID DelMsg -// @Accept json -// @Param token header string true "im token" -// @Param req body api.DelMsgReq true "userID为要删除的用户ID
seqList为seq列表" -// @Produce json -// @Success 0 {object} api.DelMsgResp -// @Failure 500 {object} api.Swagger500Resp "errCode为500 一般为服务器内部错误" -// @Failure 400 {object} api.Swagger400Resp "errCode为400 一般为参数输入错误, token未带上等" -// @Router /msg/del_msg [post] -func DelMsg(c *gin.Context) { - var ( - req api.DelMsgReq - resp api.DelMsgResp - reqPb pbCommon.DelMsgListReq - ) - if err := c.BindJSON(&req); err != nil { - c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()}) - return - } - log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "req:", req) - if err := utils.CopyStructFields(&reqPb, &req); err != nil { - log.NewDebug(req.OperationID, utils.GetSelfFuncName(), "CopyStructFields", err.Error()) - } - - var ok bool - var errInfo string - ok, reqPb.OpUserID, errInfo = tokenverify.GetUserIDFromToken(c.Request.Header.Get("token"), req.OperationID) - if !ok { - errMsg := req.OperationID + " " + "GetUserIDFromToken failed " + errInfo + " token:" + c.Request.Header.Get("token") - log.NewError(req.OperationID, errMsg) - c.JSON(http.StatusBadRequest, gin.H{"errCode": 500, "errMsg": errMsg}) - return - } - - grpcConn := rpc.GetDefaultConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImMsgName, req.OperationID) - if grpcConn == nil { - errMsg := req.OperationID + " getcdv3.GetDefaultConn == nil" - log.NewError(req.OperationID, errMsg) - c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg}) - return - } - msgClient := rpc.NewMsgClient(grpcConn) - respPb, err := msgClient.DelMsgList(context.Background(), &reqPb) - if err != nil { - log.NewError(req.OperationID, utils.GetSelfFuncName(), "DelMsgList failed", err.Error(), reqPb) - c.JSON(http.StatusOK, gin.H{"errCode": constant.ErrServer.ErrCode, "errMsg": constant.ErrServer.ErrMsg + err.Error()}) - return - } - resp.ErrCode = respPb.ErrCode - resp.ErrMsg = respPb.ErrMsg - log.NewInfo(req.OperationID, utils.GetSelfFuncName(), resp) - c.JSON(http.StatusOK, resp) -} -func DelSuperGroupMsg(c *gin.Context) { - var ( - req api.DelSuperGroupMsgReq - resp api.DelSuperGroupMsgResp - ) - rpcReq := &rpc.DelSuperGroupMsgReq{} - if err := c.BindJSON(&req); err != nil { - log.NewError("", "args err:", err.Error()) - c.JSON(http.StatusOK, gin.H{"errCode": 400, "errMsg": err.Error()}) - return - } - utils.CopyStructFields(rpcReq, &req) - log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "req:", req) - var ok bool - var errInfo string - ok, rpcReq.OpUserID, errInfo = tokenverify.GetUserIDFromToken(c.Request.Header.Get("token"), req.OperationID) - if !ok { - errMsg := req.OperationID + " " + rpcReq.OpUserID + " " + "GetUserIDFromToken failed " + errInfo + " token:" + c.Request.Header.Get("token") - log.NewError(req.OperationID, errMsg) - c.JSON(http.StatusOK, gin.H{"errCode": 500, "errMsg": errMsg}) - return - } - options := make(map[string]bool, 5) - utils.SetSwitchFromOptions(options, constant.IsConversationUpdate, false) - utils.SetSwitchFromOptions(options, constant.IsSenderConversationUpdate, false) - utils.SetSwitchFromOptions(options, constant.IsUnreadCount, false) - utils.SetSwitchFromOptions(options, constant.IsOfflinePush, false) - pbData := rpc.SendMsgReq{ - OperationID: req.OperationID, - MsgData: &pbCommon.MsgData{ - SendID: req.UserID, - RecvID: req.UserID, - ClientMsgID: utils.GetMsgID(req.UserID), - SessionType: constant.SingleChatType, - MsgFrom: constant.SysMsgType, - ContentType: constant.MsgDeleteNotification, - // ForceList: params.ForceList, - CreateTime: utils.GetCurrentTimestampByMill(), - Options: options, - }, - } - var tips pbCommon.TipsComm - deleteMsg := api.MsgDeleteNotificationElem{ - GroupID: req.GroupID, - IsAllDelete: req.IsAllDelete, - SeqList: req.SeqList, - } - tips.JsonDetail = utils.StructToJsonString(deleteMsg) - var err error - pbData.MsgData.Content, err = proto.Marshal(&tips) - if err != nil { - log.Error(req.OperationID, "Marshal failed ", err.Error(), tips.String()) - resp.ErrCode = 400 - resp.ErrMsg = err.Error() - log.NewInfo(req.OperationID, utils.GetSelfFuncName(), resp) - c.JSON(http.StatusOK, resp) - } - log.Info(req.OperationID, "", "api DelSuperGroupMsg call start..., [data: %s]", pbData.String()) - etcdConn := rpc.GetDefaultConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImMsgName, req.OperationID) - if etcdConn == nil { - errMsg := req.OperationID + "getcdv3.GetDefaultConn == nil" - log.NewError(req.OperationID, errMsg) - c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg}) - return - } - client := rpc.NewMsgClient(etcdConn) - - log.Info(req.OperationID, "", "api DelSuperGroupMsg call, api call rpc...") - if req.IsAllDelete { - RpcResp, err := client.DelSuperGroupMsg(context.Background(), rpcReq) - if err != nil { - log.NewError(req.OperationID, "call delete DelSuperGroupMsg rpc server failed", err.Error()) - c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "call DelSuperGroupMsg rpc server failed"}) - return - } - log.Info(req.OperationID, "", "api DelSuperGroupMsg call end..., [data: %s] [reply: %s]", pbData.String(), RpcResp.String()) - resp.ErrCode = RpcResp.ErrCode - resp.ErrMsg = RpcResp.ErrMsg - log.NewInfo(req.OperationID, utils.GetSelfFuncName(), resp) - c.JSON(http.StatusOK, resp) - } else { - RpcResp, err := client.SendMsg(context.Background(), &pbData) - if err != nil { - log.NewError(req.OperationID, "call delete UserSendMsg rpc server failed", err.Error()) - c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "call UserSendMsg rpc server failed"}) - return - } - log.Info(req.OperationID, "", "api DelSuperGroupMsg call end..., [data: %s] [reply: %s]", pbData.String(), RpcResp.String()) - resp.ErrCode = RpcResp.ErrCode - resp.ErrMsg = RpcResp.ErrMsg - log.NewInfo(req.OperationID, utils.GetSelfFuncName(), resp) - c.JSON(http.StatusOK, resp) - } - -} - -// @Summary 清空用户消息 -// @Description 清空用户消息 -// @Tags 消息相关 -// @ID ClearMsg -// @Accept json -// @Param token header string true "im token" -// @Param req body api.CleanUpMsgReq true "userID为要清空的用户ID" -// @Produce json -// @Success 0 {object} api.CleanUpMsgResp -// @Failure 500 {object} api.Swagger500Resp "errCode为500 一般为服务器内部错误" -// @Failure 400 {object} api.Swagger400Resp "errCode为400 一般为参数输入错误, token未带上等" -// @Router /msg/clear_msg [post] -func ClearMsg(c *gin.Context) { - params := api.CleanUpMsgReq{} - if err := c.BindJSON(¶ms); err != nil { - log.NewError("0", "BindJSON failed ", err.Error()) - c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()}) - return - } - // - req := &rpc.ClearMsgReq{} - utils.CopyStructFields(req, ¶ms) - - var ok bool - var errInfo string - ok, req.OpUserID, errInfo = tokenverify.GetUserIDFromToken(c.Request.Header.Get("token"), req.OperationID) - if !ok { - errMsg := req.OperationID + " " + "GetUserIDFromToken failed " + errInfo + " token:" + c.Request.Header.Get("token") - log.NewError(req.OperationID, errMsg) - c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg}) - return - } - - log.NewInfo(req.OperationID, utils.GetSelfFuncName(), " api args ", req.String()) - - etcdConn := rpc.GetDefaultConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImMsgName, req.OperationID) - if etcdConn == nil { - errMsg := req.OperationID + " getcdv3.GetDefaultConn == nil" - log.NewError(req.OperationID, errMsg) - c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg}) - return - } - client := rpc.NewMsgClient(etcdConn) - RpcResp, err := client.ClearMsg(context.Background(), req) - if err != nil { - log.NewError(req.OperationID, " CleanUpMsg failed ", err.Error(), req.String(), RpcResp.ErrMsg) - c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": RpcResp.ErrMsg}) - return - } - - resp := api.CleanUpMsgResp{CommResp: api.CommResp{ErrCode: RpcResp.ErrCode, ErrMsg: RpcResp.ErrMsg}} - - log.NewInfo(req.OperationID, utils.GetSelfFuncName(), " api return ", resp) - c.JSON(http.StatusOK, resp) -} - -// @Summary 设置用户最小seq -// @Description 设置用户最小seq,以及用户相关读扩散群组最小seq -// @Tags 消息相关 -// @ID SetMsgMinSeq -// @Accept json -// @Param token header string true "im token" -func SetMsgMinSeq(c *gin.Context) { - params := api.SetMsgMinSeqReq{} - if err := c.BindJSON(¶ms); err != nil { - log.NewError("0", "BindJSON failed ", err.Error()) - c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()}) - return - } - // - req := &rpc.SetMsgMinSeqReq{} - utils.CopyStructFields(req, ¶ms) - - var ok bool - var errInfo string - ok, req.OpUserID, errInfo = tokenverify.GetUserIDFromToken(c.Request.Header.Get("token"), req.OperationID) - if !ok { - errMsg := req.OperationID + " " + "GetUserIDFromToken failed " + errInfo + " token:" + c.Request.Header.Get("token") - log.NewError(req.OperationID, errMsg) - c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg}) - return - } - log.NewInfo(req.OperationID, utils.GetSelfFuncName(), " api args ", req.String()) - etcdConn := rpc.GetDefaultConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImMsgName, req.OperationID) - if etcdConn == nil { - errMsg := req.OperationID + " getcdv3.GetDefaultConn == nil" - log.NewError(req.OperationID, errMsg) - c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg}) - return - } - client := rpc.NewMsgClient(etcdConn) - RpcResp, err := client.SetMsgMinSeq(context.Background(), req) - if err != nil { - log.NewError(req.OperationID, " SetMsgMinSeq failed ", err.Error(), req.String(), RpcResp.ErrMsg) - c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": RpcResp.ErrMsg}) - return - } - - resp := api.SetMsgMinSeqResp{CommResp: api.CommResp{ErrCode: RpcResp.ErrCode, ErrMsg: RpcResp.ErrMsg}} - - log.NewInfo(req.OperationID, utils.GetSelfFuncName(), " api return ", resp) - c.JSON(http.StatusOK, resp) -} diff --git a/internal/api/msg/extend_msg.go b/internal/api/msg/extend_msg.go deleted file mode 100644 index a6b1318f3..000000000 --- a/internal/api/msg/extend_msg.go +++ /dev/null @@ -1,202 +0,0 @@ -package msg - -import ( - api "OpenIM/pkg/apistruct" - "OpenIM/pkg/common/config" - "OpenIM/pkg/common/constant" - "OpenIM/pkg/common/log" - "OpenIM/pkg/common/tokenverify" - rpc "OpenIM/pkg/proto/msg" - "OpenIM/pkg/utils" - "context" - "github.com/gin-gonic/gin" - "net/http" - "strings" -) - -func SetMessageReactionExtensions(c *gin.Context) { - var ( - req api.SetMessageReactionExtensionsCallbackReq - resp api.SetMessageReactionExtensionsCallbackResp - reqPb rpc.SetMessageReactionExtensionsReq - ) - - if err := c.BindJSON(&req); err != nil { - c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()}) - return - } - log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "req:", req) - - if err := utils.CopyStructFields(&reqPb, &req); err != nil { - log.NewDebug(req.OperationID, utils.GetSelfFuncName(), "CopyStructFields", err.Error()) - } - var ok bool - var errInfo string - ok, reqPb.OpUserID, errInfo = tokenverify.GetUserIDFromToken(c.Request.Header.Get("token"), req.OperationID) - if !ok { - errMsg := req.OperationID + " " + "GetUserIDFromToken failed " + errInfo + " token:" + c.Request.Header.Get("token") - log.NewError(req.OperationID, errMsg) - c.JSON(http.StatusBadRequest, gin.H{"errCode": 500, "errMsg": errMsg}) - return - } - - grpcConn := rpc.GetDefaultConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImMsgName, req.OperationID) - if grpcConn == nil { - errMsg := req.OperationID + " getcdv3.GetDefaultConn == nil" - log.NewError(req.OperationID, errMsg) - c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg}) - return - } - msgClient := rpc.NewMsgClient(grpcConn) - respPb, err := msgClient.SetMessageReactionExtensions(context.Background(), &reqPb) - if err != nil { - log.NewError(req.OperationID, utils.GetSelfFuncName(), "DelMsgList failed", err.Error(), reqPb) - c.JSON(http.StatusInternalServerError, gin.H{"errCode": constant.ErrServer.ErrCode, "errMsg": constant.ErrServer.ErrMsg + err.Error()}) - return - } - resp.ErrCode = respPb.ErrCode - resp.ErrMsg = respPb.ErrMsg - resp.Data.ResultKeyValue = respPb.Result - resp.Data.MsgFirstModifyTime = reqPb.MsgFirstModifyTime - resp.Data.IsReact = reqPb.IsReact - log.NewInfo(req.OperationID, utils.GetSelfFuncName(), resp) - c.JSON(http.StatusOK, resp) - -} - -func GetMessageListReactionExtensions(c *gin.Context) { - var ( - req api.GetMessageListReactionExtensionsReq - resp api.GetMessageListReactionExtensionsResp - reqPb rpc.GetMessageListReactionExtensionsReq - ) - if err := c.BindJSON(&req); err != nil { - c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()}) - return - } - log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "req:", req) - - if err := utils.CopyStructFields(&reqPb, &req); err != nil { - log.NewDebug(req.OperationID, utils.GetSelfFuncName(), "CopyStructFields", err.Error()) - } - var ok bool - var errInfo string - ok, reqPb.OpUserID, errInfo = tokenverify.GetUserIDFromToken(c.Request.Header.Get("token"), req.OperationID) - if !ok { - errMsg := req.OperationID + " " + "GetUserIDFromToken failed " + errInfo + " token:" + c.Request.Header.Get("token") - log.NewError(req.OperationID, errMsg) - c.JSON(http.StatusBadRequest, gin.H{"errCode": 500, "errMsg": errMsg}) - return - } - - grpcConn := rpc.GetDefaultConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImMsgName, req.OperationID) - if grpcConn == nil { - errMsg := req.OperationID + " getcdv3.GetDefaultConn == nil" - log.NewError(req.OperationID, errMsg) - c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg}) - return - } - msgClient := rpc.NewMsgClient(grpcConn) - respPb, err := msgClient.GetMessageListReactionExtensions(context.Background(), &reqPb) - if err != nil { - log.NewError(req.OperationID, utils.GetSelfFuncName(), "DelMsgList failed", err.Error(), reqPb) - c.JSON(http.StatusInternalServerError, gin.H{"errCode": constant.ErrServer.ErrCode, "errMsg": constant.ErrServer.ErrMsg + err.Error()}) - return - } - resp.ErrCode = respPb.ErrCode - resp.ErrMsg = respPb.ErrMsg - resp.Data = respPb.SingleMessageResult - log.NewInfo(req.OperationID, utils.GetSelfFuncName(), resp) - c.JSON(http.StatusOK, resp) -} - -func AddMessageReactionExtensions(c *gin.Context) { - var ( - req api.AddMessageReactionExtensionsReq - resp api.AddMessageReactionExtensionsResp - reqPb rpc.ModifyMessageReactionExtensionsReq - ) - if err := c.BindJSON(&req); err != nil { - c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()}) - return - } - log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "req:", req) - - if err := utils.CopyStructFields(&reqPb, &req); err != nil { - log.NewDebug(req.OperationID, utils.GetSelfFuncName(), "CopyStructFields", err.Error()) - } - var ok bool - var errInfo string - ok, reqPb.OpUserID, errInfo = tokenverify.GetUserIDFromToken(c.Request.Header.Get("token"), req.OperationID) - if !ok { - errMsg := req.OperationID + " " + "GetUserIDFromToken failed " + errInfo + " token:" + c.Request.Header.Get("token") - log.NewError(req.OperationID, errMsg) - c.JSON(http.StatusBadRequest, gin.H{"errCode": 500, "errMsg": errMsg}) - return - } - - grpcConn := rpc.GetDefaultConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImMsgName, req.OperationID) - if grpcConn == nil { - errMsg := req.OperationID + " getcdv3.GetDefaultConn == nil" - log.NewError(req.OperationID, errMsg) - c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg}) - return - } - msgClient := rpc.NewMsgClient(grpcConn) - respPb, err := msgClient.AddMessageReactionExtensions(context.Background(), &reqPb) - if err != nil { - log.NewError(req.OperationID, utils.GetSelfFuncName(), "DelMsgList failed", err.Error(), reqPb) - c.JSON(http.StatusInternalServerError, gin.H{"errCode": constant.ErrServer.ErrCode, "errMsg": constant.ErrServer.ErrMsg + err.Error()}) - return - } - resp.ErrCode = respPb.ErrCode - resp.ErrMsg = respPb.ErrMsg - log.NewInfo(req.OperationID, utils.GetSelfFuncName(), resp) - c.JSON(http.StatusOK, resp) -} - -func DeleteMessageReactionExtensions(c *gin.Context) { - var ( - req api.DeleteMessageReactionExtensionsReq - resp api.DeleteMessageReactionExtensionsResp - reqPb rpc.DeleteMessageListReactionExtensionsReq - ) - if err := c.BindJSON(&req); err != nil { - c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()}) - return - } - log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "req:", req) - - if err := utils.CopyStructFields(&reqPb, &req); err != nil { - log.NewDebug(req.OperationID, utils.GetSelfFuncName(), "CopyStructFields", err.Error()) - } - var ok bool - var errInfo string - ok, reqPb.OpUserID, errInfo = tokenverify.GetUserIDFromToken(c.Request.Header.Get("token"), req.OperationID) - if !ok { - errMsg := req.OperationID + " " + "GetUserIDFromToken failed " + errInfo + " token:" + c.Request.Header.Get("token") - log.NewError(req.OperationID, errMsg) - c.JSON(http.StatusBadRequest, gin.H{"errCode": 500, "errMsg": errMsg}) - return - } - - grpcConn := rpc.GetDefaultConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImMsgName, req.OperationID) - if grpcConn == nil { - errMsg := req.OperationID + " getcdv3.GetDefaultConn == nil" - log.NewError(req.OperationID, errMsg) - c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg}) - return - } - msgClient := rpc.NewMsgClient(grpcConn) - respPb, err := msgClient.DeleteMessageReactionExtensions(context.Background(), &reqPb) - if err != nil { - log.NewError(req.OperationID, utils.GetSelfFuncName(), "DelMsgList failed", err.Error(), reqPb) - c.JSON(http.StatusInternalServerError, gin.H{"errCode": constant.ErrServer.ErrCode, "errMsg": constant.ErrServer.ErrMsg + err.Error()}) - return - } - resp.ErrCode = respPb.ErrCode - resp.ErrMsg = respPb.ErrMsg - resp.Data = respPb.Result - log.NewInfo(req.OperationID, utils.GetSelfFuncName(), resp) - c.JSON(http.StatusOK, resp) -} diff --git a/internal/api/msg/get_max_min_seq.go b/internal/api/msg/get_max_min_seq.go deleted file mode 100644 index 8b7780129..000000000 --- a/internal/api/msg/get_max_min_seq.go +++ /dev/null @@ -1,64 +0,0 @@ -package msg - -import ( - "OpenIM/pkg/common/config" - "OpenIM/pkg/common/log" - "OpenIM/pkg/common/tokenverify" - pbChat "OpenIM/pkg/proto/msg" - sdkws "OpenIM/pkg/proto/sdkws" - "context" - "github.com/gin-gonic/gin" - "net/http" - "strings" -) - -type paramsUserNewestSeq struct { - ReqIdentifier int `json:"reqIdentifier" binding:"required"` - SendID string `json:"sendID" binding:"required"` - OperationID string `json:"operationID" binding:"required"` - MsgIncr int `json:"msgIncr" binding:"required"` -} - -func GetSeq(c *gin.Context) { - params := paramsUserNewestSeq{} - if err := c.BindJSON(¶ms); err != nil { - c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()}) - return - } - - token := c.Request.Header.Get("token") - if ok, err := tokenverify.VerifyToken(token, params.SendID); !ok { - c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": "token validate err" + err.Error()}) - return - } - pbData := sdkws.GetMaxAndMinSeqReq{} - pbData.UserID = params.SendID - pbData.OperationID = params.OperationID - grpcConn := rpc.GetDefaultConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImMsgName, pbData.OperationID) - if grpcConn == nil { - errMsg := pbData.OperationID + " getcdv3.GetDefaultConn == nil" - log.NewError(pbData.OperationID, errMsg) - c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg}) - return - } - - msgClient := pbChat.NewMsgClient(grpcConn) - reply, err := msgClient.GetMaxAndMinSeq(context.Background(), &pbData) - if err != nil { - log.NewError(params.OperationID, "UserGetSeq rpc failed, ", params, err.Error()) - c.JSON(http.StatusBadRequest, gin.H{"errCode": 401, "errMsg": "UserGetSeq rpc failed, " + err.Error()}) - return - } - - c.JSON(http.StatusOK, gin.H{ - "errCode": reply.ErrCode, - "errMsg": reply.ErrMsg, - "msgIncr": params.MsgIncr, - "reqIdentifier": params.ReqIdentifier, - "data": gin.H{ - "maxSeq": reply.MaxSeq, - "minSeq": reply.MinSeq, - }, - }) - -} diff --git a/internal/api/msg/pull_msg.go b/internal/api/msg/pull_msg.go deleted file mode 100644 index 5893855da..000000000 --- a/internal/api/msg/pull_msg.go +++ /dev/null @@ -1,73 +0,0 @@ -package msg - -import ( - "OpenIM/pkg/common/config" - "OpenIM/pkg/common/log" - "OpenIM/pkg/common/tokenverify" - "OpenIM/pkg/proto/msg" - sdkws "OpenIM/pkg/proto/sdkws" - "OpenIM/pkg/utils" - "context" - "github.com/gin-gonic/gin" - "net/http" - "strings" -) - -type paramsUserPullMsg struct { - ReqIdentifier *int `json:"reqIdentifier" binding:"required"` - SendID string `json:"sendID" binding:"required"` - OperationID string `json:"operationID" binding:"required"` - Data struct { - SeqBegin *int64 `json:"seqBegin" binding:"required"` - SeqEnd *int64 `json:"seqEnd" binding:"required"` - } -} - -type paramsUserPullMsgBySeqList struct { - ReqIdentifier int `json:"reqIdentifier" binding:"required"` - SendID string `json:"sendID" binding:"required"` - OperationID string `json:"operationID" binding:"required"` - SeqList []uint32 `json:"seqList"` -} - -func PullMsgBySeqList(c *gin.Context) { - params := paramsUserPullMsgBySeqList{} - if err := c.BindJSON(¶ms); err != nil { - c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()}) - return - } - - token := c.Request.Header.Get("token") - if ok, err := tokenverify.VerifyToken(token, params.SendID); !ok { - if err != nil { - log.NewError(params.OperationID, utils.GetSelfFuncName(), err.Error(), token, params.SendID) - } - c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": "token validate err"}) - return - } - pbData := sdkws.PullMessageBySeqListReq{} - pbData.UserID = params.SendID - pbData.OperationID = params.OperationID - pbData.SeqList = params.SeqList - - grpcConn := rpc.GetDefaultConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImMsgName, pbData.OperationID) - if grpcConn == nil { - errMsg := pbData.OperationID + "getcdv3.GetDefaultConn == nil" - log.NewError(pbData.OperationID, errMsg) - c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg}) - return - } - msgClient := msg.NewMsgClient(grpcConn) - reply, err := msgClient.PullMessageBySeqList(context.Background(), &pbData) - if err != nil { - log.Error(pbData.OperationID, "PullMessageBySeqList error", err.Error()) - return - } - log.NewInfo(pbData.OperationID, "rpc call success to PullMessageBySeqList", reply.String(), len(reply.List)) - c.JSON(http.StatusOK, gin.H{ - "errCode": reply.ErrCode, - "errMsg": reply.ErrMsg, - "reqIdentifier": params.ReqIdentifier, - "data": reply.List, - }) -} diff --git a/internal/api/msg/send_msg.go b/internal/api/msg/send_msg.go deleted file mode 100644 index a7a558097..000000000 --- a/internal/api/msg/send_msg.go +++ /dev/null @@ -1,102 +0,0 @@ -package msg - -import ( - "OpenIM/pkg/common/config" - "OpenIM/pkg/common/log" - pbChat "OpenIM/pkg/proto/msg" - sdkws "OpenIM/pkg/proto/sdkws" - "context" - - "github.com/gin-gonic/gin" - "net/http" - "strings" -) - -type paramsUserSendMsg struct { - SenderPlatformID int32 `json:"senderPlatformID" binding:"required"` - SendID string `json:"sendID" binding:"required"` - SenderNickName string `json:"senderNickName"` - SenderFaceURL string `json:"senderFaceUrl"` - OperationID string `json:"operationID" binding:"required"` - Data struct { - SessionType int32 `json:"sessionType" binding:"required"` - MsgFrom int32 `json:"msgFrom" binding:"required"` - ContentType int32 `json:"contentType" binding:"required"` - RecvID string `json:"recvID" ` - GroupID string `json:"groupID" ` - ForceList []string `json:"forceList"` - Content []byte `json:"content" binding:"required"` - Options map[string]bool `json:"options" ` - ClientMsgID string `json:"clientMsgID" binding:"required"` - CreateTime int64 `json:"createTime" binding:"required"` - OffLineInfo *sdkws.OfflinePushInfo `json:"offlineInfo" ` - } -} - -func newUserSendMsgReq(token string, params *paramsUserSendMsg) *pbChat.SendMsgReq { - pbData := pbChat.SendMsgReq{ - Token: token, - OperationID: params.OperationID, - MsgData: &sdkws.MsgData{ - SendID: params.SendID, - RecvID: params.Data.RecvID, - GroupID: params.Data.GroupID, - ClientMsgID: params.Data.ClientMsgID, - SenderPlatformID: params.SenderPlatformID, - SenderNickname: params.SenderNickName, - SenderFaceURL: params.SenderFaceURL, - SessionType: params.Data.SessionType, - MsgFrom: params.Data.MsgFrom, - ContentType: params.Data.ContentType, - Content: params.Data.Content, - CreateTime: params.Data.CreateTime, - Options: params.Data.Options, - OfflinePushInfo: params.Data.OffLineInfo, - }, - } - return &pbData -} - -func SendMsg(c *gin.Context) { - params := paramsUserSendMsg{} - if err := c.BindJSON(¶ms); err != nil { - c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()}) - log.Error("0", "BindJSON failed ", err.Error()) - return - } - - token := c.Request.Header.Get("token") - log.NewInfo(params.OperationID, "api call success to sendMsgReq", params) - pbData := newUserSendMsgReq(token, ¶ms) - log.Info(params.OperationID, "", "api SendMsg call start..., [data: %s]", pbData.String()) - - etcdConn := rpc.GetDefaultConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImMsgName, params.OperationID) - if etcdConn == nil { - errMsg := params.OperationID + "getcdv3.GetDefaultConn == nil" - log.NewError(params.OperationID, errMsg) - c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg}) - return - } - client := pbChat.NewMsgClient(etcdConn) - - log.Info(params.OperationID, "", "api SendMsg call, api call rpc...") - - reply, err := client.SendMsg(context.Background(), pbData) - if err != nil { - log.NewError(params.OperationID, "SendMsg rpc failed, ", params, err.Error()) - c.JSON(http.StatusBadRequest, gin.H{"errCode": 401, "errMsg": "SendMsg rpc failed, " + err.Error()}) - return - } - log.Info(params.OperationID, "", "api SendMsg call end..., [data: %s] [reply: %s]", pbData.String(), reply.String()) - - c.JSON(http.StatusOK, gin.H{ - "errCode": reply.ErrCode, - "errMsg": reply.ErrMsg, - "data": gin.H{ - "clientMsgID": reply.ClientMsgID, - "serverMsgID": reply.ServerMsgID, - "sendTime": reply.SendTime, - }, - }) - -} diff --git a/internal/api/route.go b/internal/api/route.go index a9bd9d626..b28f69cc2 100644 --- a/internal/api/route.go +++ b/internal/api/route.go @@ -1,14 +1,13 @@ package api import ( - "OpenIM/internal/api/conversation" "OpenIM/internal/api/manage" "OpenIM/internal/api/msg" - "OpenIM/internal/api/third" "OpenIM/pkg/common/config" "OpenIM/pkg/common/log" "OpenIM/pkg/common/middleware" "OpenIM/pkg/common/prome" + "github.com/OpenIMSDK/openKeeper" "github.com/gin-gonic/gin" "io" "os" @@ -31,9 +30,11 @@ func NewGinRouter() *gin.Engine { r.GET("/metrics", prome.PrometheusHandler()) } + var zk *openKeeper.ZkClient + userRouterGroup := r.Group("/user") { - u := NewUser(nil) + u := NewUser(zk) userRouterGroup.POST("/user_register", u.UserRegister) userRouterGroup.POST("/update_user_info", u.UpdateUserInfo) //1 userRouterGroup.POST("/set_global_msg_recv_opt", u.SetGlobalRecvMessageOpt) @@ -50,23 +51,23 @@ func NewGinRouter() *gin.Engine { ////friend routing group friendRouterGroup := r.Group("/friend") { - f := NewFriend(nil) - friendRouterGroup.POST("/add_friend", f.AddFriend) //1 + f := NewFriend(zk) + friendRouterGroup.POST("/add_friend", f.ApplyToAddFriend) //1 friendRouterGroup.POST("/delete_friend", f.DeleteFriend) //1 friendRouterGroup.POST("/get_friend_apply_list", f.GetFriendApplyList) //1 friendRouterGroup.POST("/get_self_friend_apply_list", f.GetSelfApplyList) //1 friendRouterGroup.POST("/get_friend_list", f.GetFriendList) //1 - friendRouterGroup.POST("/add_friend_response", f.AddFriendResponse) //1 + friendRouterGroup.POST("/add_friend_response", f.RespondFriendApply) //1 friendRouterGroup.POST("/set_friend_remark", f.SetFriendRemark) //1 friendRouterGroup.POST("/add_black", f.AddBlack) //1 - friendRouterGroup.POST("/get_black_list", f.GetBlacklist) //1 - friendRouterGroup.POST("/remove_black", f.RemoveBlacklist) //1 - friendRouterGroup.POST("/import_friend", f.ImportFriend) //1 + friendRouterGroup.POST("/get_black_list", f.GetPaginationBlacks) //1 + friendRouterGroup.POST("/remove_black", f.RemoveBlack) //1 + friendRouterGroup.POST("/import_friend", f.ImportFriends) //1 friendRouterGroup.POST("/is_friend", f.IsFriend) //1 } groupRouterGroup := r.Group("/group") - g := NewGroup(nil) + g := NewGroup(zk) { groupRouterGroup.POST("/create_group", g.NewCreateGroup) //1 groupRouterGroup.POST("/set_group_info", g.NewSetGroupInfo) //1 @@ -99,8 +100,8 @@ func NewGinRouter() *gin.Engine { ////certificate authRouterGroup := r.Group("/auth") { - a := NewAuth(nil) - u := NewUser(nil) + a := NewAuth(zk) + u := NewUser(zk) authRouterGroup.POST("/user_register", u.UserRegister) //1 authRouterGroup.POST("/user_token", a.UserToken) //1 authRouterGroup.POST("/parse_token", a.ParseToken) //1 @@ -109,17 +110,16 @@ func NewGinRouter() *gin.Engine { ////Third service thirdGroup := r.Group("/third") { - thirdGroup.POST("/tencent_cloud_storage_credential", third.TencentCloudStorageCredential) - thirdGroup.POST("/ali_oss_credential", third.AliOSSCredential) - thirdGroup.POST("/minio_storage_credential", third.MinioStorageCredential) - thirdGroup.POST("/minio_upload", third.MinioUploadFile) - thirdGroup.POST("/upload_update_app", third.UploadUpdateApp) - thirdGroup.POST("/get_download_url", third.GetDownloadURL) - thirdGroup.POST("/get_rtc_invitation_info", third.GetRTCInvitationInfo) - thirdGroup.POST("/get_rtc_invitation_start_app", third.GetRTCInvitationInfoStartApp) - thirdGroup.POST("/fcm_update_token", third.FcmUpdateToken) - thirdGroup.POST("/aws_storage_credential", third.AwsStorageCredential) - thirdGroup.POST("/set_app_badge", third.SetAppBadge) + t := NewThird(zk) + + thirdGroup.POST("/get_rtc_invitation_info", t.GetSignalInvitationInfo) + thirdGroup.POST("/get_rtc_invitation_start_app", t.GetSignalInvitationInfoStartApp) + thirdGroup.POST("/fcm_update_token", t.FcmUpdateToken) + thirdGroup.POST("/set_app_badge", t.SetAppBadge) + + thirdGroup.POST("/apply_put", t.ApplyPut) + thirdGroup.POST("/get_put", t.GetPut) + thirdGroup.POST("/confirm_put", t.ConfirmPut) } ////Message chatGroup := r.Group("/msg") @@ -143,13 +143,36 @@ func NewGinRouter() *gin.Engine { ////Conversation conversationGroup := r.Group("/conversation") { //1 - conversationGroup.POST("/get_all_conversations", conversation.GetAllConversations) - conversationGroup.POST("/get_conversation", conversation.GetConversation) - conversationGroup.POST("/get_conversations", conversation.GetConversations) - conversationGroup.POST("/set_conversation", conversation.SetConversation) - conversationGroup.POST("/batch_set_conversation", conversation.BatchSetConversations) - conversationGroup.POST("/set_recv_msg_opt", conversation.SetRecvMsgOpt) - conversationGroup.POST("/modify_conversation_field", conversation.ModifyConversationField) + c := NewConversation(zk) + conversationGroup.POST("/get_all_conversations", c.GetAllConversations) + conversationGroup.POST("/get_conversation", c.GetConversation) + conversationGroup.POST("/get_conversations", c.GetConversations) + conversationGroup.POST("/set_conversation", c.SetConversation) + conversationGroup.POST("/batch_set_conversation", c.BatchSetConversations) + conversationGroup.POST("/set_recv_msg_opt", c.SetRecvMsgOpt) + conversationGroup.POST("/modify_conversation_field", c.ModifyConversationField) } return r } + +/* + + { + GetSeq + SendMsg + PullMsgBySeqList + DelMsg + DelSuperGroupMsg + ClearMsg + SetMsgMinSeq + SetMessageReactionExtensions + GetMessageListReactionExtensions + AddMessageReactionExtensions + DeleteMessageReactionExtensions + ManagementSendMsg + ManagementBatchSendMsg + CheckMsgIsSendSuccess + } + + +*/ diff --git a/internal/api/third.go b/internal/api/third.go new file mode 100644 index 000000000..8d2c4d081 --- /dev/null +++ b/internal/api/third.go @@ -0,0 +1,56 @@ +package api + +import ( + "OpenIM/internal/api/a2r" + "OpenIM/pkg/common/config" + "OpenIM/pkg/proto/third" + "context" + "github.com/OpenIMSDK/openKeeper" + "github.com/gin-gonic/gin" +) + +var _ context.Context // 解决goland编辑器bug + +func NewThird(zk *openKeeper.ZkClient) *Third { + return &Third{zk: zk} +} + +type Third struct { + zk *openKeeper.ZkClient +} + +func (o *Third) client() (third.ThirdClient, error) { + conn, err := o.zk.GetConn(config.Config.RpcRegisterName.OpenImThirdName) + if err != nil { + return nil, err + } + return third.NewThirdClient(conn), nil +} + +func (o *Third) ApplyPut(c *gin.Context) { + a2r.Call(third.ThirdClient.ApplyPut, o.client, c) +} + +func (o *Third) GetPut(c *gin.Context) { + a2r.Call(third.ThirdClient.GetPut, o.client, c) +} + +func (o *Third) ConfirmPut(c *gin.Context) { + a2r.Call(third.ThirdClient.ConfirmPut, o.client, c) +} + +func (o *Third) GetSignalInvitationInfo(c *gin.Context) { + a2r.Call(third.ThirdClient.GetSignalInvitationInfo, o.client, c) +} + +func (o *Third) GetSignalInvitationInfoStartApp(c *gin.Context) { + a2r.Call(third.ThirdClient.GetSignalInvitationInfoStartApp, o.client, c) +} + +func (o *Third) FcmUpdateToken(c *gin.Context) { + a2r.Call(third.ThirdClient.FcmUpdateToken, o.client, c) +} + +func (o *Third) SetAppBadge(c *gin.Context) { + a2r.Call(third.ThirdClient.SetAppBadge, o.client, c) +} diff --git a/internal/api/third/ali_oss_credential.go b/internal/api/third/ali_oss_credential.go deleted file mode 100644 index af1af9460..000000000 --- a/internal/api/third/ali_oss_credential.go +++ /dev/null @@ -1,101 +0,0 @@ -package third - -import ( - api "OpenIM/pkg/apistruct" - "OpenIM/pkg/common/config" - "OpenIM/pkg/common/constant" - "OpenIM/pkg/common/log" - "OpenIM/pkg/common/tokenverify" - "fmt" - openapi "github.com/alibabacloud-go/darabonba-openapi/client" - sts20150401 "github.com/alibabacloud-go/sts-20150401/client" - "github.com/alibabacloud-go/tea/tea" - "github.com/fatih/structs" - - //"github.com/fatih/structs" - "github.com/gin-gonic/gin" - "net/http" - "time" -) - -var stsClient *sts20150401.Client - -/** - * 使用AK&SK初始化账号Client - * @param accessKeyId - * @param accessKeySecret - * @return Client - * @throws Exception - */ -func getStsClient() *sts20150401.Client { - if stsClient != nil { - return stsClient - } - conf := &openapi.Config{ - // 您的AccessKey ID - AccessKeyId: tea.String(config.Config.Credential.Ali.AccessKeyID), - // 您的AccessKey Secret - AccessKeySecret: tea.String(config.Config.Credential.Ali.AccessKeySecret), - // Endpoint - Endpoint: tea.String(config.Config.Credential.Ali.StsEndpoint), - } - result, err := sts20150401.NewClient(conf) - if err != nil { - log.NewError("", "alists client初始化失败 ", err) - } - stsClient = result - return stsClient -} - -func AliOSSCredential(c *gin.Context) { - req := api.OSSCredentialReq{} - if err := c.BindJSON(&req); err != nil { - log.NewError("0", "BindJSON failed ", err.Error()) - c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()}) - return - } - - var ok bool - var userID string - var errInfo string - ok, userID, errInfo = tokenverify.GetUserIDFromToken(c.Request.Header.Get("token"), req.OperationID) - if !ok { - errMsg := req.OperationID + " " + "GetUserIDFromToken failed " + errInfo + " token:" + c.Request.Header.Get("token") - log.NewError(req.OperationID, errMsg) - c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg}) - return - } - - log.NewInfo(req.OperationID, "AliOSSCredential args ", userID) - - stsResp, err := getStsClient().AssumeRole(&sts20150401.AssumeRoleRequest{ - DurationSeconds: tea.Int64(config.Config.Credential.Ali.StsDurationSeconds), - Policy: nil, - RoleArn: tea.String(config.Config.Credential.Ali.OssRoleArn), - RoleSessionName: tea.String(fmt.Sprintf("%s-%d", userID, time.Now().Unix())), - }) - - resp := api.OSSCredentialResp{} - if err != nil { - resp.ErrCode = constant.ErrTencentCredential.ErrCode - resp.ErrMsg = err.Error() - } else { - resp = api.OSSCredentialResp{ - CommResp: api.CommResp{}, - OssData: api.OSSCredentialRespData{ - Endpoint: config.Config.Credential.Ali.OssEndpoint, - AccessKeyId: *stsResp.Body.Credentials.AccessKeyId, - AccessKeySecret: *stsResp.Body.Credentials.AccessKeySecret, - Token: *stsResp.Body.Credentials.SecurityToken, - Bucket: config.Config.Credential.Ali.Bucket, - FinalHost: config.Config.Credential.Ali.FinalHost, - }, - Data: nil, - } - } - - resp.Data = structs.Map(&resp.OssData) - log.NewInfo(req.OperationID, "AliOSSCredential return ", resp) - - c.JSON(http.StatusOK, resp) -} diff --git a/internal/api/third/aws_storage_credential.go b/internal/api/third/aws_storage_credential.go deleted file mode 100644 index 5524dd37e..000000000 --- a/internal/api/third/aws_storage_credential.go +++ /dev/null @@ -1,76 +0,0 @@ -package third - -import ( - api "OpenIM/pkg/apistruct" - "OpenIM/pkg/common/config" - "OpenIM/pkg/common/constant" - "OpenIM/pkg/common/log" - "OpenIM/pkg/common/tokenverify" - "OpenIM/pkg/utils" - "context" - "net/http" - - "github.com/aws/aws-sdk-go-v2/aws" - awsConfig "github.com/aws/aws-sdk-go-v2/config" - "github.com/aws/aws-sdk-go-v2/credentials" - "github.com/aws/aws-sdk-go-v2/service/sts" - "github.com/gin-gonic/gin" -) - -func AwsStorageCredential(c *gin.Context) { - var ( - req api.AwsStorageCredentialReq - resp api.AwsStorageCredentialResp - ) - if err := c.BindJSON(&req); err != nil { - log.NewError("0", utils.GetSelfFuncName(), "BindJSON failed ", err.Error()) - c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()}) - return - } - log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "req: ", req) - var ok bool - var errInfo string - ok, _, errInfo = tokenverify.GetUserIDFromToken(c.Request.Header.Get("token"), req.OperationID) - if !ok { - errMsg := req.OperationID + " " + "GetUserIDFromToken failed " + errInfo + " token:" + c.Request.Header.Get("token") - log.NewError(req.OperationID, errMsg) - c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg}) - return - } - //原始帐号信息 - awsSourceConfig, err := awsConfig.LoadDefaultConfig(context.TODO(), awsConfig.WithRegion(config.Config.Credential.Aws.Region), - awsConfig.WithCredentialsProvider(credentials.StaticCredentialsProvider{ - Value: aws.Credentials{ - AccessKeyID: config.Config.Credential.Aws.AccessKeyID, - SecretAccessKey: config.Config.Credential.Aws.AccessKeySecret, - Source: "Open IM OSS", - }, - })) - if err != nil { - errMsg := req.OperationID + " " + "Init AWS S3 Credential failed " + err.Error() + " token:" + c.Request.Header.Get("token") - log.NewError(req.OperationID, errMsg) - c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg}) - return - } - //帐号转化 - awsStsClient := sts.NewFromConfig(awsSourceConfig) - StsRole, err := awsStsClient.AssumeRole(context.Background(), &sts.AssumeRoleInput{ - RoleArn: aws.String(config.Config.Credential.Aws.RoleArn), - DurationSeconds: aws.Int32(constant.AwsDurationTimes), - RoleSessionName: aws.String(config.Config.Credential.Aws.RoleSessionName), - ExternalId: aws.String(config.Config.Credential.Aws.ExternalId), - }) - if err != nil { - errMsg := req.OperationID + " " + "AWS S3 AssumeRole failed " + err.Error() + " token:" + c.Request.Header.Get("token") - log.NewError(req.OperationID, errMsg) - c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg}) - return - } - resp.CosData.AccessKeyId = string(*StsRole.Credentials.AccessKeyId) - resp.CosData.SecretAccessKey = string(*StsRole.Credentials.SecretAccessKey) - resp.CosData.SessionToken = string(*StsRole.Credentials.SessionToken) - resp.CosData.Bucket = config.Config.Credential.Aws.Bucket - resp.CosData.RegionID = config.Config.Credential.Aws.Region - resp.CosData.FinalHost = config.Config.Credential.Aws.FinalHost - c.JSON(http.StatusOK, gin.H{"errCode": 0, "errMsg": "", "data": resp}) -} diff --git a/internal/api/third/fcm_update_token.go b/internal/api/third/fcm_update_token.go deleted file mode 100644 index c777d15ec..000000000 --- a/internal/api/third/fcm_update_token.go +++ /dev/null @@ -1,48 +0,0 @@ -package third - -import ( - api "OpenIM/pkg/apistruct" - "OpenIM/pkg/common/log" - "OpenIM/pkg/common/tokenverify" - "OpenIM/pkg/utils" - "net/http" - - "github.com/gin-gonic/gin" -) - -func FcmUpdateToken(c *gin.Context) { - var ( - req api.FcmUpdateTokenReq - resp api.FcmUpdateTokenResp - ) - if err := c.Bind(&req); err != nil { - log.NewError("0", utils.GetSelfFuncName(), "BindJSON failed ", err.Error()) - c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()}) - return - } - log.NewInfo(req.OperationID, utils.GetSelfFuncName(), req) - - ok, UserId, errInfo := tokenverify.GetUserIDFromToken(c.Request.Header.Get("token"), req.OperationID) - if !ok { - errMsg := req.OperationID + " " + "GetUserIDFromToken failed " + errInfo + " token:" + c.Request.Header.Get("token") - log.NewError(req.OperationID, errMsg) - resp.ErrCode = 500 - resp.ErrMsg = errMsg - c.JSON(http.StatusInternalServerError, resp) - return - } - log.NewInfo(req.OperationID, utils.GetSelfFuncName(), req, UserId) - //逻辑处理开始 - err := db.DB.SetFcmToken(UserId, req.Platform, req.FcmToken, 0) - if err != nil { - errMsg := req.OperationID + " " + "SetFcmToken failed " + err.Error() + " token:" + c.Request.Header.Get("token") - log.NewError(req.OperationID, errMsg) - resp.ErrCode = 500 - resp.ErrMsg = errMsg - c.JSON(http.StatusInternalServerError, resp) - return - } - //逻辑处理完毕 - c.JSON(http.StatusOK, resp) - return -} diff --git a/internal/api/third/minio_init.go b/internal/api/third/minio_init.go deleted file mode 100644 index 95bdacd60..000000000 --- a/internal/api/third/minio_init.go +++ /dev/null @@ -1,101 +0,0 @@ -package third - -import ( - "OpenIM/pkg/common/config" - "OpenIM/pkg/common/log" - "OpenIM/pkg/utils" - "context" - "fmt" - "github.com/minio/minio-go/v7" - "github.com/minio/minio-go/v7/pkg/credentials" - url2 "net/url" -) - -var ( - MinioClient *minio.Client -) - -func MinioInit() { - operationID := utils.OperationIDGenerator() - log.NewInfo(operationID, utils.GetSelfFuncName(), "minio config: ", config.Config.Credential.Minio) - var initUrl string - if config.Config.Credential.Minio.EndpointInnerEnable { - initUrl = config.Config.Credential.Minio.EndpointInner - } else { - initUrl = config.Config.Credential.Minio.Endpoint - } - log.NewInfo(operationID, utils.GetSelfFuncName(), "use initUrl: ", initUrl) - minioUrl, err := url2.Parse(initUrl) - if err != nil { - log.NewError(operationID, utils.GetSelfFuncName(), "parse failed, please check config/config.yaml", err.Error()) - return - } - opts := &minio.Options{ - Creds: credentials.NewStaticV4(config.Config.Credential.Minio.AccessKeyID, config.Config.Credential.Minio.SecretAccessKey, ""), - //Region: config.Config.Credential.Minio.Location, - } - if minioUrl.Scheme == "http" { - opts.Secure = false - } else if minioUrl.Scheme == "https" { - opts.Secure = true - } - log.NewInfo(operationID, utils.GetSelfFuncName(), "Parse ok ", config.Config.Credential.Minio) - MinioClient, err = minio.New(minioUrl.Host, opts) - log.NewInfo(operationID, utils.GetSelfFuncName(), "new ok ", config.Config.Credential.Minio) - if err != nil { - log.NewError(operationID, utils.GetSelfFuncName(), "init minio client failed", err.Error()) - return - } - opt := minio.MakeBucketOptions{ - Region: config.Config.Credential.Minio.Location, - } - if config.Config.Credential.Minio.IsDistributedMod == true { - opt.ObjectLocking = true - } - err = MinioClient.MakeBucket(context.Background(), config.Config.Credential.Minio.Bucket, opt) - if err != nil { - log.NewInfo(operationID, utils.GetSelfFuncName(), "MakeBucket failed ", err.Error()) - exists, err := MinioClient.BucketExists(context.Background(), config.Config.Credential.Minio.Bucket) - if err == nil && exists { - log.NewInfo(operationID, utils.GetSelfFuncName(), "We already own ", config.Config.Credential.Minio.Bucket) - } else { - if err != nil { - log.NewInfo(operationID, utils.GetSelfFuncName(), err.Error()) - } - log.NewInfo(operationID, utils.GetSelfFuncName(), "create bucket failed and bucket not exists") - return - } - } - // make app bucket - err = MinioClient.MakeBucket(context.Background(), config.Config.Credential.Minio.AppBucket, opt) - if err != nil { - log.NewInfo(operationID, utils.GetSelfFuncName(), "MakeBucket failed ", err.Error()) - exists, err := MinioClient.BucketExists(context.Background(), config.Config.Credential.Minio.Bucket) - if err == nil && exists { - log.NewInfo(operationID, utils.GetSelfFuncName(), "We already own ", config.Config.Credential.Minio.Bucket) - } else { - if err != nil { - log.NewInfo(operationID, utils.GetSelfFuncName(), err.Error()) - } - log.NewInfo(operationID, utils.GetSelfFuncName(), "create bucket failed and bucket not exists") - return - } - } - policy, err := MinioClient.GetBucketPolicy(context.Background(), config.Config.Credential.Minio.Bucket) - log.NewInfo("", utils.GetSelfFuncName(), policy) - - // 自动化桶public的代码 - policyJsonString := fmt.Sprintf(`{"Version": "2012-10-17","Statement": [{"Action": ["s3:GetObject","s3:PutObject"], - "Effect": "Allow","Principal": {"AWS": ["*"]},"Resource": ["arn:aws:s3:::%s/*"],"Sid": ""}]}`, config.Config.Credential.Minio.Bucket) - err = MinioClient.SetBucketPolicy(context.Background(), config.Config.Credential.Minio.Bucket, policyJsonString) - if err != nil { - log.NewInfo("", utils.GetSelfFuncName(), "SetBucketPolicy failed please set in web", err.Error()) - } - policyJsonString = fmt.Sprintf(`{"Version": "2012-10-17","Statement": [{"Action": ["s3:GetObject","s3:PutObject"], - "Effect": "Allow","Principal": {"AWS": ["*"]},"Resource": ["arn:aws:s3:::%s/*"],"Sid": ""}]}`, config.Config.Credential.Minio.AppBucket) - err = MinioClient.SetBucketPolicy(context.Background(), config.Config.Credential.Minio.AppBucket, policyJsonString) - if err != nil { - log.NewInfo("", utils.GetSelfFuncName(), "SetBucketPolicy failed please set in web", err.Error()) - } - log.NewInfo(operationID, utils.GetSelfFuncName(), "minio create and set policy success") -} diff --git a/internal/api/third/minio_storage_credential.go b/internal/api/third/minio_storage_credential.go deleted file mode 100644 index 9a5cf1020..000000000 --- a/internal/api/third/minio_storage_credential.go +++ /dev/null @@ -1,276 +0,0 @@ -package third - -import ( - api "OpenIM/pkg/apistruct" - "OpenIM/pkg/common/config" - "OpenIM/pkg/common/constant" - "OpenIM/pkg/common/log" - "OpenIM/pkg/common/tokenverify" - _ "OpenIM/pkg/common/tokenverify" - "OpenIM/pkg/utils" - "context" - "github.com/gin-gonic/gin" - "github.com/minio/minio-go/v7" - _ "github.com/minio/minio-go/v7" - cr "github.com/minio/minio-go/v7/pkg/credentials" - "net/http" - "strconv" - "strings" -) - -// @Summary minio上传文件(web api) -// @Description minio上传文件(web api), 请注意本api请求为form并非json -// @Tags 第三方服务相关 -// @ID MinioUploadFile -// @Accept json -// @Param token header string true "im token" -// @Param file formData file true "要上传的文件文件" -// @Param fileType formData int true "文件类型" -// @Param operationID formData string true "操作唯一ID" -// @Produce json -// @Success 0 {object} api.MinioUploadFileResp "" -// @Failure 500 {object} api.Swagger500Resp "errCode为500 一般为服务器内部错误" -// @Failure 400 {object} api.Swagger400Resp "errCode为400 一般为参数输入错误, token未带上等" -// @Router /third/minio_upload [post] -func MinioUploadFile(c *gin.Context) { - var ( - req api.MinioUploadFileReq - resp api.MinioUploadFile - ) - defer func() { - if r := recover(); r != nil { - log.NewError(req.OperationID, utils.GetSelfFuncName(), r) - c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": "missing file or snapShot args"}) - return - } - }() - if err := c.Bind(&req); err != nil { - log.NewError("0", utils.GetSelfFuncName(), "BindJSON failed ", err.Error()) - c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()}) - return - } - log.NewInfo(req.OperationID, utils.GetSelfFuncName(), req) - var ok bool - var errInfo string - ok, _, errInfo = tokenverify.GetUserIDFromToken(c.Request.Header.Get("token"), req.OperationID) - if !ok { - errMsg := req.OperationID + " " + "GetUserIDFromToken failed " + errInfo + " token:" + c.Request.Header.Get("token") - log.NewError(req.OperationID, errMsg) - c.JSON(http.StatusBadRequest, gin.H{"errCode": 500, "errMsg": errMsg}) - return - } - - log.NewInfo(req.OperationID, utils.GetSelfFuncName(), req) - switch req.FileType { - // videoType upload snapShot - case constant.VideoType: - snapShotFile, err := c.FormFile("snapShot") - if err != nil { - c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": "missing snapshot arg: " + err.Error()}) - return - } - snapShotFileObj, err := snapShotFile.Open() - if err != nil { - log.NewError(req.OperationID, utils.GetSelfFuncName(), "Open file error", err.Error()) - c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()}) - return - } - snapShotNewName, snapShotNewType := utils.GetNewFileNameAndContentType(snapShotFile.Filename, constant.ImageType) - log.Debug(req.OperationID, utils.GetSelfFuncName(), snapShotNewName, snapShotNewType) - _, err = MinioClient.PutObject(context.Background(), config.Config.Credential.Minio.Bucket, snapShotNewName, snapShotFileObj, snapShotFile.Size, minio.PutObjectOptions{ContentType: snapShotNewType}) - if err != nil { - log.NewError(req.OperationID, utils.GetSelfFuncName(), "PutObject snapShotFile error", err.Error()) - c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()}) - return - } - resp.SnapshotURL = config.Config.Credential.Minio.Endpoint + "/" + config.Config.Credential.Minio.Bucket + "/" + snapShotNewName - resp.SnapshotNewName = snapShotNewName - } - file, err := c.FormFile("file") - if err != nil { - log.NewError(req.OperationID, utils.GetSelfFuncName(), "FormFile failed", err.Error()) - c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": "missing file arg: " + err.Error()}) - return - } - fileObj, err := file.Open() - if err != nil { - log.NewError(req.OperationID, utils.GetSelfFuncName(), "Open file error", err.Error()) - c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": "invalid file path" + err.Error()}) - return - } - newName, newType := utils.GetNewFileNameAndContentType(file.Filename, req.FileType) - log.Debug(req.OperationID, utils.GetSelfFuncName(), config.Config.Credential.Minio.Bucket, newName, fileObj, file.Size, newType, MinioClient.EndpointURL()) - _, err = MinioClient.PutObject(context.Background(), config.Config.Credential.Minio.Bucket, newName, fileObj, file.Size, minio.PutObjectOptions{ContentType: newType}) - if err != nil { - log.NewError(req.OperationID, utils.GetSelfFuncName(), "upload file error", err.Error()) - c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "upload file error" + err.Error()}) - return - } - resp.NewName = newName - resp.URL = config.Config.Credential.Minio.Endpoint + "/" + config.Config.Credential.Minio.Bucket + "/" + newName - log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "resp: ", resp) - c.JSON(http.StatusOK, gin.H{"errCode": 0, "errMsg": "", "data": resp}) - return -} - -func MinioStorageCredential(c *gin.Context) { - var ( - req api.MinioStorageCredentialReq - resp api.MiniostorageCredentialResp - ) - if err := c.BindJSON(&req); err != nil { - log.NewError("0", utils.GetSelfFuncName(), "BindJSON failed ", err.Error()) - c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()}) - return - } - log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "req: ", req) - var ok bool - var errInfo string - ok, _, errInfo = tokenverify.GetUserIDFromToken(c.Request.Header.Get("token"), req.OperationID) - if !ok { - errMsg := req.OperationID + " " + "GetUserIDFromToken failed " + errInfo + " token:" + c.Request.Header.Get("token") - log.NewError(req.OperationID, errMsg) - c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg}) - return - } - - var stsOpts cr.STSAssumeRoleOptions - stsOpts.AccessKey = config.Config.Credential.Minio.AccessKeyID - stsOpts.SecretKey = config.Config.Credential.Minio.SecretAccessKey - stsOpts.DurationSeconds = constant.MinioDurationTimes - var endpoint string - if config.Config.Credential.Minio.EndpointInnerEnable { - endpoint = config.Config.Credential.Minio.EndpointInner - } else { - endpoint = config.Config.Credential.Minio.Endpoint - } - li, err := cr.NewSTSAssumeRole(endpoint, stsOpts) - if err != nil { - log.NewError(req.OperationID, utils.GetSelfFuncName(), "NewSTSAssumeRole failed", err.Error(), stsOpts, config.Config.Credential.Minio.Endpoint) - c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()}) - return - } - v, err := li.Get() - if err != nil { - log.NewError(req.OperationID, utils.GetSelfFuncName(), "li.Get error", err.Error()) - c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()}) - return - } - resp.SessionToken = v.SessionToken - resp.SecretAccessKey = v.SecretAccessKey - resp.AccessKeyID = v.AccessKeyID - resp.BucketName = config.Config.Credential.Minio.Bucket - resp.StsEndpointURL = config.Config.Credential.Minio.Endpoint - resp.StorageTime = config.Config.Credential.Minio.StorageTime - resp.IsDistributedMod = config.Config.Credential.Minio.IsDistributedMod - c.JSON(http.StatusOK, gin.H{"errCode": 0, "errMsg": "", "data": resp}) -} - -func UploadUpdateApp(c *gin.Context) { - var ( - req api.UploadUpdateAppReq - resp api.UploadUpdateAppResp - ) - if err := c.Bind(&req); err != nil { - log.NewError(req.OperationID, utils.GetSelfFuncName(), "BindJSON failed ", err.Error()) - c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()}) - return - } - log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "req: ", req) - - var yamlName string - if req.Yaml == nil { - yamlName = "" - } else { - yamlName = req.Yaml.Filename - } - fileObj, err := req.File.Open() - if err != nil { - log.NewError(req.OperationID, utils.GetSelfFuncName(), "Open file error", err.Error()) - c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": "Open file error" + err.Error()}) - return - } - _, err = MinioClient.PutObject(context.Background(), config.Config.Credential.Minio.AppBucket, req.File.Filename, fileObj, req.File.Size, minio.PutObjectOptions{}) - if err != nil { - log.NewError(req.OperationID, utils.GetSelfFuncName(), "PutObject file error") - c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "PutObject file error" + err.Error()}) - return - } - if yamlName != "" { - yamlObj, err := req.Yaml.Open() - if err == nil { - _, err = MinioClient.PutObject(context.Background(), config.Config.Credential.Minio.AppBucket, yamlName, yamlObj, req.Yaml.Size, minio.PutObjectOptions{}) - if err != nil { - log.NewError(req.OperationID, utils.GetSelfFuncName(), "PutObject yaml error") - c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "PutObject yaml error" + err.Error()}) - return - } - } else { - log.NewError(req.OperationID, utils.GetSelfFuncName(), err.Error()) - } - } - if err := imdb.UpdateAppVersion(req.Type, req.Version, req.ForceUpdate, req.File.Filename, yamlName, req.UpdateLog); err != nil { - log.NewError(req.OperationID, utils.GetSelfFuncName(), "UpdateAppVersion error", err.Error()) - resp.ErrCode = http.StatusInternalServerError - resp.ErrMsg = err.Error() - c.JSON(http.StatusInternalServerError, resp) - return - } - log.NewInfo(req.OperationID, utils.GetSelfFuncName()) - c.JSON(http.StatusOK, resp) -} - -func version2Int(version string) (int, error) { - versions := strings.Split(version, ".") - s := strings.Join(versions, "") - versionInt, err := strconv.Atoi(s) - return versionInt, err -} - -func GetDownloadURL(c *gin.Context) { - var ( - req api.GetDownloadURLReq - resp api.GetDownloadURLResp - ) - defer func() { - log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "resp: ", resp) - }() - if err := c.Bind(&req); err != nil { - log.NewError("0", utils.GetSelfFuncName(), "BindJSON failed ", err.Error()) - c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()}) - return - } - log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "req: ", req) - app, err := imdb.GetNewestVersion(req.Type) - if err != nil { - log.NewError(req.OperationID, utils.GetSelfFuncName(), "getNewestVersion failed", err.Error()) - } - log.Debug(req.OperationID, utils.GetSelfFuncName(), "app: ", app) - if app != nil { - appVersion, err := version2Int(app.Version) - reqVersion, err := version2Int(req.Version) - if err != nil { - log.NewError(req.OperationID, utils.GetSelfFuncName(), err.Error(), "req version", req.Version, "app version", app.Version) - } - log.NewDebug(req.OperationID, utils.GetSelfFuncName(), "req version:", reqVersion, "app version:", appVersion) - if appVersion > reqVersion && app.Version != "" { - resp.Data.HasNewVersion = true - if app.ForceUpdate == true { - resp.Data.ForceUpdate = true - } - if app.YamlName != "" { - resp.Data.YamlURL = config.Config.Credential.Minio.Endpoint + "/" + config.Config.Credential.Minio.AppBucket + "/" + app.YamlName - } - resp.Data.FileURL = config.Config.Credential.Minio.Endpoint + "/" + config.Config.Credential.Minio.AppBucket + "/" + app.FileName - resp.Data.Version = app.Version - resp.Data.UpdateLog = app.UpdateLog - c.JSON(http.StatusOK, resp) - return - } else { - resp.Data.HasNewVersion = false - c.JSON(http.StatusOK, resp) - return - } - } - c.JSON(http.StatusBadRequest, gin.H{"errCode": 0, "errMsg": "not found app version"}) -} diff --git a/internal/api/third/rtc.go b/internal/api/third/rtc.go deleted file mode 100644 index 977841eb1..000000000 --- a/internal/api/third/rtc.go +++ /dev/null @@ -1,95 +0,0 @@ -package third - -import ( - api "OpenIM/pkg/apistruct" - "OpenIM/pkg/common/log" - "OpenIM/pkg/common/tokenverify" - "OpenIM/pkg/utils" - "github.com/gin-gonic/gin" - "net/http" -) - -func GetRTCInvitationInfo(c *gin.Context) { - var ( - req api.GetRTCInvitationInfoReq - resp api.GetRTCInvitationInfoResp - ) - if err := c.Bind(&req); err != nil { - log.NewError(req.OperationID, utils.GetSelfFuncName(), "BindJSON failed ", err.Error()) - c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()}) - return - } - log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "req: ", req) - ok, userID, errInfo := tokenverify.GetUserIDFromToken(c.Request.Header.Get("token"), req.OperationID) - if !ok { - errMsg := req.OperationID + " " + "GetUserIDFromToken failed " + errInfo + " token:" + c.Request.Header.Get("token") - log.NewError(req.OperationID, errMsg) - c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg}) - return - } - var err error - invitationInfo, err := db.DB.GetSignalInfoFromCacheByClientMsgID(req.ClientMsgID) - if err != nil { - log.NewError(req.OperationID, utils.GetSelfFuncName(), "GetSignalInfoFromCache", err.Error(), req) - c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": err.Error()}) - return - } - if err := db.DB.DelUserSignalList(userID); err != nil { - log.NewError(req.OperationID, utils.GetSelfFuncName(), "DelUserSignalList result:", err.Error()) - } - - resp.Data.OpUserID = invitationInfo.OpUserID - resp.Data.Invitation.RoomID = invitationInfo.Invitation.RoomID - resp.Data.Invitation.SessionType = invitationInfo.Invitation.SessionType - resp.Data.Invitation.GroupID = invitationInfo.Invitation.GroupID - resp.Data.Invitation.InviterUserID = invitationInfo.Invitation.InviterUserID - resp.Data.Invitation.InviteeUserIDList = invitationInfo.Invitation.InviteeUserIDList - resp.Data.Invitation.MediaType = invitationInfo.Invitation.MediaType - resp.Data.Invitation.Timeout = invitationInfo.Invitation.Timeout - resp.Data.Invitation.InitiateTime = invitationInfo.Invitation.InitiateTime - resp.Data.Invitation.PlatformID = invitationInfo.Invitation.PlatformID - resp.Data.Invitation.CustomData = invitationInfo.Invitation.CustomData - c.JSON(http.StatusOK, resp) -} - -func GetRTCInvitationInfoStartApp(c *gin.Context) { - var ( - req api.GetRTCInvitationInfoStartAppReq - resp api.GetRTCInvitationInfoStartAppResp - ) - if err := c.Bind(&req); err != nil { - log.NewError(req.OperationID, utils.GetSelfFuncName(), "BindJSON failed ", err.Error()) - c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()}) - return - } - log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "req: ", req) - var ok bool - var errInfo string - ok, userID, errInfo := tokenverify.GetUserIDFromToken(c.Request.Header.Get("token"), req.OperationID) - if !ok { - errMsg := req.OperationID + " " + "GetUserIDFromToken failed " + errInfo + " token:" + c.Request.Header.Get("token") - log.NewError(req.OperationID, errMsg) - c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg}) - return - } - - invitationInfo, err := db.DB.GetAvailableSignalInvitationInfo(userID) - if err != nil { - log.NewError(req.OperationID, utils.GetSelfFuncName(), "GetSignalInfoFromCache", err.Error(), req) - c.JSON(http.StatusOK, gin.H{"errCode": 0, "errMsg": err.Error(), "data": struct{}{}}) - return - } - resp.Data.OpUserID = invitationInfo.OpUserID - resp.Data.Invitation.RoomID = invitationInfo.Invitation.RoomID - resp.Data.Invitation.SessionType = invitationInfo.Invitation.SessionType - resp.Data.Invitation.GroupID = invitationInfo.Invitation.GroupID - resp.Data.Invitation.InviterUserID = invitationInfo.Invitation.InviterUserID - resp.Data.Invitation.InviteeUserIDList = invitationInfo.Invitation.InviteeUserIDList - resp.Data.Invitation.MediaType = invitationInfo.Invitation.MediaType - resp.Data.Invitation.Timeout = invitationInfo.Invitation.Timeout - resp.Data.Invitation.InitiateTime = invitationInfo.Invitation.InitiateTime - resp.Data.Invitation.PlatformID = invitationInfo.Invitation.PlatformID - resp.Data.Invitation.CustomData = invitationInfo.Invitation.CustomData - c.JSON(http.StatusOK, resp) - -} diff --git a/internal/api/third/set_app_badge.go b/internal/api/third/set_app_badge.go deleted file mode 100644 index 97df98a27..000000000 --- a/internal/api/third/set_app_badge.go +++ /dev/null @@ -1,49 +0,0 @@ -package third - -import ( - api "OpenIM/pkg/apistruct" - "OpenIM/pkg/common/log" - "OpenIM/pkg/common/tokenverify" - "OpenIM/pkg/utils" - "github.com/gin-gonic/gin" - "net/http" -) - -func SetAppBadge(c *gin.Context) { - var ( - req api.SetAppBadgeReq - resp api.SetAppBadgeResp - ) - if err := c.Bind(&req); err != nil { - log.NewError("0", utils.GetSelfFuncName(), "BindJSON failed ", err.Error()) - c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()}) - return - } - log.NewInfo(req.OperationID, utils.GetSelfFuncName(), req) - - var ok bool - var errInfo, opUserID string - ok, opUserID, errInfo = tokenverify.GetUserIDFromToken(c.Request.Header.Get("token"), req.OperationID) - if !ok { - errMsg := req.OperationID + " " + "GetUserIDFromToken failed " + errInfo + " token:" + c.Request.Header.Get("token") - log.NewError(req.OperationID, errMsg) - c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": errMsg}) - return - } - if !tokenverify.CheckAccess(c, opUserID, req.FromUserID) { - log.NewError(req.OperationID, "CheckAccess false ", opUserID, req.FromUserID) - c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": "no permission"}) - } - log.NewInfo(req.OperationID, utils.GetSelfFuncName(), req, opUserID) - err := db.DB.SetUserBadgeUnreadCountSum(req.FromUserID, int(req.AppUnreadCount)) - if err != nil { - errMsg := req.OperationID + " " + "SetUserBadgeUnreadCountSum failed " + err.Error() + " token:" + c.Request.Header.Get("token") - log.NewError(req.OperationID, errMsg) - resp.ErrCode = 500 - resp.ErrMsg = errMsg - c.JSON(http.StatusInternalServerError, resp) - return - } - c.JSON(http.StatusOK, resp) - return -} diff --git a/internal/api/third/tencent_cloud_storage_credential.go b/internal/api/third/tencent_cloud_storage_credential.go deleted file mode 100644 index bc17a6122..000000000 --- a/internal/api/third/tencent_cloud_storage_credential.go +++ /dev/null @@ -1,78 +0,0 @@ -package third - -import ( - api "OpenIM/pkg/apistruct" - "OpenIM/pkg/common/config" - "OpenIM/pkg/common/constant" - "OpenIM/pkg/common/log" - "OpenIM/pkg/common/tokenverify" - "github.com/fatih/structs" - - //"github.com/fatih/structs" - "github.com/gin-gonic/gin" - sts "github.com/tencentyun/qcloud-cos-sts-sdk/go" - "net/http" - "time" -) - -func TencentCloudStorageCredential(c *gin.Context) { - req := api.TencentCloudStorageCredentialReq{} - if err := c.BindJSON(&req); err != nil { - log.NewError("0", "BindJSON failed ", err.Error()) - c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()}) - return - } - - var ok bool - var userID string - var errInfo string - ok, userID, errInfo = tokenverify.GetUserIDFromToken(c.Request.Header.Get("token"), req.OperationID) - if !ok { - errMsg := req.OperationID + " " + "GetUserIDFromToken failed " + errInfo + " token:" + c.Request.Header.Get("token") - log.NewError(req.OperationID, errMsg) - c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": errMsg}) - return - } - - log.NewInfo(req.OperationID, "TencentCloudStorageCredential args ", userID) - - cli := sts.NewClient( - config.Config.Credential.Tencent.SecretID, - config.Config.Credential.Tencent.SecretKey, - nil, - ) - - opt := &sts.CredentialOptions{ - DurationSeconds: int64(time.Hour.Seconds()), - Region: config.Config.Credential.Tencent.Region, - Policy: &sts.CredentialPolicy{ - Statement: []sts.CredentialPolicyStatement{ - { - Action: []string{ - "name/cos:PostObject", - "name/cos:PutObject", - }, - Effect: "allow", - Resource: []string{ - "qcs::cos:" + config.Config.Credential.Tencent.Region + ":uid/" + config.Config.Credential.Tencent.AppID + ":" + config.Config.Credential.Tencent.Bucket + "/*", - }, - }, - }, - }, - } - res, err := cli.GetCredential(opt) - resp := api.TencentCloudStorageCredentialResp{} - if err != nil { - resp.ErrCode = constant.ErrTencentCredential.ErrCode - resp.ErrMsg = err.Error() - } else { - resp.CosData.Bucket = config.Config.Credential.Tencent.Bucket - resp.CosData.Region = config.Config.Credential.Tencent.Region - resp.CosData.CredentialResult = res - } - - resp.Data = structs.Map(&resp.CosData) - log.NewInfo(req.OperationID, "TencentCloudStorageCredential return ", resp) - - c.JSON(http.StatusOK, resp) -} diff --git a/internal/api/user.go b/internal/api/user.go index ab46df6da..0164e41b4 100644 --- a/internal/api/user.go +++ b/internal/api/user.go @@ -19,58 +19,54 @@ type User struct { zk *openKeeper.ZkClient } -func (u *User) getGroupClient() (user.UserClient, error) { - conn, err := u.zk.GetConn(config.Config.RpcRegisterName.OpenImGroupName) +func (o *User) client() (user.UserClient, error) { + conn, err := o.zk.GetConn(config.Config.RpcRegisterName.OpenImGroupName) if err != nil { return nil, err } return user.NewUserClient(conn), nil } -func (u *User) UserRegister(c *gin.Context) { - a2r.Call(user.UserClient.UserRegister, u.getGroupClient, c) +func (o *User) UpdateUserInfo(c *gin.Context) { + a2r.Call(user.UserClient.UpdateUserInfo, o.client, c) } -func (u *User) UpdateUserInfo(c *gin.Context) { - a2r.Call(user.UserClient.UpdateUserInfo, u.getGroupClient, c) +func (o *User) SetGlobalRecvMessageOpt(c *gin.Context) { + a2r.Call(user.UserClient.SetGlobalRecvMessageOpt, o.client, c) } -func (u *User) SetGlobalRecvMessageOpt(c *gin.Context) { - a2r.Call(user.UserClient.SetGlobalRecvMessageOpt, u.getGroupClient, c) +func (o *User) GetUsersPublicInfo(c *gin.Context) { + a2r.Call(user.UserClient.GetDesignateUsers, o.client, c) } -func (u *User) GetUsersPublicInfo(c *gin.Context) { - a2r.Call(user.UserClient.GetDesignateUsers, u.getGroupClient, c) +func (o *User) GetSelfUserInfo(c *gin.Context) { + a2r.Call(user.UserClient.GetSelfUserInfo, o.client, c) } -func (u *User) GetSelfUserInfo(c *gin.Context) { - a2r.Call(user.UserClient.GetSelfUserInfo, u.getGroupClient, c) +func (o *User) GetUsersOnlineStatus(c *gin.Context) { + a2r.Call(user.UserClient.GetUsersOnlineStatus, o.client, c) } -func (u *User) GetUsersOnlineStatus(c *gin.Context) { - a2r.Call(user.UserClient.GetUsersOnlineStatus, u.getGroupClient, c) +func (o *User) GetUsersInfoFromCache(c *gin.Context) { + a2r.Call(user.UserClient.GetUsersInfoFromCache, o.client, c) } -func (u *User) GetUsersInfoFromCache(c *gin.Context) { - a2r.Call(user.UserClient.GetUsersInfoFromCache, u.getGroupClient, c) +func (o *User) GetFriendIDListFromCache(c *gin.Context) { + a2r.Call(user.UserClient.GetFriendIDListFromCache, o.client, c) } -func (u *User) GetFriendIDListFromCache(c *gin.Context) { - a2r.Call(user.UserClient.GetFriendIDListFromCache, u.getGroupClient, c) -} - -func (u *User) GetBlackIDListFromCache(c *gin.Context) { - a2r.Call(user.UserClient.GetBlackIDListFromCache, u.getGroupClient, c) +func (o *User) GetBlackIDListFromCache(c *gin.Context) { + a2r.Call(user.UserClient.GetBlackIDListFromCache, o.client, c) } //func (u *User) GetAllUsersUid(c *gin.Context) { -// a2r.Call(user.UserClient.GetAllUsersUid, u.getGroupClient, c) +// a2r.Call(user.UserClient.GetAllUsersUid, u.client, c) //} // //func (u *User) AccountCheck(c *gin.Context) { -// a2r.Call(user.UserClient.AccountCheck, u.getGroupClient, c) +// a2r.Call(user.UserClient.AccountCheck, u.client, c) //} -func (u *User) GetUsers(c *gin.Context) { - a2r.Call(user.UserClient.GetPaginationUsers, u.getGroupClient, c) +func (o *User) GetUsers(c *gin.Context) { + a2r.Call(user.UserClient.GetPaginationUsers, o.client, c) } diff --git a/internal/rpc/third/s3.go b/internal/rpc/third/s3.go index 687223e41..ca1e87cf8 100644 --- a/internal/rpc/third/s3.go +++ b/internal/rpc/third/s3.go @@ -1 +1,18 @@ package third + +import ( + "OpenIM/pkg/proto/third" + "context" +) + +func (t *thirdServer) ApplyPut(ctx context.Context, req *third.ApplyPutReq) (*third.ApplyPutResp, error) { + return t.s3dataBase.ApplyPut(ctx, req) +} + +func (t *thirdServer) GetPut(ctx context.Context, req *third.GetPutReq) (*third.GetPutResp, error) { + return t.s3dataBase.GetPut(ctx, req) +} + +func (t *thirdServer) ConfirmPut(ctx context.Context, req *third.ConfirmPutReq) (*third.ConfirmPutResp, error) { + return t.s3dataBase.ConfirmPut(ctx, req) +} diff --git a/internal/rpc/third/third.go b/internal/rpc/third/third.go index c290de5c4..7aa3cde94 100644 --- a/internal/rpc/third/third.go +++ b/internal/rpc/third/third.go @@ -4,9 +4,9 @@ import ( "OpenIM/internal/common/check" "OpenIM/pkg/common/db/cache" "OpenIM/pkg/common/db/controller" + "OpenIM/pkg/common/db/obj" "OpenIM/pkg/common/db/relation" - "OpenIM/pkg/common/db/tx" - "OpenIM/pkg/common/db/unrelation" + relationTb "OpenIM/pkg/common/db/table/relation" "OpenIM/pkg/proto/third" "context" "github.com/OpenIMSDK/openKeeper" @@ -18,20 +18,51 @@ func Start(client *openKeeper.ZkClient, server *grpc.Server) error { if err != nil { return err } + o, err := obj.NewMinioInterface() + if err != nil { + return err + } + db, err := relation.NewGormDB() + if err != nil { + return err + } + if err := db.AutoMigrate(&relationTb.ObjectHashModel{}, &relationTb.ObjectInfoModel{}, &relationTb.ObjectPutModel{}); err != nil { + return err + } third.RegisterThirdServer(server, &thirdServer{ - thirdDatabase: controller.NewThirdDatabase(cache.NewCacheModel(rdb)), + thirdDatabase: controller.NewThirdDatabase(cache.NewCache(rdb)), userCheck: check.NewUserCheck(client), + s3dataBase: controller.NewS3Database(o, relation.NewObjectHash(db), relation.NewObjectInfo(db), relation.NewObjectPut(db)), }) return nil } type thirdServer struct { thirdDatabase controller.ThirdDatabase + s3dataBase controller.S3Database userCheck *check.UserCheck } -func (t *thirdServer) ApplySpace(ctx context.Context, req *third.ApplySpaceReq) (resp *third.ApplySpaceResp, err error) { - return +func (t *thirdServer) GetSignalInvitationInfo(ctx context.Context, req *third.GetSignalInvitationInfoReq) (resp *third.GetSignalInvitationInfoResp, err error) { + signalReq, err := t.thirdDatabase.GetSignalInvitationInfoByClientMsgID(ctx, req.ClientMsgID) + if err != nil { + return nil, err + } + resp = &third.GetSignalInvitationInfoResp{} + resp.InvitationInfo = signalReq.Invitation + resp.OfflinePushInfo = signalReq.OfflinePushInfo + return resp, nil +} + +func (t *thirdServer) GetSignalInvitationInfoStartApp(ctx context.Context, req *third.GetSignalInvitationInfoStartAppReq) (resp *third.GetSignalInvitationInfoStartAppResp, err error) { + signalReq, err := t.thirdDatabase.GetAvailableSignalInvitationInfo(ctx, req.UserID) + if err != nil { + return nil, err + } + resp = &third.GetSignalInvitationInfoStartAppResp{} + resp.InvitationInfo = signalReq.Invitation + resp.OfflinePushInfo = signalReq.OfflinePushInfo + return resp, nil } func (t *thirdServer) FcmUpdateToken(ctx context.Context, req *third.FcmUpdateTokenReq) (resp *third.FcmUpdateTokenResp, err error) { diff --git a/pkg/common/config/config.go b/pkg/common/config/config.go index 678c8bcc8..76165666d 100644 --- a/pkg/common/config/config.go +++ b/pkg/common/config/config.go @@ -164,6 +164,7 @@ type config struct { OpenImConversationName string `yaml:"openImConversationName"` OpenImCacheName string `yaml:"openImCacheName"` OpenImRtcName string `yaml:"openImRtcName"` + OpenImThirdName string `yaml:"openImThirdName"` } Zookeeper struct { Schema string `yaml:"schema"` diff --git a/pkg/common/db/controller/s3.go b/pkg/common/db/controller/s3.go new file mode 100644 index 000000000..685a8b999 --- /dev/null +++ b/pkg/common/db/controller/s3.go @@ -0,0 +1,353 @@ +package controller + +import "C" +import ( + "OpenIM/pkg/common/db/obj" + "OpenIM/pkg/common/db/table/relation" + "OpenIM/pkg/proto/third" + "OpenIM/pkg/utils" + "context" + "crypto/md5" + "encoding/hex" + "errors" + "fmt" + "github.com/google/uuid" + "log" + "path" + "strconv" + "time" +) + +type S3Database interface { + ApplyPut(ctx context.Context, req *third.ApplyPutReq) (*third.ApplyPutResp, error) + GetPut(ctx context.Context, req *third.GetPutReq) (*third.GetPutResp, error) + ConfirmPut(ctx context.Context, req *third.ConfirmPutReq) (*third.ConfirmPutResp, error) +} + +func NewS3Database(obj obj.Interface, hash relation.ObjectHashModelInterface, info relation.ObjectInfoModelInterface, put relation.ObjectPutModelInterface) S3Database { + return &s3Database{ + obj: obj, + hash: hash, + info: info, + put: put, + } +} + +type s3Database struct { + obj obj.Interface + hash relation.ObjectHashModelInterface + info relation.ObjectInfoModelInterface + put relation.ObjectPutModelInterface +} + +// today 今天的日期 +func (c *s3Database) today() string { + return time.Now().Format("20060102") +} + +// fragmentName 根据序号生成文件名 +func (c *s3Database) fragmentName(index int) string { + return "fragment_" + strconv.Itoa(index+1) +} + +// getFragmentNum 获取分片大小和分片数量 +func (c *s3Database) getFragmentNum(fragmentSize int64, objectSize int64) (int64, int) { + if size := c.obj.MinFragmentSize(); fragmentSize < size { + fragmentSize = size + } + if fragmentSize <= 0 || objectSize <= fragmentSize { + return objectSize, 1 + } else { + num := int(objectSize / fragmentSize) + if objectSize%fragmentSize > 0 { + num++ + } + if n := c.obj.MaxFragmentNum(); num > n { + num = n + } + return fragmentSize, num + } +} + +func (c *s3Database) CheckHash(hash string) error { + val, err := hex.DecodeString(hash) + if err != nil { + return err + } + if len(val) != md5.Size { + return errors.New("hash value error") + } + return nil +} + +func (c *s3Database) urlName(name string) string { + if name[0] != '/' { + name = "/" + name + } + return "http://127.0.0.1:8080" + name +} + +func (c *s3Database) UUID() string { + return uuid.New().String() +} + +func (c *s3Database) HashName(hash string) string { + return path.Join("hash", hash) +} + +func (c *s3Database) isNotFound(err error) bool { + return false +} + +func (c *s3Database) ApplyPut(ctx context.Context, req *third.ApplyPutReq) (*third.ApplyPutResp, error) { + if err := c.CheckHash(req.Hash); err != nil { + return nil, err + } + if err := c.obj.CheckName(req.Name); err != nil { + return nil, err + } + if req.CleanTime != 0 && req.CleanTime <= time.Now().UnixMilli() { + return nil, errors.New("invalid CleanTime") + } + var expirationTime *time.Time + if req.CleanTime != 0 { + expirationTime = utils.ToPtr(time.UnixMilli(req.CleanTime)) + } + if hash, err := c.hash.Take(ctx, req.Hash, c.obj.Name()); err == nil { + o := relation.ObjectInfoModel{ + Name: req.Name, + Hash: hash.Hash, + ExpirationTime: expirationTime, + CreateTime: time.Now(), + } + if err := c.info.SetObject(ctx, &o); err != nil { + return nil, err + } + return &third.ApplyPutResp{Url: c.urlName(o.Name)}, nil // 服务器已存在 + } else if !c.isNotFound(err) { + return nil, err + } + // 新上传 + var pack int + const effective = time.Hour * 24 * 2 + req.FragmentSize, pack = c.getFragmentNum(req.FragmentSize, req.Size) + put := relation.ObjectPutModel{ + PutID: c.UUID(), + Hash: req.Hash, + Name: req.Name, + ObjectSize: req.Size, + FragmentSize: req.FragmentSize, + ExpirationTime: expirationTime, + EffectiveTime: time.Now().Add(effective), + } + put.Path = path.Join("upload", c.today(), req.Hash, put.PutID) + putURLs := make([]string, 0, pack) + for i := 0; i < pack; i++ { + url, err := c.obj.PresignedPutURL(ctx, &obj.ApplyPutArgs{ + Bucket: c.obj.TempBucket(), + Name: path.Join(put.Path, c.fragmentName(i)), + Effective: effective, + MaxObjectSize: req.FragmentSize, + }) + if err != nil { + return nil, err + } + putURLs = append(putURLs, url) + } + put.CreateTime = time.Now() + if err := c.put.Create(ctx, []*relation.ObjectPutModel{&put}); err != nil { + return nil, err + } + return &third.ApplyPutResp{ + PutID: put.PutID, + FragmentSize: put.FragmentSize, + PutURLs: putURLs, + }, nil +} + +func (c *s3Database) GetPut(ctx context.Context, req *third.GetPutReq) (*third.GetPutResp, error) { + up, err := c.put.Take(ctx, req.PutID) + if err != nil { + return nil, err + } + if up.Complete { + return nil, errors.New("up completed") + } + _, pack := c.getFragmentNum(up.FragmentSize, up.ObjectSize) + fragments := make([]*third.GetPutFragment, pack) + for i := 0; i < pack; i++ { + name := path.Join(up.Path, c.fragmentName(i)) + o, err := c.obj.GetObjectInfo(ctx, &obj.BucketObject{ + Bucket: c.obj.TempBucket(), + Name: name, + }) + if err != nil { + if c.obj.IsNotFound(err) { + fragments[i] = &third.GetPutFragment{} + continue + } + return nil, err + } + fragments[i] = &third.GetPutFragment{Size: o.Size, Hash: o.Hash} + } + var cleanTime int64 + if up.ExpirationTime != nil { + cleanTime = up.ExpirationTime.UnixMilli() + } + return &third.GetPutResp{ + FragmentSize: up.FragmentSize, + Size: up.ObjectSize, + Name: up.Name, + Hash: up.Hash, + Fragments: fragments, + CleanTime: cleanTime, + }, nil +} + +func (c *s3Database) ConfirmPut(ctx context.Context, req *third.ConfirmPutReq) (_ *third.ConfirmPutResp, _err error) { + up, err := c.put.Take(ctx, req.PutID) + if err != nil { + return nil, err + } + _, pack := c.getFragmentNum(up.FragmentSize, up.ObjectSize) + defer func() { + if _err == nil { + // 清理上传的碎片 + for i := 0; i < pack; i++ { + name := path.Join(up.Path, c.fragmentName(i)) + err := c.obj.DeleteObjet(ctx, &obj.BucketObject{ + Bucket: c.obj.TempBucket(), + Name: name, + }) + if err != nil { + log.Printf("delete fragment %d %s %s failed %s\n", i, c.obj.TempBucket(), name, err) + } + } + } + }() + if up.Complete { + return nil, errors.New("put completed") + } + now := time.Now().UnixMilli() + if up.EffectiveTime.UnixMilli() < now { + return nil, errors.New("upload expired") + } + if up.ExpirationTime != nil && up.ExpirationTime.UnixMilli() < now { + return nil, errors.New("object expired") + } + if hash, err := c.hash.Take(ctx, up.Hash, c.obj.Name()); err == nil { + o := relation.ObjectInfoModel{ + Name: up.Name, + Hash: hash.Hash, + ExpirationTime: up.ExpirationTime, + CreateTime: time.Now(), + } + if err := c.info.SetObject(ctx, &o); err != nil { + return nil, err + } + // 服务端已存在 + return &third.ConfirmPutResp{ + Url: c.urlName(o.Name), + }, nil + } else if c.isNotFound(err) { + return nil, err + } + src := make([]obj.BucketObject, pack) + for i := 0; i < pack; i++ { + name := path.Join(up.Path, c.fragmentName(i)) + o, err := c.obj.GetObjectInfo(ctx, &obj.BucketObject{ + Bucket: c.obj.TempBucket(), + Name: name, + }) + if err != nil { + return nil, err + } + if i+1 == pack { // 最后一个 + size := up.ObjectSize - up.FragmentSize*int64(i) + if size != o.Size { + return nil, fmt.Errorf("last fragment %d size %d not equal to %d hash %s", i, o.Size, size, o.Hash) + } + } else { + if o.Size != up.FragmentSize { + return nil, fmt.Errorf("fragment %d size %d not equal to %d hash %s", i, o.Size, up.FragmentSize, o.Hash) + } + } + src[i] = obj.BucketObject{ + Bucket: c.obj.TempBucket(), + Name: name, + } + } + dst := &obj.BucketObject{ + Bucket: c.obj.DataBucket(), + Name: c.HashName(up.Hash), + } + if len(src) == 1 { // 未分片直接触发copy + // 检查数据完整性,避免脏数据 + o, err := c.obj.GetObjectInfo(ctx, &src[0]) + if err != nil { + return nil, err + } + if up.ObjectSize != o.Size { + return nil, fmt.Errorf("size mismatching should %d reality %d", up.ObjectSize, o.Size) + } + if up.Hash != o.Hash { + return nil, fmt.Errorf("hash mismatching should %s reality %s", up.Hash, o.Hash) + } + if err := c.obj.CopyObjet(ctx, &src[0], dst); err != nil { + return nil, err + } + } else { + tempBucket := &obj.BucketObject{ + Bucket: c.obj.TempBucket(), + Name: path.Join("merge", c.today(), req.PutID, c.UUID()), + } + defer func() { // 清理合成的文件 + if err := c.obj.DeleteObjet(ctx, tempBucket); err != nil { + log.Printf("delete %s %s %s failed %s\n", c.obj.Name(), tempBucket.Bucket, tempBucket.Name, err) + } + }() + err := c.obj.ComposeObject(ctx, src, tempBucket) + if err != nil { + return nil, err + } + info, err := c.obj.GetObjectInfo(ctx, tempBucket) + if err != nil { + return nil, err + } + if up.ObjectSize != info.Size { + return nil, fmt.Errorf("size mismatch should %d reality %d", up.ObjectSize, info.Size) + } + if up.Hash != info.Hash { + return nil, fmt.Errorf("hash mismatch should %s reality %s", up.Hash, info.Hash) + } + if err := c.obj.CopyObjet(ctx, tempBucket, dst); err != nil { + return nil, err + } + } + o := &relation.ObjectInfoModel{ + Name: up.Name, + Hash: up.Hash, + ExpirationTime: up.ExpirationTime, + CreateTime: time.Now(), + } + h := &relation.ObjectHashModel{ + Hash: up.Hash, + Size: up.ObjectSize, + Engine: c.obj.Name(), + Bucket: c.obj.DataBucket(), + Name: c.HashName(up.Hash), + CreateTime: time.Now(), + } + if err := c.hash.Create(ctx, []*relation.ObjectHashModel{h}); err != nil { + return nil, err + } + if err := c.info.SetObject(ctx, o); err != nil { + return nil, err + } + if err := c.put.SetCompleted(ctx, up.PutID); err != nil { + log.Printf("set uploaded %s failed %s\n", up.PutID, err) + } + return &third.ConfirmPutResp{ + Url: c.urlName(o.Name), + }, nil +} diff --git a/pkg/common/db/obj/minio.go b/pkg/common/db/obj/minio.go new file mode 100644 index 000000000..0625a1734 --- /dev/null +++ b/pkg/common/db/obj/minio.go @@ -0,0 +1,183 @@ +package obj + +import ( + "context" + "errors" + "fmt" + "github.com/minio/minio-go/v7" + "github.com/minio/minio-go/v7/pkg/s3utils" + "net/http" + "time" +) + +func NewMinioClient() { + +} + +func NewMinioInterface() (Interface, error) { + //client, err := minio.New("127.0.0.1:9000", &minio.Options{ + // Creds: credentials.NewStaticV4("minioadmin", "minioadmin", ""), + // Secure: false, + //}) + + return &minioImpl{}, nil +} + +type minioImpl struct { + tempBucket string // 上传桶 + permanentBucket string // 永久桶 + clearBucket string // 自动清理桶 + urlstr string // 访问地址 + client *minio.Client +} + +//func (m *minioImpl) Init() error { +// client, err := minio.New("127.0.0.1:9000", &minio.Options{ +// Creds: credentials.NewStaticV4("minioadmin", "minioadmin", ""), +// Secure: false, +// }) +// if err != nil { +// return fmt.Errorf("minio client error: %w", err) +// } +// m.urlstr = "http://127.0.0.1:9000" +// m.client = client +// m.tempBucket = "temp" +// m.permanentBucket = "permanent" +// m.clearBucket = "clear" +// return nil +//} + +func (m *minioImpl) Name() string { + return "minio" +} + +func (m *minioImpl) MinFragmentSize() int64 { + return 1024 * 1024 * 5 // 每个分片最小大小 minio.absMinPartSize +} + +func (m *minioImpl) MaxFragmentNum() int { + return 1000 // 最大分片数量 minio.maxPartsCount +} + +func (m *minioImpl) MinExpirationTime() time.Duration { + return time.Hour * 24 +} + +func (m *minioImpl) AppendHeader() http.Header { + return map[string][]string{ + "x-amz-object-append": {"true"}, + } +} + +func (m *minioImpl) TempBucket() string { + return m.tempBucket +} + +func (m *minioImpl) DataBucket() string { + return m.permanentBucket +} + +func (m *minioImpl) ClearBucket() string { + return m.clearBucket +} + +func (m *minioImpl) GetURL(bucket string, name string) string { + return fmt.Sprintf("%s/%s/%s", m.urlstr, bucket, name) +} + +func (m *minioImpl) PresignedPutURL(ctx context.Context, args *ApplyPutArgs) (string, error) { + if args.Effective <= 0 { + return "", errors.New("EffectiveTime <= 0") + } + _, err := m.GetObjectInfo(ctx, &BucketObject{ + Bucket: m.tempBucket, + Name: args.Name, + }) + if err == nil { + return "", fmt.Errorf("minio bucket %s name %s already exists", args.Bucket, args.Name) + } else if !m.IsNotFound(err) { + return "", err + } + u, err := m.client.PresignedPutObject(ctx, m.tempBucket, args.Name, args.Effective) + if err != nil { + return "", fmt.Errorf("minio apply error: %w", err) + } + return u.String(), nil +} + +func (m *minioImpl) GetObjectInfo(ctx context.Context, args *BucketObject) (*ObjectInfo, error) { + info, err := m.client.StatObject(ctx, args.Bucket, args.Name, minio.StatObjectOptions{}) + if err != nil { + return nil, err + } + return &ObjectInfo{ + URL: m.GetURL(args.Bucket, args.Name), + Size: info.Size, + Hash: info.ETag, + }, nil +} + +func (m *minioImpl) CopyObjet(ctx context.Context, src *BucketObject, dst *BucketObject) error { + _, err := m.client.CopyObject(ctx, minio.CopyDestOptions{ + Bucket: dst.Bucket, + Object: dst.Name, + }, minio.CopySrcOptions{ + Bucket: src.Bucket, + Object: src.Name, + }) + return err +} + +func (m *minioImpl) DeleteObjet(ctx context.Context, info *BucketObject) error { + return m.client.RemoveObject(ctx, info.Bucket, info.Name, minio.RemoveObjectOptions{}) +} + +func (m *minioImpl) MoveObjetInfo(ctx context.Context, src *BucketObject, dst *BucketObject) error { + if err := m.CopyObjet(ctx, src, dst); err != nil { + return err + } + return m.DeleteObjet(ctx, src) +} + +func (m *minioImpl) ComposeObject(ctx context.Context, src []BucketObject, dst *BucketObject) error { + destOptions := minio.CopyDestOptions{ + Bucket: dst.Bucket, + Object: dst.Name + ".temp", + } + sources := make([]minio.CopySrcOptions, len(src)) + for i, s := range src { + sources[i] = minio.CopySrcOptions{ + Bucket: s.Bucket, + Object: s.Name, + } + } + _, err := m.client.ComposeObject(ctx, destOptions, sources...) + if err != nil { + return err + } + return m.MoveObjetInfo(ctx, &BucketObject{ + Bucket: destOptions.Bucket, + Name: destOptions.Object, + }, &BucketObject{ + Bucket: dst.Bucket, + Name: dst.Name, + }) +} + +func (m *minioImpl) IsNotFound(err error) bool { + if err == nil { + return false + } + switch e := err.(type) { + case minio.ErrorResponse: + return e.StatusCode == 404 && e.Code == "NoSuchKey" + case *minio.ErrorResponse: + return e.StatusCode == 404 && e.Code == "NoSuchKey" + default: + return false + } +} + +func (m *minioImpl) CheckName(name string) error { + return s3utils.CheckValidObjectName(name) +} diff --git a/pkg/common/db/obj/obj.go b/pkg/common/db/obj/obj.go new file mode 100644 index 000000000..5cfb2f9b5 --- /dev/null +++ b/pkg/common/db/obj/obj.go @@ -0,0 +1,58 @@ +package obj + +import ( + "context" + "net/http" + "time" +) + +type BucketObject struct { + Bucket string `json:"bucket"` + Name string `json:"name"` +} + +type ApplyPutArgs struct { + Bucket string + Name string + Effective time.Duration // 申请有效时间 + Header http.Header // header + MaxObjectSize int64 +} + +type ObjectInfo struct { + URL string + Size int64 + Hash string + Expiration time.Time +} + +type Interface interface { + // Name 存储名字 + Name() string + // MinFragmentSize 最小允许的分片大小 + MinFragmentSize() int64 + // MaxFragmentNum 最大允许的分片数量 + MaxFragmentNum() int + // MinExpirationTime 最小过期时间 + MinExpirationTime() time.Duration + // TempBucket 临时桶名,用于上传 + TempBucket() string + // DataBucket 永久存储的桶名 + DataBucket() string + // GetURL 通过桶名和对象名返回URL + GetURL(bucket string, name string) string + // PresignedPutURL 申请上传,返回PUT的上传地址 + PresignedPutURL(ctx context.Context, args *ApplyPutArgs) (string, error) + // GetObjectInfo 获取对象信息 + GetObjectInfo(ctx context.Context, args *BucketObject) (*ObjectInfo, error) + // CopyObjet 复制对象 + CopyObjet(ctx context.Context, src *BucketObject, dst *BucketObject) error + // DeleteObjet 删除对象 + DeleteObjet(ctx context.Context, info *BucketObject) error + // ComposeObject 合并对象 + ComposeObject(ctx context.Context, src []BucketObject, dst *BucketObject) error + // IsNotFound 判断是不是不存在导致的错误 + IsNotFound(err error) bool + // CheckName 检查名字是否可用 + CheckName(name string) error +} diff --git a/pkg/common/db/relation/object_hash_model.go b/pkg/common/db/relation/object_hash_model.go new file mode 100644 index 000000000..9f3d28200 --- /dev/null +++ b/pkg/common/db/relation/object_hash_model.go @@ -0,0 +1,40 @@ +package relation + +import ( + "OpenIM/pkg/common/db/table/relation" + "OpenIM/pkg/common/tracelog" + "OpenIM/pkg/utils" + "context" + "gorm.io/gorm" +) + +func NewObjectHash(db *gorm.DB) relation.ObjectHashModelInterface { + return &ObjectHashGorm{ + DB: db, + } +} + +type ObjectHashGorm struct { + DB *gorm.DB +} + +func (o *ObjectHashGorm) NewTx(tx any) relation.ObjectHashModelInterface { + return &ObjectHashGorm{ + DB: tx.(*gorm.DB), + } +} + +func (o *ObjectHashGorm) Take(ctx context.Context, hash string, engine string) (oh *relation.ObjectHashModel, err error) { + defer func() { + tracelog.SetCtxDebug(ctx, utils.GetFuncName(1), err, "hash", hash, "engine", engine, "objectHash", oh) + }() + oh = &relation.ObjectHashModel{} + return oh, utils.Wrap1(o.DB.Where("hash = ? and engine = ?", hash, engine).Take(oh).Error) +} + +func (o *ObjectHashGorm) Create(ctx context.Context, h []*relation.ObjectHashModel) (err error) { + defer func() { + tracelog.SetCtxDebug(ctx, utils.GetFuncName(1), err, "objectHash", h) + }() + return utils.Wrap1(o.DB.Create(h).Error) +} diff --git a/pkg/common/db/relation/object_info_model.go b/pkg/common/db/relation/object_info_model.go new file mode 100644 index 000000000..54b11ec8e --- /dev/null +++ b/pkg/common/db/relation/object_info_model.go @@ -0,0 +1,45 @@ +package relation + +import ( + "OpenIM/pkg/common/db/table/relation" + "OpenIM/pkg/common/tracelog" + "OpenIM/pkg/utils" + "context" + "gorm.io/gorm" +) + +func NewObjectInfo(db *gorm.DB) relation.ObjectInfoModelInterface { + return &ObjectInfoGorm{ + DB: db, + } +} + +type ObjectInfoGorm struct { + DB *gorm.DB +} + +func (o *ObjectInfoGorm) NewTx(tx any) relation.ObjectInfoModelInterface { + return &ObjectInfoGorm{ + DB: tx.(*gorm.DB), + } +} + +func (o *ObjectInfoGorm) SetObject(ctx context.Context, obj *relation.ObjectInfoModel) (err error) { + defer func() { + tracelog.SetCtxDebug(ctx, utils.GetFuncName(1), err, "objectInfo", obj) + }() + return utils.Wrap1(o.DB.Transaction(func(tx *gorm.DB) error { + if err := tx.Where("name = ?", obj.Name).Delete(&relation.ObjectInfoModel{}).Error; err != nil { + return err + } + return tx.Create(obj).Error + })) +} + +func (o *ObjectInfoGorm) Take(ctx context.Context, name string) (info *relation.ObjectInfoModel, err error) { + defer func() { + tracelog.SetCtxDebug(ctx, utils.GetFuncName(1), err, "name", name, "info", info) + }() + info = &relation.ObjectInfoModel{} + return info, utils.Wrap1(o.DB.Where("name = ?", name).Take(info).Error) +} diff --git a/pkg/common/db/relation/object_put_model.go b/pkg/common/db/relation/object_put_model.go new file mode 100644 index 000000000..818ee7e07 --- /dev/null +++ b/pkg/common/db/relation/object_put_model.go @@ -0,0 +1,47 @@ +package relation + +import ( + "OpenIM/pkg/common/db/table/relation" + "OpenIM/pkg/common/tracelog" + "OpenIM/pkg/utils" + "context" + "gorm.io/gorm" +) + +func NewObjectPut(db *gorm.DB) relation.ObjectPutModelInterface { + return &ObjectPutGorm{ + DB: db, + } +} + +type ObjectPutGorm struct { + DB *gorm.DB +} + +func (o *ObjectPutGorm) NewTx(tx any) relation.ObjectPutModelInterface { + return &ObjectPutGorm{ + DB: tx.(*gorm.DB), + } +} + +func (o *ObjectPutGorm) Create(ctx context.Context, m []*relation.ObjectPutModel) (err error) { + defer func() { + tracelog.SetCtxDebug(ctx, utils.GetFuncName(1), err, "objectPut", m) + }() + return utils.Wrap1(o.DB.Create(m).Error) +} + +func (o *ObjectPutGorm) Take(ctx context.Context, putID string) (put *relation.ObjectPutModel, err error) { + defer func() { + tracelog.SetCtxDebug(ctx, utils.GetFuncName(1), err, "putID", putID, "put", put) + }() + put = &relation.ObjectPutModel{} + return put, utils.Wrap1(o.DB.Where("put_id = ?", putID).Take(put).Error) +} + +func (o *ObjectPutGorm) SetCompleted(ctx context.Context, putID string) (err error) { + defer func() { + tracelog.SetCtxDebug(ctx, utils.GetFuncName(1), err, "putID", putID) + }() + return utils.Wrap1(o.DB.Model(&relation.ObjectPutModel{}).Where("put_id = ?", putID).Update("complete", true).Error) +} diff --git a/pkg/common/db/table/relation/object_hash.go b/pkg/common/db/table/relation/object_hash.go new file mode 100644 index 000000000..f3d161697 --- /dev/null +++ b/pkg/common/db/table/relation/object_hash.go @@ -0,0 +1,29 @@ +package relation + +import ( + "context" + "time" +) + +const ( + ObjectHashModelTableName = "object_hash" +) + +type ObjectHashModel struct { + Hash string `gorm:"column:hash;primary_key;size:32"` + Engine string `gorm:"column:engine;primary_key;size:16"` + Size int64 `gorm:"column:size"` + Bucket string `gorm:"column:bucket"` + Name string `gorm:"column:name"` + CreateTime time.Time `gorm:"column:create_time"` +} + +func (ObjectHashModel) TableName() string { + return ObjectHashModelTableName +} + +type ObjectHashModelInterface interface { + NewTx(tx any) ObjectHashModelInterface + Take(ctx context.Context, hash string, engine string) (*ObjectHashModel, error) + Create(ctx context.Context, h []*ObjectHashModel) error +} diff --git a/pkg/common/db/table/relation/object_info.go b/pkg/common/db/table/relation/object_info.go new file mode 100644 index 000000000..e96996ef3 --- /dev/null +++ b/pkg/common/db/table/relation/object_info.go @@ -0,0 +1,27 @@ +package relation + +import ( + "context" + "time" +) + +const ( + ObjectInfoModelTableName = "object_info" +) + +type ObjectInfoModel struct { + Name string `gorm:"column:name;primary_key"` + Hash string `gorm:"column:hash"` + ExpirationTime *time.Time `gorm:"column:expiration_time"` + CreateTime time.Time `gorm:"column:create_time"` +} + +func (ObjectInfoModel) TableName() string { + return ObjectInfoModelTableName +} + +type ObjectInfoModelInterface interface { + NewTx(tx any) ObjectInfoModelInterface + SetObject(ctx context.Context, obj *ObjectInfoModel) error + Take(ctx context.Context, name string) (*ObjectInfoModel, error) +} diff --git a/pkg/common/db/table/relation/object_put.go b/pkg/common/db/table/relation/object_put.go new file mode 100644 index 000000000..73d0478c7 --- /dev/null +++ b/pkg/common/db/table/relation/object_put.go @@ -0,0 +1,34 @@ +package relation + +import ( + "context" + "time" +) + +const ( + ObjectPutModelTableName = "object_put" +) + +type ObjectPutModel struct { + PutID string `gorm:"column:put_id;primary_key"` + Hash string `gorm:"column:hash"` + Path string `gorm:"column:path"` + Name string `gorm:"column:name"` + ObjectSize int64 `gorm:"column:object_size"` + FragmentSize int64 `gorm:"column:fragment_size"` + Complete bool `gorm:"column:complete"` + ExpirationTime *time.Time `gorm:"column:expiration_time"` + EffectiveTime time.Time `gorm:"column:effective_time"` + CreateTime time.Time `gorm:"column:create_time"` +} + +func (ObjectPutModel) TableName() string { + return ObjectPutModelTableName +} + +type ObjectPutModelInterface interface { + NewTx(tx any) ObjectPutModelInterface + Create(ctx context.Context, m []*ObjectPutModel) error + Take(ctx context.Context, putID string) (*ObjectPutModel, error) + SetCompleted(ctx context.Context, putID string) error +} diff --git a/pkg/proto/group/group.proto b/pkg/proto/group/group.proto index aa5a81c4a..c3d980e08 100644 --- a/pkg/proto/group/group.proto +++ b/pkg/proto/group/group.proto @@ -1,6 +1,6 @@ syntax = "proto3"; -import "Open-IM-Server/pkg/proto/sdkws/ws.proto"; -import "Open-IM-Server/pkg/proto/sdkws/wrappers.proto"; +import "sdkws/ws.proto"; +import "sdkws/wrappers.proto"; option go_package = "OpenIM/pkg/proto/group;group"; package group; diff --git a/pkg/proto/sdkws/ws.proto b/pkg/proto/sdkws/ws.proto index 42523869a..21c9cf263 100644 --- a/pkg/proto/sdkws/ws.proto +++ b/pkg/proto/sdkws/ws.proto @@ -1,5 +1,5 @@ syntax = "proto3"; -import "Open-IM-Server/pkg/proto/sdkws/wrappers.proto"; +import "sdkws/wrappers.proto"; option go_package = "OpenIM/pkg/proto/sdkws;sdkws"; package sdkws; diff --git a/pkg/proto/third/third.pb.go b/pkg/proto/third/third.pb.go index d6625468b..355a395c8 100644 --- a/pkg/proto/third/third.pb.go +++ b/pkg/proto/third/third.pb.go @@ -24,214 +24,384 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package -type ApplySpaceReq struct { +type ApplyPutReq struct { Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` Size int64 `protobuf:"varint,2,opt,name=size" json:"size,omitempty"` Hash string `protobuf:"bytes,3,opt,name=hash" json:"hash,omitempty"` - Purpose uint32 `protobuf:"varint,4,opt,name=purpose" json:"purpose,omitempty"` - ContentType string `protobuf:"bytes,5,opt,name=contentType" json:"contentType,omitempty"` + FragmentSize int64 `protobuf:"varint,4,opt,name=fragmentSize" json:"fragmentSize,omitempty"` + CleanTime int64 `protobuf:"varint,5,opt,name=cleanTime" json:"cleanTime,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *ApplySpaceReq) Reset() { *m = ApplySpaceReq{} } -func (m *ApplySpaceReq) String() string { return proto.CompactTextString(m) } -func (*ApplySpaceReq) ProtoMessage() {} -func (*ApplySpaceReq) Descriptor() ([]byte, []int) { - return fileDescriptor_third_de04cb9a0062d654, []int{0} +func (m *ApplyPutReq) Reset() { *m = ApplyPutReq{} } +func (m *ApplyPutReq) String() string { return proto.CompactTextString(m) } +func (*ApplyPutReq) ProtoMessage() {} +func (*ApplyPutReq) Descriptor() ([]byte, []int) { + return fileDescriptor_third_1a03a4b056d14713, []int{0} } -func (m *ApplySpaceReq) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ApplySpaceReq.Unmarshal(m, b) +func (m *ApplyPutReq) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ApplyPutReq.Unmarshal(m, b) } -func (m *ApplySpaceReq) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ApplySpaceReq.Marshal(b, m, deterministic) +func (m *ApplyPutReq) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ApplyPutReq.Marshal(b, m, deterministic) } -func (dst *ApplySpaceReq) XXX_Merge(src proto.Message) { - xxx_messageInfo_ApplySpaceReq.Merge(dst, src) +func (dst *ApplyPutReq) XXX_Merge(src proto.Message) { + xxx_messageInfo_ApplyPutReq.Merge(dst, src) } -func (m *ApplySpaceReq) XXX_Size() int { - return xxx_messageInfo_ApplySpaceReq.Size(m) +func (m *ApplyPutReq) XXX_Size() int { + return xxx_messageInfo_ApplyPutReq.Size(m) } -func (m *ApplySpaceReq) XXX_DiscardUnknown() { - xxx_messageInfo_ApplySpaceReq.DiscardUnknown(m) +func (m *ApplyPutReq) XXX_DiscardUnknown() { + xxx_messageInfo_ApplyPutReq.DiscardUnknown(m) } -var xxx_messageInfo_ApplySpaceReq proto.InternalMessageInfo +var xxx_messageInfo_ApplyPutReq proto.InternalMessageInfo -func (m *ApplySpaceReq) GetName() string { +func (m *ApplyPutReq) GetName() string { if m != nil { return m.Name } return "" } -func (m *ApplySpaceReq) GetSize() int64 { +func (m *ApplyPutReq) GetSize() int64 { if m != nil { return m.Size } return 0 } -func (m *ApplySpaceReq) GetHash() string { +func (m *ApplyPutReq) GetHash() string { if m != nil { return m.Hash } return "" } -func (m *ApplySpaceReq) GetPurpose() uint32 { +func (m *ApplyPutReq) GetFragmentSize() int64 { if m != nil { - return m.Purpose + return m.FragmentSize } return 0 } -func (m *ApplySpaceReq) GetContentType() string { +func (m *ApplyPutReq) GetCleanTime() int64 { if m != nil { - return m.ContentType + return m.CleanTime } - return "" + return 0 } -type ApplySpaceResp struct { +type ApplyPutResp struct { Url string `protobuf:"bytes,1,opt,name=url" json:"url,omitempty"` - Size int64 `protobuf:"varint,2,opt,name=size" json:"size,omitempty"` - Put []string `protobuf:"bytes,3,rep,name=put" json:"put,omitempty"` - ConfirmID string `protobuf:"bytes,4,opt,name=confirmID" json:"confirmID,omitempty"` + PutID string `protobuf:"bytes,2,opt,name=putID" json:"putID,omitempty"` + FragmentSize int64 `protobuf:"varint,3,opt,name=fragmentSize" json:"fragmentSize,omitempty"` + ExpirationTime int64 `protobuf:"varint,4,opt,name=expirationTime" json:"expirationTime,omitempty"` + PutURLs []string `protobuf:"bytes,5,rep,name=PutURLs" json:"PutURLs,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *ApplySpaceResp) Reset() { *m = ApplySpaceResp{} } -func (m *ApplySpaceResp) String() string { return proto.CompactTextString(m) } -func (*ApplySpaceResp) ProtoMessage() {} -func (*ApplySpaceResp) Descriptor() ([]byte, []int) { - return fileDescriptor_third_de04cb9a0062d654, []int{1} +func (m *ApplyPutResp) Reset() { *m = ApplyPutResp{} } +func (m *ApplyPutResp) String() string { return proto.CompactTextString(m) } +func (*ApplyPutResp) ProtoMessage() {} +func (*ApplyPutResp) Descriptor() ([]byte, []int) { + return fileDescriptor_third_1a03a4b056d14713, []int{1} } -func (m *ApplySpaceResp) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ApplySpaceResp.Unmarshal(m, b) +func (m *ApplyPutResp) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ApplyPutResp.Unmarshal(m, b) } -func (m *ApplySpaceResp) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ApplySpaceResp.Marshal(b, m, deterministic) +func (m *ApplyPutResp) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ApplyPutResp.Marshal(b, m, deterministic) } -func (dst *ApplySpaceResp) XXX_Merge(src proto.Message) { - xxx_messageInfo_ApplySpaceResp.Merge(dst, src) +func (dst *ApplyPutResp) XXX_Merge(src proto.Message) { + xxx_messageInfo_ApplyPutResp.Merge(dst, src) } -func (m *ApplySpaceResp) XXX_Size() int { - return xxx_messageInfo_ApplySpaceResp.Size(m) +func (m *ApplyPutResp) XXX_Size() int { + return xxx_messageInfo_ApplyPutResp.Size(m) } -func (m *ApplySpaceResp) XXX_DiscardUnknown() { - xxx_messageInfo_ApplySpaceResp.DiscardUnknown(m) +func (m *ApplyPutResp) XXX_DiscardUnknown() { + xxx_messageInfo_ApplyPutResp.DiscardUnknown(m) } -var xxx_messageInfo_ApplySpaceResp proto.InternalMessageInfo +var xxx_messageInfo_ApplyPutResp proto.InternalMessageInfo -func (m *ApplySpaceResp) GetUrl() string { +func (m *ApplyPutResp) GetUrl() string { if m != nil { return m.Url } return "" } -func (m *ApplySpaceResp) GetSize() int64 { +func (m *ApplyPutResp) GetPutID() string { + if m != nil { + return m.PutID + } + return "" +} + +func (m *ApplyPutResp) GetFragmentSize() int64 { + if m != nil { + return m.FragmentSize + } + return 0 +} + +func (m *ApplyPutResp) GetExpirationTime() int64 { + if m != nil { + return m.ExpirationTime + } + return 0 +} + +func (m *ApplyPutResp) GetPutURLs() []string { + if m != nil { + return m.PutURLs + } + return nil +} + +type ConfirmPutReq struct { + PutID string `protobuf:"bytes,1,opt,name=putID" json:"putID,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ConfirmPutReq) Reset() { *m = ConfirmPutReq{} } +func (m *ConfirmPutReq) String() string { return proto.CompactTextString(m) } +func (*ConfirmPutReq) ProtoMessage() {} +func (*ConfirmPutReq) Descriptor() ([]byte, []int) { + return fileDescriptor_third_1a03a4b056d14713, []int{2} +} +func (m *ConfirmPutReq) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ConfirmPutReq.Unmarshal(m, b) +} +func (m *ConfirmPutReq) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ConfirmPutReq.Marshal(b, m, deterministic) +} +func (dst *ConfirmPutReq) XXX_Merge(src proto.Message) { + xxx_messageInfo_ConfirmPutReq.Merge(dst, src) +} +func (m *ConfirmPutReq) XXX_Size() int { + return xxx_messageInfo_ConfirmPutReq.Size(m) +} +func (m *ConfirmPutReq) XXX_DiscardUnknown() { + xxx_messageInfo_ConfirmPutReq.DiscardUnknown(m) +} + +var xxx_messageInfo_ConfirmPutReq proto.InternalMessageInfo + +func (m *ConfirmPutReq) GetPutID() string { + if m != nil { + return m.PutID + } + return "" +} + +type ConfirmPutResp struct { + Url string `protobuf:"bytes,1,opt,name=url" json:"url,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ConfirmPutResp) Reset() { *m = ConfirmPutResp{} } +func (m *ConfirmPutResp) String() string { return proto.CompactTextString(m) } +func (*ConfirmPutResp) ProtoMessage() {} +func (*ConfirmPutResp) Descriptor() ([]byte, []int) { + return fileDescriptor_third_1a03a4b056d14713, []int{3} +} +func (m *ConfirmPutResp) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ConfirmPutResp.Unmarshal(m, b) +} +func (m *ConfirmPutResp) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ConfirmPutResp.Marshal(b, m, deterministic) +} +func (dst *ConfirmPutResp) XXX_Merge(src proto.Message) { + xxx_messageInfo_ConfirmPutResp.Merge(dst, src) +} +func (m *ConfirmPutResp) XXX_Size() int { + return xxx_messageInfo_ConfirmPutResp.Size(m) +} +func (m *ConfirmPutResp) XXX_DiscardUnknown() { + xxx_messageInfo_ConfirmPutResp.DiscardUnknown(m) +} + +var xxx_messageInfo_ConfirmPutResp proto.InternalMessageInfo + +func (m *ConfirmPutResp) GetUrl() string { + if m != nil { + return m.Url + } + return "" +} + +type GetPutReq struct { + PutID string `protobuf:"bytes,1,opt,name=putID" json:"putID,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GetPutReq) Reset() { *m = GetPutReq{} } +func (m *GetPutReq) String() string { return proto.CompactTextString(m) } +func (*GetPutReq) ProtoMessage() {} +func (*GetPutReq) Descriptor() ([]byte, []int) { + return fileDescriptor_third_1a03a4b056d14713, []int{4} +} +func (m *GetPutReq) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_GetPutReq.Unmarshal(m, b) +} +func (m *GetPutReq) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_GetPutReq.Marshal(b, m, deterministic) +} +func (dst *GetPutReq) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetPutReq.Merge(dst, src) +} +func (m *GetPutReq) XXX_Size() int { + return xxx_messageInfo_GetPutReq.Size(m) +} +func (m *GetPutReq) XXX_DiscardUnknown() { + xxx_messageInfo_GetPutReq.DiscardUnknown(m) +} + +var xxx_messageInfo_GetPutReq proto.InternalMessageInfo + +func (m *GetPutReq) GetPutID() string { + if m != nil { + return m.PutID + } + return "" +} + +type GetPutFragment struct { + Size int64 `protobuf:"varint,1,opt,name=size" json:"size,omitempty"` + Hash string `protobuf:"bytes,2,opt,name=hash" json:"hash,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GetPutFragment) Reset() { *m = GetPutFragment{} } +func (m *GetPutFragment) String() string { return proto.CompactTextString(m) } +func (*GetPutFragment) ProtoMessage() {} +func (*GetPutFragment) Descriptor() ([]byte, []int) { + return fileDescriptor_third_1a03a4b056d14713, []int{5} +} +func (m *GetPutFragment) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_GetPutFragment.Unmarshal(m, b) +} +func (m *GetPutFragment) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_GetPutFragment.Marshal(b, m, deterministic) +} +func (dst *GetPutFragment) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetPutFragment.Merge(dst, src) +} +func (m *GetPutFragment) XXX_Size() int { + return xxx_messageInfo_GetPutFragment.Size(m) +} +func (m *GetPutFragment) XXX_DiscardUnknown() { + xxx_messageInfo_GetPutFragment.DiscardUnknown(m) +} + +var xxx_messageInfo_GetPutFragment proto.InternalMessageInfo + +func (m *GetPutFragment) GetSize() int64 { if m != nil { return m.Size } return 0 } -func (m *ApplySpaceResp) GetPut() []string { +func (m *GetPutFragment) GetHash() string { if m != nil { - return m.Put + return m.Hash + } + return "" +} + +type GetPutResp struct { + Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Size int64 `protobuf:"varint,2,opt,name=size" json:"size,omitempty"` + Hash string `protobuf:"bytes,3,opt,name=hash" json:"hash,omitempty"` + FragmentSize int64 `protobuf:"varint,4,opt,name=fragmentSize" json:"fragmentSize,omitempty"` + CleanTime int64 `protobuf:"varint,5,opt,name=cleanTime" json:"cleanTime,omitempty"` + Fragments []*GetPutFragment `protobuf:"bytes,6,rep,name=fragments" json:"fragments,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GetPutResp) Reset() { *m = GetPutResp{} } +func (m *GetPutResp) String() string { return proto.CompactTextString(m) } +func (*GetPutResp) ProtoMessage() {} +func (*GetPutResp) Descriptor() ([]byte, []int) { + return fileDescriptor_third_1a03a4b056d14713, []int{6} +} +func (m *GetPutResp) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_GetPutResp.Unmarshal(m, b) +} +func (m *GetPutResp) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_GetPutResp.Marshal(b, m, deterministic) +} +func (dst *GetPutResp) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetPutResp.Merge(dst, src) +} +func (m *GetPutResp) XXX_Size() int { + return xxx_messageInfo_GetPutResp.Size(m) +} +func (m *GetPutResp) XXX_DiscardUnknown() { + xxx_messageInfo_GetPutResp.DiscardUnknown(m) +} + +var xxx_messageInfo_GetPutResp proto.InternalMessageInfo + +func (m *GetPutResp) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *GetPutResp) GetSize() int64 { + if m != nil { + return m.Size + } + return 0 +} + +func (m *GetPutResp) GetHash() string { + if m != nil { + return m.Hash + } + return "" +} + +func (m *GetPutResp) GetFragmentSize() int64 { + if m != nil { + return m.FragmentSize + } + return 0 +} + +func (m *GetPutResp) GetCleanTime() int64 { + if m != nil { + return m.CleanTime + } + return 0 +} + +func (m *GetPutResp) GetFragments() []*GetPutFragment { + if m != nil { + return m.Fragments } return nil } -func (m *ApplySpaceResp) GetConfirmID() string { - if m != nil { - return m.ConfirmID - } - return "" -} - -type ConfirmSpaceReq struct { - ConfirmID string `protobuf:"bytes,1,opt,name=confirmID" json:"confirmID,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ConfirmSpaceReq) Reset() { *m = ConfirmSpaceReq{} } -func (m *ConfirmSpaceReq) String() string { return proto.CompactTextString(m) } -func (*ConfirmSpaceReq) ProtoMessage() {} -func (*ConfirmSpaceReq) Descriptor() ([]byte, []int) { - return fileDescriptor_third_de04cb9a0062d654, []int{2} -} -func (m *ConfirmSpaceReq) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ConfirmSpaceReq.Unmarshal(m, b) -} -func (m *ConfirmSpaceReq) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ConfirmSpaceReq.Marshal(b, m, deterministic) -} -func (dst *ConfirmSpaceReq) XXX_Merge(src proto.Message) { - xxx_messageInfo_ConfirmSpaceReq.Merge(dst, src) -} -func (m *ConfirmSpaceReq) XXX_Size() int { - return xxx_messageInfo_ConfirmSpaceReq.Size(m) -} -func (m *ConfirmSpaceReq) XXX_DiscardUnknown() { - xxx_messageInfo_ConfirmSpaceReq.DiscardUnknown(m) -} - -var xxx_messageInfo_ConfirmSpaceReq proto.InternalMessageInfo - -func (m *ConfirmSpaceReq) GetConfirmID() string { - if m != nil { - return m.ConfirmID - } - return "" -} - -type ConfirmSpaceResp struct { - ConfirmID string `protobuf:"bytes,1,opt,name=confirmID" json:"confirmID,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ConfirmSpaceResp) Reset() { *m = ConfirmSpaceResp{} } -func (m *ConfirmSpaceResp) String() string { return proto.CompactTextString(m) } -func (*ConfirmSpaceResp) ProtoMessage() {} -func (*ConfirmSpaceResp) Descriptor() ([]byte, []int) { - return fileDescriptor_third_de04cb9a0062d654, []int{3} -} -func (m *ConfirmSpaceResp) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ConfirmSpaceResp.Unmarshal(m, b) -} -func (m *ConfirmSpaceResp) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ConfirmSpaceResp.Marshal(b, m, deterministic) -} -func (dst *ConfirmSpaceResp) XXX_Merge(src proto.Message) { - xxx_messageInfo_ConfirmSpaceResp.Merge(dst, src) -} -func (m *ConfirmSpaceResp) XXX_Size() int { - return xxx_messageInfo_ConfirmSpaceResp.Size(m) -} -func (m *ConfirmSpaceResp) XXX_DiscardUnknown() { - xxx_messageInfo_ConfirmSpaceResp.DiscardUnknown(m) -} - -var xxx_messageInfo_ConfirmSpaceResp proto.InternalMessageInfo - -func (m *ConfirmSpaceResp) GetConfirmID() string { - if m != nil { - return m.ConfirmID - } - return "" -} - type GetSignalInvitationInfoReq struct { ClientMsgID string `protobuf:"bytes,1,opt,name=ClientMsgID" json:"ClientMsgID,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` @@ -243,7 +413,7 @@ func (m *GetSignalInvitationInfoReq) Reset() { *m = GetSignalInvitationI func (m *GetSignalInvitationInfoReq) String() string { return proto.CompactTextString(m) } func (*GetSignalInvitationInfoReq) ProtoMessage() {} func (*GetSignalInvitationInfoReq) Descriptor() ([]byte, []int) { - return fileDescriptor_third_de04cb9a0062d654, []int{4} + return fileDescriptor_third_1a03a4b056d14713, []int{7} } func (m *GetSignalInvitationInfoReq) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_GetSignalInvitationInfoReq.Unmarshal(m, b) @@ -282,7 +452,7 @@ func (m *GetSignalInvitationInfoResp) Reset() { *m = GetSignalInvitation func (m *GetSignalInvitationInfoResp) String() string { return proto.CompactTextString(m) } func (*GetSignalInvitationInfoResp) ProtoMessage() {} func (*GetSignalInvitationInfoResp) Descriptor() ([]byte, []int) { - return fileDescriptor_third_de04cb9a0062d654, []int{5} + return fileDescriptor_third_1a03a4b056d14713, []int{8} } func (m *GetSignalInvitationInfoResp) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_GetSignalInvitationInfoResp.Unmarshal(m, b) @@ -327,7 +497,7 @@ func (m *GetSignalInvitationInfoStartAppReq) Reset() { *m = GetSignalInv func (m *GetSignalInvitationInfoStartAppReq) String() string { return proto.CompactTextString(m) } func (*GetSignalInvitationInfoStartAppReq) ProtoMessage() {} func (*GetSignalInvitationInfoStartAppReq) Descriptor() ([]byte, []int) { - return fileDescriptor_third_de04cb9a0062d654, []int{6} + return fileDescriptor_third_1a03a4b056d14713, []int{9} } func (m *GetSignalInvitationInfoStartAppReq) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_GetSignalInvitationInfoStartAppReq.Unmarshal(m, b) @@ -366,7 +536,7 @@ func (m *GetSignalInvitationInfoStartAppResp) Reset() { *m = GetSignalIn func (m *GetSignalInvitationInfoStartAppResp) String() string { return proto.CompactTextString(m) } func (*GetSignalInvitationInfoStartAppResp) ProtoMessage() {} func (*GetSignalInvitationInfoStartAppResp) Descriptor() ([]byte, []int) { - return fileDescriptor_third_de04cb9a0062d654, []int{7} + return fileDescriptor_third_1a03a4b056d14713, []int{10} } func (m *GetSignalInvitationInfoStartAppResp) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_GetSignalInvitationInfoStartAppResp.Unmarshal(m, b) @@ -414,7 +584,7 @@ func (m *FcmUpdateTokenReq) Reset() { *m = FcmUpdateTokenReq{} } func (m *FcmUpdateTokenReq) String() string { return proto.CompactTextString(m) } func (*FcmUpdateTokenReq) ProtoMessage() {} func (*FcmUpdateTokenReq) Descriptor() ([]byte, []int) { - return fileDescriptor_third_de04cb9a0062d654, []int{8} + return fileDescriptor_third_1a03a4b056d14713, []int{11} } func (m *FcmUpdateTokenReq) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_FcmUpdateTokenReq.Unmarshal(m, b) @@ -472,7 +642,7 @@ func (m *FcmUpdateTokenResp) Reset() { *m = FcmUpdateTokenResp{} } func (m *FcmUpdateTokenResp) String() string { return proto.CompactTextString(m) } func (*FcmUpdateTokenResp) ProtoMessage() {} func (*FcmUpdateTokenResp) Descriptor() ([]byte, []int) { - return fileDescriptor_third_de04cb9a0062d654, []int{9} + return fileDescriptor_third_1a03a4b056d14713, []int{12} } func (m *FcmUpdateTokenResp) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_FcmUpdateTokenResp.Unmarshal(m, b) @@ -504,7 +674,7 @@ func (m *SetAppBadgeReq) Reset() { *m = SetAppBadgeReq{} } func (m *SetAppBadgeReq) String() string { return proto.CompactTextString(m) } func (*SetAppBadgeReq) ProtoMessage() {} func (*SetAppBadgeReq) Descriptor() ([]byte, []int) { - return fileDescriptor_third_de04cb9a0062d654, []int{10} + return fileDescriptor_third_1a03a4b056d14713, []int{13} } func (m *SetAppBadgeReq) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SetAppBadgeReq.Unmarshal(m, b) @@ -548,7 +718,7 @@ func (m *SetAppBadgeResp) Reset() { *m = SetAppBadgeResp{} } func (m *SetAppBadgeResp) String() string { return proto.CompactTextString(m) } func (*SetAppBadgeResp) ProtoMessage() {} func (*SetAppBadgeResp) Descriptor() ([]byte, []int) { - return fileDescriptor_third_de04cb9a0062d654, []int{11} + return fileDescriptor_third_1a03a4b056d14713, []int{14} } func (m *SetAppBadgeResp) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SetAppBadgeResp.Unmarshal(m, b) @@ -569,10 +739,13 @@ func (m *SetAppBadgeResp) XXX_DiscardUnknown() { var xxx_messageInfo_SetAppBadgeResp proto.InternalMessageInfo func init() { - proto.RegisterType((*ApplySpaceReq)(nil), "third.ApplySpaceReq") - proto.RegisterType((*ApplySpaceResp)(nil), "third.ApplySpaceResp") - proto.RegisterType((*ConfirmSpaceReq)(nil), "third.ConfirmSpaceReq") - proto.RegisterType((*ConfirmSpaceResp)(nil), "third.ConfirmSpaceResp") + proto.RegisterType((*ApplyPutReq)(nil), "third.ApplyPutReq") + proto.RegisterType((*ApplyPutResp)(nil), "third.ApplyPutResp") + proto.RegisterType((*ConfirmPutReq)(nil), "third.ConfirmPutReq") + proto.RegisterType((*ConfirmPutResp)(nil), "third.ConfirmPutResp") + proto.RegisterType((*GetPutReq)(nil), "third.GetPutReq") + proto.RegisterType((*GetPutFragment)(nil), "third.GetPutFragment") + proto.RegisterType((*GetPutResp)(nil), "third.GetPutResp") proto.RegisterType((*GetSignalInvitationInfoReq)(nil), "third.GetSignalInvitationInfoReq") proto.RegisterType((*GetSignalInvitationInfoResp)(nil), "third.GetSignalInvitationInfoResp") proto.RegisterType((*GetSignalInvitationInfoStartAppReq)(nil), "third.GetSignalInvitationInfoStartAppReq") @@ -594,7 +767,9 @@ const _ = grpc.SupportPackageIsVersion4 // Client API for Third service type ThirdClient interface { - ApplySpace(ctx context.Context, in *ApplySpaceReq, opts ...grpc.CallOption) (*ApplySpaceResp, error) + ApplyPut(ctx context.Context, in *ApplyPutReq, opts ...grpc.CallOption) (*ApplyPutResp, error) + GetPut(ctx context.Context, in *GetPutReq, opts ...grpc.CallOption) (*GetPutResp, error) + ConfirmPut(ctx context.Context, in *ConfirmPutReq, opts ...grpc.CallOption) (*ConfirmPutResp, error) GetSignalInvitationInfo(ctx context.Context, in *GetSignalInvitationInfoReq, opts ...grpc.CallOption) (*GetSignalInvitationInfoResp, error) GetSignalInvitationInfoStartApp(ctx context.Context, in *GetSignalInvitationInfoStartAppReq, opts ...grpc.CallOption) (*GetSignalInvitationInfoStartAppResp, error) FcmUpdateToken(ctx context.Context, in *FcmUpdateTokenReq, opts ...grpc.CallOption) (*FcmUpdateTokenResp, error) @@ -609,9 +784,27 @@ func NewThirdClient(cc *grpc.ClientConn) ThirdClient { return &thirdClient{cc} } -func (c *thirdClient) ApplySpace(ctx context.Context, in *ApplySpaceReq, opts ...grpc.CallOption) (*ApplySpaceResp, error) { - out := new(ApplySpaceResp) - err := grpc.Invoke(ctx, "/third.third/ApplySpace", in, out, c.cc, opts...) +func (c *thirdClient) ApplyPut(ctx context.Context, in *ApplyPutReq, opts ...grpc.CallOption) (*ApplyPutResp, error) { + out := new(ApplyPutResp) + err := grpc.Invoke(ctx, "/third.third/ApplyPut", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *thirdClient) GetPut(ctx context.Context, in *GetPutReq, opts ...grpc.CallOption) (*GetPutResp, error) { + out := new(GetPutResp) + err := grpc.Invoke(ctx, "/third.third/GetPut", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *thirdClient) ConfirmPut(ctx context.Context, in *ConfirmPutReq, opts ...grpc.CallOption) (*ConfirmPutResp, error) { + out := new(ConfirmPutResp) + err := grpc.Invoke(ctx, "/third.third/ConfirmPut", in, out, c.cc, opts...) if err != nil { return nil, err } @@ -657,7 +850,9 @@ func (c *thirdClient) SetAppBadge(ctx context.Context, in *SetAppBadgeReq, opts // Server API for Third service type ThirdServer interface { - ApplySpace(context.Context, *ApplySpaceReq) (*ApplySpaceResp, error) + ApplyPut(context.Context, *ApplyPutReq) (*ApplyPutResp, error) + GetPut(context.Context, *GetPutReq) (*GetPutResp, error) + ConfirmPut(context.Context, *ConfirmPutReq) (*ConfirmPutResp, error) GetSignalInvitationInfo(context.Context, *GetSignalInvitationInfoReq) (*GetSignalInvitationInfoResp, error) GetSignalInvitationInfoStartApp(context.Context, *GetSignalInvitationInfoStartAppReq) (*GetSignalInvitationInfoStartAppResp, error) FcmUpdateToken(context.Context, *FcmUpdateTokenReq) (*FcmUpdateTokenResp, error) @@ -668,20 +863,56 @@ func RegisterThirdServer(s *grpc.Server, srv ThirdServer) { s.RegisterService(&_Third_serviceDesc, srv) } -func _Third_ApplySpace_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ApplySpaceReq) +func _Third_ApplyPut_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ApplyPutReq) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(ThirdServer).ApplySpace(ctx, in) + return srv.(ThirdServer).ApplyPut(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/third.third/ApplySpace", + FullMethod: "/third.third/ApplyPut", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ThirdServer).ApplySpace(ctx, req.(*ApplySpaceReq)) + return srv.(ThirdServer).ApplyPut(ctx, req.(*ApplyPutReq)) + } + return interceptor(ctx, in, info, handler) +} + +func _Third_GetPut_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetPutReq) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ThirdServer).GetPut(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/third.third/GetPut", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ThirdServer).GetPut(ctx, req.(*GetPutReq)) + } + return interceptor(ctx, in, info, handler) +} + +func _Third_ConfirmPut_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ConfirmPutReq) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ThirdServer).ConfirmPut(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/third.third/ConfirmPut", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ThirdServer).ConfirmPut(ctx, req.(*ConfirmPutReq)) } return interceptor(ctx, in, info, handler) } @@ -763,8 +994,16 @@ var _Third_serviceDesc = grpc.ServiceDesc{ HandlerType: (*ThirdServer)(nil), Methods: []grpc.MethodDesc{ { - MethodName: "ApplySpace", - Handler: _Third_ApplySpace_Handler, + MethodName: "ApplyPut", + Handler: _Third_ApplyPut_Handler, + }, + { + MethodName: "GetPut", + Handler: _Third_GetPut_Handler, + }, + { + MethodName: "ConfirmPut", + Handler: _Third_ConfirmPut_Handler, }, { MethodName: "GetSignalInvitationInfo", @@ -787,46 +1026,53 @@ var _Third_serviceDesc = grpc.ServiceDesc{ Metadata: "third/third.proto", } -func init() { proto.RegisterFile("third/third.proto", fileDescriptor_third_de04cb9a0062d654) } +func init() { proto.RegisterFile("third/third.proto", fileDescriptor_third_1a03a4b056d14713) } -var fileDescriptor_third_de04cb9a0062d654 = []byte{ - // 608 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x54, 0xcd, 0x6e, 0xd3, 0x40, - 0x10, 0x96, 0xeb, 0xb6, 0x90, 0x89, 0x9a, 0xb6, 0xab, 0xb6, 0x18, 0x53, 0x15, 0x63, 0x24, 0x28, - 0x48, 0x8d, 0x51, 0x39, 0x21, 0x0a, 0xa2, 0x2d, 0x14, 0xe5, 0x50, 0x35, 0x72, 0xd2, 0x0b, 0x27, - 0x8c, 0xb3, 0x4e, 0xac, 0x38, 0xeb, 0xc1, 0xbb, 0xee, 0x0f, 0x2f, 0x80, 0x78, 0x09, 0x2e, 0x48, - 0x3c, 0x27, 0xda, 0xb5, 0x93, 0xda, 0x26, 0x69, 0x38, 0x72, 0xb1, 0x76, 0x3e, 0x7f, 0xdf, 0xec, - 0xfc, 0xec, 0x0c, 0xac, 0x8b, 0x41, 0x98, 0xf4, 0x1c, 0xf5, 0x6d, 0x62, 0x12, 0x8b, 0x98, 0x2c, - 0x29, 0xc3, 0x7c, 0x7a, 0x86, 0x94, 0xed, 0xb5, 0x4e, 0xf7, 0x3a, 0x34, 0xb9, 0xa0, 0x89, 0x83, - 0xc3, 0xbe, 0xa3, 0x08, 0x0e, 0xef, 0x0d, 0x2f, 0xb9, 0x73, 0xc9, 0x33, 0xbe, 0xfd, 0x5d, 0x83, - 0x95, 0x43, 0xc4, 0xe8, 0xba, 0x83, 0x9e, 0x4f, 0x5d, 0xfa, 0x95, 0x10, 0x58, 0x64, 0xde, 0x88, - 0x1a, 0x9a, 0xa5, 0xed, 0xd6, 0x5c, 0x75, 0x96, 0x18, 0x0f, 0xbf, 0x51, 0x63, 0xc1, 0xd2, 0x76, - 0x75, 0x57, 0x9d, 0x25, 0x36, 0xf0, 0xf8, 0xc0, 0xd0, 0x33, 0x9e, 0x3c, 0x13, 0x03, 0xee, 0x60, - 0x9a, 0x60, 0xcc, 0xa9, 0xb1, 0x68, 0x69, 0xbb, 0x2b, 0xee, 0xd8, 0x24, 0x16, 0xd4, 0xfd, 0x98, - 0x09, 0xca, 0x44, 0xf7, 0x1a, 0xa9, 0xb1, 0xa4, 0x44, 0x45, 0xc8, 0x0e, 0xa0, 0x51, 0x0c, 0x84, - 0x23, 0x59, 0x03, 0x3d, 0x4d, 0xa2, 0x3c, 0x10, 0x79, 0x9c, 0x1a, 0xc7, 0x1a, 0xe8, 0x98, 0x0a, - 0x43, 0xb7, 0x74, 0xc9, 0xc2, 0x54, 0x90, 0x6d, 0xa8, 0xf9, 0x31, 0x0b, 0xc2, 0x64, 0xd4, 0x7a, - 0xaf, 0xe2, 0xa8, 0xb9, 0x37, 0x80, 0xed, 0xc0, 0xea, 0x71, 0x66, 0x4c, 0x52, 0x2e, 0x09, 0xb4, - 0xaa, 0xe0, 0x05, 0xac, 0x95, 0x05, 0x1c, 0xe7, 0x28, 0xde, 0x82, 0xf9, 0x91, 0x8a, 0x4e, 0xd8, - 0x67, 0x5e, 0xd4, 0x62, 0x17, 0xa1, 0xf0, 0x44, 0x18, 0xb3, 0x16, 0x0b, 0x62, 0x79, 0x9b, 0x05, - 0xf5, 0xe3, 0x28, 0xa4, 0x4c, 0x9c, 0xf2, 0xfe, 0x44, 0x5d, 0x84, 0xec, 0x9f, 0x1a, 0x3c, 0x98, - 0xe9, 0x80, 0x23, 0x79, 0x03, 0x8d, 0xb0, 0x84, 0x2a, 0x27, 0xf5, 0xfd, 0xcd, 0xa6, 0xea, 0x6e, - 0xb3, 0x22, 0xa9, 0x90, 0xc9, 0x3b, 0x58, 0x8d, 0x83, 0x20, 0x0a, 0x19, 0x6d, 0xa7, 0x7c, 0xa0, - 0xf4, 0x0b, 0x4a, 0xbf, 0x95, 0xeb, 0xcf, 0xca, 0x7f, 0xdd, 0x2a, 0xdd, 0x3e, 0x00, 0x7b, 0x46, - 0x7c, 0x1d, 0xe1, 0x25, 0xe2, 0x10, 0x51, 0x26, 0xba, 0x05, 0xcb, 0x29, 0xa7, 0xc9, 0x24, 0xc7, - 0xdc, 0xb2, 0x7f, 0x6b, 0xf0, 0x78, 0xae, 0xfc, 0x7f, 0x48, 0xf3, 0x87, 0x06, 0xeb, 0x27, 0xfe, - 0xe8, 0x1c, 0x7b, 0x9e, 0xa0, 0xdd, 0x78, 0x48, 0x99, 0x4c, 0x6b, 0x07, 0xa0, 0x1d, 0x79, 0x22, - 0x88, 0x27, 0xcd, 0x5f, 0x72, 0x0b, 0x08, 0x31, 0xe1, 0xee, 0x89, 0x3f, 0x52, 0x74, 0x75, 0x61, - 0xcd, 0x9d, 0xd8, 0x72, 0x40, 0x3c, 0xdf, 0x8f, 0x53, 0x26, 0xf2, 0xb9, 0x19, 0x9b, 0xd2, 0x2b, - 0xbd, 0xc2, 0x30, 0xa1, 0xdd, 0x70, 0x94, 0x4d, 0x8f, 0xee, 0x16, 0x10, 0x7b, 0x03, 0x48, 0x35, - 0x14, 0x8e, 0x76, 0x1b, 0x1a, 0x1d, 0x2a, 0x0b, 0x76, 0xe4, 0xf5, 0xfa, 0xf4, 0x96, 0xa2, 0x93, - 0x27, 0x6a, 0xbc, 0xce, 0x59, 0x42, 0xbd, 0xde, 0xb1, 0x0a, 0x60, 0x41, 0x45, 0x5e, 0x41, 0xed, - 0x75, 0x58, 0x2d, 0x79, 0xe4, 0xb8, 0xff, 0x4b, 0x87, 0x6c, 0xad, 0x90, 0x57, 0x00, 0x37, 0x33, - 0x4a, 0x36, 0x9a, 0xd9, 0xe6, 0x29, 0xed, 0x0f, 0x73, 0x73, 0x0a, 0xca, 0x91, 0x7c, 0x86, 0x7b, - 0x33, 0x7a, 0x4e, 0x1e, 0xe5, 0x8a, 0xd9, 0x33, 0x63, 0xda, 0xf3, 0x28, 0x1c, 0xc9, 0x15, 0x3c, - 0x9c, 0xf3, 0xaa, 0xc8, 0xb3, 0xdb, 0xdd, 0x14, 0x1e, 0xaf, 0xf9, 0xfc, 0x5f, 0xa9, 0x1c, 0xc9, - 0x07, 0x68, 0x94, 0x7b, 0x43, 0x8c, 0x5c, 0xfd, 0xd7, 0xeb, 0x31, 0xef, 0xcf, 0xf8, 0xc3, 0x91, - 0x1c, 0x40, 0xbd, 0x50, 0x7a, 0x32, 0x2e, 0x64, 0xb9, 0xc1, 0xe6, 0xd6, 0x34, 0x98, 0xe3, 0xd1, - 0xce, 0xa7, 0x6d, 0xb9, 0xf4, 0x5b, 0xa7, 0x85, 0x65, 0xaf, 0x98, 0xaf, 0xd5, 0xf7, 0xcb, 0xb2, - 0x82, 0x5e, 0xfe, 0x09, 0x00, 0x00, 0xff, 0xff, 0x74, 0xd3, 0xa9, 0xeb, 0x35, 0x06, 0x00, 0x00, +var fileDescriptor_third_1a03a4b056d14713 = []byte{ + // 712 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x55, 0xdd, 0x4e, 0x13, 0x4f, + 0x14, 0xcf, 0xb6, 0xb4, 0x7f, 0x7a, 0xca, 0xbf, 0xd0, 0x23, 0xe0, 0xba, 0x12, 0x2c, 0x63, 0xd4, + 0x6a, 0x02, 0x4d, 0xe0, 0x46, 0x23, 0x1a, 0x01, 0x85, 0x34, 0x91, 0xd0, 0x6c, 0xe1, 0xc6, 0x2b, + 0xd7, 0x76, 0xda, 0x6e, 0xd8, 0x8f, 0x71, 0x67, 0x16, 0xd0, 0x17, 0x30, 0xc6, 0x57, 0x30, 0x5e, + 0xfa, 0x1a, 0xbe, 0x9a, 0x99, 0xd9, 0x6d, 0xbb, 0xbb, 0xb4, 0xd4, 0x3b, 0xbd, 0xd9, 0xcc, 0xf9, + 0xed, 0xef, 0x9c, 0x39, 0xdf, 0x03, 0x55, 0x31, 0xb0, 0x83, 0x6e, 0x43, 0x7d, 0xb7, 0x58, 0xe0, + 0x0b, 0x1f, 0x0b, 0x4a, 0x30, 0x1e, 0x9d, 0x30, 0xea, 0x6d, 0x36, 0x8f, 0x37, 0xdb, 0x34, 0xb8, + 0xa0, 0x41, 0x83, 0x9d, 0xf7, 0x1b, 0x8a, 0xd0, 0xe0, 0xdd, 0xf3, 0x4b, 0xde, 0xb8, 0xe4, 0x11, + 0x9f, 0x7c, 0xd3, 0xa0, 0xbc, 0xc7, 0x98, 0xf3, 0xa9, 0x15, 0x0a, 0x93, 0x7e, 0x44, 0x84, 0x39, + 0xcf, 0x72, 0xa9, 0xae, 0xd5, 0xb4, 0x7a, 0xc9, 0x54, 0x67, 0x89, 0x71, 0xfb, 0x33, 0xd5, 0x73, + 0x35, 0xad, 0x9e, 0x37, 0xd5, 0x59, 0x62, 0x03, 0x8b, 0x0f, 0xf4, 0x7c, 0xc4, 0x93, 0x67, 0x24, + 0xb0, 0xd0, 0x0b, 0xac, 0xbe, 0x4b, 0x3d, 0xd1, 0x96, 0xfc, 0x39, 0xc5, 0x4f, 0x61, 0xb8, 0x06, + 0xa5, 0x8e, 0x43, 0x2d, 0xef, 0xd4, 0x76, 0xa9, 0x5e, 0x50, 0x84, 0x31, 0x40, 0xbe, 0x6b, 0xb0, + 0x30, 0xf6, 0x86, 0x33, 0x5c, 0x82, 0x7c, 0x18, 0x38, 0xb1, 0x37, 0xf2, 0x88, 0xcb, 0x50, 0x60, + 0xa1, 0x68, 0xbe, 0x56, 0xde, 0x94, 0xcc, 0x48, 0xb8, 0x76, 0x75, 0x7e, 0xc2, 0xd5, 0x0f, 0xa1, + 0x42, 0xaf, 0x98, 0x1d, 0x58, 0xc2, 0xf6, 0xa3, 0xfb, 0x23, 0x07, 0x33, 0x28, 0xea, 0xf0, 0x5f, + 0x2b, 0x14, 0x67, 0xe6, 0x5b, 0xae, 0x17, 0x6a, 0xf9, 0x7a, 0xc9, 0x1c, 0x8a, 0xe4, 0x01, 0xfc, + 0x7f, 0xe0, 0x7b, 0x3d, 0x3b, 0x70, 0xe3, 0x6c, 0x8d, 0x9c, 0xd1, 0x12, 0xce, 0x10, 0x02, 0x95, + 0x24, 0x6d, 0x52, 0x18, 0x64, 0x03, 0x4a, 0x47, 0x54, 0xdc, 0x68, 0xe6, 0x29, 0x54, 0x22, 0xca, + 0x61, 0x1c, 0xc5, 0xa8, 0x10, 0xda, 0x84, 0x42, 0xe4, 0xc6, 0x85, 0x20, 0xbf, 0x34, 0x80, 0xa1, + 0x75, 0xce, 0xfe, 0x6e, 0x4d, 0x71, 0x07, 0x4a, 0x43, 0x36, 0xd7, 0x8b, 0xb5, 0x7c, 0xbd, 0xbc, + 0xbd, 0xb2, 0x15, 0xb5, 0x6c, 0x3a, 0x3c, 0x73, 0xcc, 0x23, 0x2f, 0xc1, 0x38, 0xa2, 0xa2, 0x6d, + 0xf7, 0x3d, 0xcb, 0x69, 0x7a, 0x17, 0xb6, 0x50, 0xe5, 0x69, 0x7a, 0x3d, 0x5f, 0xe6, 0xab, 0x06, + 0xe5, 0x03, 0xc7, 0xa6, 0x9e, 0x38, 0xe6, 0xfd, 0x51, 0xd6, 0x92, 0x10, 0xf9, 0xa1, 0xc1, 0xdd, + 0xa9, 0x06, 0x38, 0xc3, 0x17, 0x50, 0xb1, 0x53, 0xa8, 0x32, 0x22, 0x3d, 0x53, 0xf3, 0xb1, 0x95, + 0x51, 0xc9, 0x90, 0xf1, 0x15, 0x2c, 0xfa, 0xbd, 0x9e, 0x63, 0x7b, 0xb4, 0x15, 0xf2, 0x81, 0xd2, + 0xcf, 0x29, 0xfd, 0xd5, 0x58, 0xff, 0x24, 0xfd, 0xd7, 0xcc, 0xd2, 0xc9, 0x2e, 0x90, 0x29, 0xfe, + 0xb5, 0x85, 0x15, 0x88, 0x3d, 0xc6, 0x64, 0xa0, 0xab, 0x50, 0x0c, 0x39, 0x0d, 0x46, 0x31, 0xc6, + 0x12, 0xf9, 0xa9, 0xc1, 0xfd, 0x99, 0xea, 0xff, 0x42, 0x98, 0x5f, 0x35, 0xa8, 0x1e, 0x76, 0xdc, + 0x33, 0xd6, 0xb5, 0x04, 0x3d, 0xf5, 0xcf, 0xa9, 0x27, 0xc3, 0x5a, 0x07, 0x68, 0x39, 0x96, 0xe8, + 0xf9, 0x81, 0x1b, 0x87, 0x56, 0x30, 0x13, 0x08, 0x1a, 0x30, 0x7f, 0xd8, 0x71, 0x15, 0x3d, 0xee, + 0xeb, 0x91, 0x2c, 0xa7, 0xd3, 0xea, 0x74, 0xfc, 0xd0, 0x13, 0x71, 0x9f, 0x0e, 0x45, 0x69, 0x55, + 0x4d, 0x32, 0x4d, 0xcc, 0x76, 0x02, 0x21, 0xcb, 0x80, 0x59, 0x57, 0x38, 0x23, 0x2d, 0xa8, 0xb4, + 0xa9, 0x4c, 0xd8, 0xbe, 0xd5, 0xed, 0xd3, 0x1b, 0x92, 0x2e, 0xf7, 0xc7, 0x1e, 0x63, 0x67, 0x5e, + 0x40, 0xad, 0xee, 0x81, 0x72, 0x20, 0xa7, 0x3c, 0xcf, 0xa0, 0xa4, 0x0a, 0x8b, 0x29, 0x8b, 0x9c, + 0x6d, 0x7f, 0x99, 0x83, 0x68, 0x31, 0xe3, 0x0e, 0xcc, 0x0f, 0x17, 0x1c, 0x62, 0x3c, 0x06, 0x89, + 0xfd, 0x6b, 0xdc, 0xba, 0x86, 0x71, 0x86, 0x9b, 0x50, 0x8c, 0x46, 0x05, 0x97, 0x52, 0x93, 0x23, + 0x15, 0xaa, 0x19, 0x84, 0x33, 0x7c, 0x06, 0x30, 0xde, 0x3f, 0xb8, 0x1c, 0x13, 0x52, 0x9b, 0xcb, + 0x58, 0x99, 0x80, 0x72, 0x86, 0xef, 0xe1, 0xf6, 0x94, 0xbe, 0xc2, 0x8d, 0xf1, 0x45, 0x53, 0xe6, + 0xd2, 0x20, 0xb3, 0x28, 0x9c, 0xe1, 0x15, 0xdc, 0x9b, 0xd1, 0xb9, 0xf8, 0xf8, 0x66, 0x33, 0x89, + 0x01, 0x31, 0x9e, 0xfc, 0x29, 0x95, 0x33, 0x7c, 0x03, 0x95, 0x74, 0xfd, 0x51, 0x8f, 0xb5, 0xaf, + 0x75, 0xa8, 0x71, 0x67, 0xca, 0x1f, 0xce, 0x70, 0x17, 0xca, 0x89, 0xf2, 0xe2, 0x30, 0x91, 0xe9, + 0x26, 0x32, 0x56, 0x27, 0xc1, 0x9c, 0xed, 0xaf, 0xbf, 0x5b, 0x93, 0x4f, 0x73, 0xf3, 0x38, 0xf1, + 0x24, 0x2b, 0xe6, 0x73, 0xf5, 0xfd, 0x50, 0x54, 0xd0, 0xce, 0xef, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xda, 0x49, 0x1e, 0x93, 0xdb, 0x07, 0x00, 0x00, } diff --git a/pkg/proto/third/third.proto b/pkg/proto/third/third.proto index d49ce6fe5..9279d79c5 100644 --- a/pkg/proto/third/third.proto +++ b/pkg/proto/third/third.proto @@ -3,28 +3,46 @@ import "Open-IM-Server/pkg/proto/sdkws/ws.proto"; option go_package = "OpenIM/pkg/proto/third;third"; package third; - -message ApplySpaceReq { - string name = 1; // 文件名字 - int64 size = 2; // 大小 - string hash = 3; // md5 - uint32 purpose = 4; // 用途 - string contentType = 5; +message ApplyPutReq { + string name = 1; + int64 size = 2; + string hash = 3; + int64 fragmentSize = 4; + int64 cleanTime = 5; } -message ApplySpaceResp { - string url = 1; // 不为空表示已存在 - int64 size = 2; // 分片大小 - repeated string put = 3;// put地址 - string confirmID = 4; // 确认ID +message ApplyPutResp { + string url = 1; + string putID = 2; + int64 fragmentSize = 3; +// int64 expirationTime = 4; + repeated string PutURLs = 5; } -message ConfirmSpaceReq { - string confirmID = 1; // 确认ID +message ConfirmPutReq { + string putID = 1; } -message ConfirmSpaceResp { - string confirmID = 1; +message ConfirmPutResp { + string url = 1; +} + +message GetPutReq { + string putID = 1; +} + +message GetPutFragment{ + int64 size = 1; + string hash = 2; +} + +message GetPutResp { + string name = 1; + int64 size = 2; + string hash = 3; + int64 fragmentSize = 4; + int64 cleanTime = 5; + repeated GetPutFragment fragments = 6; } message GetSignalInvitationInfoReq { @@ -32,8 +50,8 @@ message GetSignalInvitationInfoReq { } message GetSignalInvitationInfoResp { - sdkws.InvitationInfo invitationInfo = 1; - sdkws.OfflinePushInfo offlinePushInfo = 2; + sdkws.InvitationInfo invitationInfo = 1; + sdkws.OfflinePushInfo offlinePushInfo = 2; } message GetSignalInvitationInfoStartAppReq { @@ -41,15 +59,15 @@ message GetSignalInvitationInfoStartAppReq { } message GetSignalInvitationInfoStartAppResp { - sdkws.InvitationInfo invitationInfo = 1; - sdkws.OfflinePushInfo offlinePushInfo = 2; + sdkws.InvitationInfo invitationInfo = 1; + sdkws.OfflinePushInfo offlinePushInfo = 2; } message FcmUpdateTokenReq { - int32 PlatformID = 1; - string FcmToken = 2; - string account = 3; - int64 expireTime = 4; + int32 PlatformID = 1; + string FcmToken = 2; + string account = 3; + int64 expireTime = 4; } message FcmUpdateTokenResp { @@ -64,7 +82,10 @@ message SetAppBadgeResp { } service third { - rpc ApplySpace(ApplySpaceReq) returns(ApplySpaceResp); + rpc ApplyPut(ApplyPutReq) returns(ApplyPutResp); + rpc GetPut(GetPutReq) returns(GetPutResp); + rpc ConfirmPut(ConfirmPutReq) returns(ConfirmPutResp); + rpc GetSignalInvitationInfo(GetSignalInvitationInfoReq) returns(GetSignalInvitationInfoResp); rpc GetSignalInvitationInfoStartApp(GetSignalInvitationInfoStartAppReq) returns(GetSignalInvitationInfoStartAppResp); rpc FcmUpdateToken(FcmUpdateTokenReq) returns(FcmUpdateTokenResp);