mirror of
				https://github.com/openimsdk/open-im-server.git
				synced 2025-11-04 19:32:17 +08:00 
			
		
		
		
	Merge branch 'main' into main
This commit is contained in:
		
						commit
						6e3d17e694
					
				
							
								
								
									
										15
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										15
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@ -4,6 +4,19 @@ logs
 | 
			
		||||
components
 | 
			
		||||
logs
 | 
			
		||||
out-test
 | 
			
		||||
.github
 | 
			
		||||
.idea
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
deploy/open_im_demo
 | 
			
		||||
deploy/open_im_api
 | 
			
		||||
deploy/open_im_msg_gateway
 | 
			
		||||
deploy/open_im_msg_transfer
 | 
			
		||||
deploy/open_im_push
 | 
			
		||||
deploy/open_im_timer_task
 | 
			
		||||
deploy/open_im_rpc_user
 | 
			
		||||
deploy/open_im_rpc_friend
 | 
			
		||||
deploy/open_im_rpc_group
 | 
			
		||||
deploy/open_im_rpc_msg
 | 
			
		||||
deploy/open_im_rpc_auth
 | 
			
		||||
deploy/Open-IM-SDK-Core
 | 
			
		||||
 | 
			
		||||
@ -1 +1 @@
 | 
			
		||||
Subproject commit a85c10dbffbb797b5b2091e209ff67a5534b9bfc
 | 
			
		||||
Subproject commit dd23b4b185a273d38e73d51990c531e37ab5ba3b
 | 
			
		||||
@ -3,6 +3,7 @@ package main
 | 
			
		||||
import (
 | 
			
		||||
	apiAuth "Open_IM/internal/api/auth"
 | 
			
		||||
	apiChat "Open_IM/internal/api/chat"
 | 
			
		||||
	"Open_IM/internal/api/conversation"
 | 
			
		||||
	"Open_IM/internal/api/friend"
 | 
			
		||||
	"Open_IM/internal/api/group"
 | 
			
		||||
	"Open_IM/internal/api/manage"
 | 
			
		||||
@ -11,93 +12,100 @@ import (
 | 
			
		||||
	"Open_IM/pkg/common/log"
 | 
			
		||||
	"Open_IM/pkg/utils"
 | 
			
		||||
	"flag"
 | 
			
		||||
	"github.com/gin-gonic/gin"
 | 
			
		||||
	"strconv"
 | 
			
		||||
 | 
			
		||||
	"github.com/gin-gonic/gin"
 | 
			
		||||
	//"syscall"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func main() {
 | 
			
		||||
 | 
			
		||||
	//logFile, err := os.OpenFile("./fatal.log", os.O_CREATE|os.O_APPEND|os.O_RDWR, 0660)
 | 
			
		||||
	//	if err != nil {
 | 
			
		||||
 | 
			
		||||
	//	return
 | 
			
		||||
	//	}
 | 
			
		||||
	//syscall.Dup2(int(logFile.Fd()), int(os.Stderr.Fd()))
 | 
			
		||||
 | 
			
		||||
	//log.Info("", "", "api server running...")
 | 
			
		||||
	gin.SetMode(gin.ReleaseMode)
 | 
			
		||||
	r := gin.Default()
 | 
			
		||||
	r.Use(utils.CorsHandler())
 | 
			
		||||
	// user routing group, which handles user registration and login services
 | 
			
		||||
	userRouterGroup := r.Group("/user")
 | 
			
		||||
	{
 | 
			
		||||
		userRouterGroup.POST("/update_user_info", user.UpdateUserInfo)
 | 
			
		||||
		userRouterGroup.POST("/get_user_info", user.GetUserInfo)
 | 
			
		||||
		userRouterGroup.POST("/update_user_info", user.UpdateUserInfo)    //1
 | 
			
		||||
		userRouterGroup.POST("/get_users_info", user.GetUsersInfo)        //1
 | 
			
		||||
		userRouterGroup.POST("/get_self_user_info", user.GetSelfUserInfo) //1
 | 
			
		||||
	}
 | 
			
		||||
	//friend routing group
 | 
			
		||||
	friendRouterGroup := r.Group("/friend")
 | 
			
		||||
	{
 | 
			
		||||
		friendRouterGroup.POST("/get_friends_info", friend.GetFriendsInfo)
 | 
			
		||||
		friendRouterGroup.POST("/add_friend", friend.AddFriend)
 | 
			
		||||
		friendRouterGroup.POST("/get_friend_apply_list", friend.GetFriendApplyList)
 | 
			
		||||
		friendRouterGroup.POST("/get_self_apply_list", friend.GetSelfApplyList)
 | 
			
		||||
		friendRouterGroup.POST("/get_friend_list", friend.GetFriendList)
 | 
			
		||||
		friendRouterGroup.POST("/add_blacklist", friend.AddBlacklist)
 | 
			
		||||
		friendRouterGroup.POST("/get_blacklist", friend.GetBlacklist)
 | 
			
		||||
		friendRouterGroup.POST("/remove_blacklist", friend.RemoveBlacklist)
 | 
			
		||||
		friendRouterGroup.POST("/delete_friend", friend.DeleteFriend)
 | 
			
		||||
		friendRouterGroup.POST("/add_friend_response", friend.AddFriendResponse)
 | 
			
		||||
		friendRouterGroup.POST("/set_friend_comment", friend.SetFriendComment)
 | 
			
		||||
		friendRouterGroup.POST("/is_friend", friend.IsFriend)
 | 
			
		||||
		friendRouterGroup.POST("/import_friend", friend.ImportFriend)
 | 
			
		||||
		//	friendRouterGroup.POST("/get_friends_info", friend.GetFriendsInfo)
 | 
			
		||||
		friendRouterGroup.POST("/add_friend", friend.AddFriend)                              //1
 | 
			
		||||
		friendRouterGroup.POST("/delete_friend", friend.DeleteFriend)                        //1
 | 
			
		||||
		friendRouterGroup.POST("/get_friend_apply_list", friend.GetFriendApplyList)          //1
 | 
			
		||||
		friendRouterGroup.POST("/get_self_friend_apply_list", friend.GetSelfFriendApplyList) //1
 | 
			
		||||
		friendRouterGroup.POST("/get_friend_list", friend.GetFriendList)                     //1
 | 
			
		||||
		friendRouterGroup.POST("/add_friend_response", friend.AddFriendResponse)             //1
 | 
			
		||||
		friendRouterGroup.POST("/set_friend_remark", friend.SetFriendRemark)                 //1
 | 
			
		||||
 | 
			
		||||
		friendRouterGroup.POST("/add_black", friend.AddBlack)          //1
 | 
			
		||||
		friendRouterGroup.POST("/get_black_list", friend.GetBlacklist) //1
 | 
			
		||||
		friendRouterGroup.POST("/remove_black", friend.RemoveBlack)    //1
 | 
			
		||||
 | 
			
		||||
		friendRouterGroup.POST("/import_friend", friend.ImportFriend) //1
 | 
			
		||||
		friendRouterGroup.POST("/is_friend", friend.IsFriend)         //1
 | 
			
		||||
	}
 | 
			
		||||
	//group related routing group
 | 
			
		||||
	groupRouterGroup := r.Group("/group")
 | 
			
		||||
	{
 | 
			
		||||
		groupRouterGroup.POST("/create_group", group.CreateGroup)
 | 
			
		||||
		groupRouterGroup.POST("/set_group_info", group.SetGroupInfo)
 | 
			
		||||
		groupRouterGroup.POST("join_group", group.JoinGroup)
 | 
			
		||||
		groupRouterGroup.POST("/quit_group", group.QuitGroup)
 | 
			
		||||
		groupRouterGroup.POST("/group_application_response", group.ApplicationGroupResponse)
 | 
			
		||||
		groupRouterGroup.POST("/transfer_group", group.TransferGroupOwner)
 | 
			
		||||
		groupRouterGroup.POST("/get_group_applicationList", group.GetGroupApplicationList)
 | 
			
		||||
		groupRouterGroup.POST("/get_groups_info", group.GetGroupsInfo)
 | 
			
		||||
		groupRouterGroup.POST("/kick_group", group.KickGroupMember)
 | 
			
		||||
		groupRouterGroup.POST("/get_group_member_list", group.GetGroupMemberList)
 | 
			
		||||
		groupRouterGroup.POST("/get_group_all_member_list", group.GetGroupAllMember)
 | 
			
		||||
		groupRouterGroup.POST("/get_group_members_info", group.GetGroupMembersInfo)
 | 
			
		||||
		groupRouterGroup.POST("/invite_user_to_group", group.InviteUserToGroup)
 | 
			
		||||
		groupRouterGroup.POST("/get_joined_group_list", group.GetJoinedGroupList)
 | 
			
		||||
		groupRouterGroup.POST("/create_group", group.CreateGroup)                                   //1
 | 
			
		||||
		groupRouterGroup.POST("/set_group_info", group.SetGroupInfo)                                //1
 | 
			
		||||
		groupRouterGroup.POST("join_group", group.JoinGroup)                                        //1
 | 
			
		||||
		groupRouterGroup.POST("/quit_group", group.QuitGroup)                                       //1
 | 
			
		||||
		groupRouterGroup.POST("/group_application_response", group.ApplicationGroupResponse)        //1
 | 
			
		||||
		groupRouterGroup.POST("/transfer_group", group.TransferGroupOwner)                          //1
 | 
			
		||||
		groupRouterGroup.POST("/get_recv_group_applicationList", group.GetRecvGroupApplicationList) //1
 | 
			
		||||
		groupRouterGroup.POST("/get_user_req_group_applicationList", group.GetUserReqGroupApplicationList)
 | 
			
		||||
		groupRouterGroup.POST("/get_groups_info", group.GetGroupsInfo)                   //1
 | 
			
		||||
		groupRouterGroup.POST("/kick_group", group.KickGroupMember)                      //1
 | 
			
		||||
		groupRouterGroup.POST("/get_group_member_list", group.GetGroupMemberList)        //no use
 | 
			
		||||
		groupRouterGroup.POST("/get_group_all_member_list", group.GetGroupAllMemberList) //1
 | 
			
		||||
		groupRouterGroup.POST("/get_group_members_info", group.GetGroupMembersInfo)      //1
 | 
			
		||||
		groupRouterGroup.POST("/invite_user_to_group", group.InviteUserToGroup)          //1
 | 
			
		||||
		groupRouterGroup.POST("/get_joined_group_list", group.GetJoinedGroupList)        //1
 | 
			
		||||
	}
 | 
			
		||||
	//certificate
 | 
			
		||||
	authRouterGroup := r.Group("/auth")
 | 
			
		||||
	{
 | 
			
		||||
		authRouterGroup.POST("/user_register", apiAuth.UserRegister)
 | 
			
		||||
		authRouterGroup.POST("/user_token", apiAuth.UserToken)
 | 
			
		||||
		authRouterGroup.POST("/user_register", apiAuth.UserRegister) //1
 | 
			
		||||
		authRouterGroup.POST("/user_token", apiAuth.UserToken)       //1
 | 
			
		||||
	}
 | 
			
		||||
	//Third service
 | 
			
		||||
	thirdGroup := r.Group("/third")
 | 
			
		||||
	{
 | 
			
		||||
		thirdGroup.POST("/tencent_cloud_storage_credential", apiThird.TencentCloudStorageCredential)
 | 
			
		||||
		thirdGroup.POST("/aliyun_cloud_storage_credential", apiThird.AliyunCloudStorageCredential)
 | 
			
		||||
		thirdGroup.POST("/ali_oss_credential", apiThird.AliOSSCredential)
 | 
			
		||||
		thirdGroup.POST("/minio_storage_credential", apiThird.MinioStorageCredential)
 | 
			
		||||
	}
 | 
			
		||||
	//Message
 | 
			
		||||
	chatGroup := r.Group("/chat")
 | 
			
		||||
	chatGroup := r.Group("/msg")
 | 
			
		||||
	{
 | 
			
		||||
		chatGroup.POST("/newest_seq", apiChat.UserGetSeq)
 | 
			
		||||
		chatGroup.POST("/pull_msg", apiChat.UserPullMsg)
 | 
			
		||||
		chatGroup.POST("/send_msg", apiChat.UserSendMsg)
 | 
			
		||||
		chatGroup.POST("/pull_msg_by_seq", apiChat.UserPullMsgBySeqList)
 | 
			
		||||
		chatGroup.POST("/newest_seq", apiChat.GetSeq)
 | 
			
		||||
		chatGroup.POST("/send_msg", apiChat.SendMsg)
 | 
			
		||||
		chatGroup.POST("/pull_msg_by_seq", apiChat.PullMsgBySeqList)
 | 
			
		||||
	}
 | 
			
		||||
	//Manager
 | 
			
		||||
	managementGroup := r.Group("/manager")
 | 
			
		||||
	{
 | 
			
		||||
		managementGroup.POST("/delete_user", manage.DeleteUser)
 | 
			
		||||
		managementGroup.POST("/delete_user", manage.DeleteUser) //1
 | 
			
		||||
		managementGroup.POST("/send_msg", manage.ManagementSendMsg)
 | 
			
		||||
		managementGroup.POST("/get_all_users_uid", manage.GetAllUsersUid)
 | 
			
		||||
		managementGroup.POST("/get_all_users_uid", manage.GetAllUsersUid)             //1
 | 
			
		||||
		managementGroup.POST("/account_check", manage.AccountCheck)                   //1
 | 
			
		||||
		managementGroup.POST("/get_users_online_status", manage.GetUsersOnlineStatus) //1
 | 
			
		||||
	}
 | 
			
		||||
	//Conversation
 | 
			
		||||
	conversationGroup := r.Group("/conversation")
 | 
			
		||||
	{
 | 
			
		||||
		conversationGroup.POST("/set_receive_message_opt", conversation.SetReceiveMessageOpt)                  //1
 | 
			
		||||
		conversationGroup.POST("/get_receive_message_opt", conversation.GetReceiveMessageOpt)                  //1
 | 
			
		||||
		conversationGroup.POST("/get_all_conversation_message_opt", conversation.GetAllConversationMessageOpt) //1
 | 
			
		||||
	}
 | 
			
		||||
	apiThird.MinioInit()
 | 
			
		||||
	log.NewPrivateLog("api")
 | 
			
		||||
	ginPort := flag.Int("port", 10000, "get ginServerPort from cmd,default 10000 as port")
 | 
			
		||||
	flag.Parse()
 | 
			
		||||
	r.Run(utils.ServerIP + ":" + strconv.Itoa(*ginPort))
 | 
			
		||||
	r.Run(":" + strconv.Itoa(*ginPort))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										25
									
								
								cmd/open_im_cms_api/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								cmd/open_im_cms_api/Makefile
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,25 @@
 | 
			
		||||
.PHONY: all build run gotool install clean help
 | 
			
		||||
 | 
			
		||||
BINARY_NAME=open_im_cms_api
 | 
			
		||||
BIN_DIR=../../bin/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
all: gotool build
 | 
			
		||||
 | 
			
		||||
build:
 | 
			
		||||
	CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-w -s"
 | 
			
		||||
 | 
			
		||||
run:
 | 
			
		||||
	@go run ./
 | 
			
		||||
 | 
			
		||||
gotool:
 | 
			
		||||
	go fmt ./
 | 
			
		||||
	go vet ./
 | 
			
		||||
 | 
			
		||||
install:
 | 
			
		||||
	make build
 | 
			
		||||
	mv ${BINARY_NAME} ${BIN_DIR}
 | 
			
		||||
 | 
			
		||||
clean:
 | 
			
		||||
	@if [ -f ${BINARY_NAME} ] ; then rm ${BINARY_NAME} ; fi
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										15
									
								
								cmd/open_im_cms_api/main.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								cmd/open_im_cms_api/main.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,15 @@
 | 
			
		||||
package main
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"Open_IM/internal/cms_api"
 | 
			
		||||
	"Open_IM/pkg/utils"
 | 
			
		||||
 | 
			
		||||
	"github.com/gin-gonic/gin"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func main() {
 | 
			
		||||
	gin.SetMode(gin.ReleaseMode)
 | 
			
		||||
	router := cms_api.NewGinRouter()
 | 
			
		||||
	router.Use(utils.CorsHandler())
 | 
			
		||||
	router.Run(":" + "8000")
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										25
									
								
								cmd/open_im_demo/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								cmd/open_im_demo/Makefile
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,25 @@
 | 
			
		||||
.PHONY: all build run gotool install clean help
 | 
			
		||||
 | 
			
		||||
BINARY_NAME=open_im_demo
 | 
			
		||||
BIN_DIR=../../bin/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
all: gotool build
 | 
			
		||||
 | 
			
		||||
build:
 | 
			
		||||
	CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-w -s"
 | 
			
		||||
 | 
			
		||||
run:
 | 
			
		||||
	@go run ./
 | 
			
		||||
 | 
			
		||||
gotool:
 | 
			
		||||
	go fmt ./
 | 
			
		||||
	go vet ./
 | 
			
		||||
 | 
			
		||||
install:
 | 
			
		||||
	make build
 | 
			
		||||
	mv ${BINARY_NAME} ${BIN_DIR}
 | 
			
		||||
 | 
			
		||||
clean:
 | 
			
		||||
	@if [ -f ${BINARY_NAME} ] ; then rm ${BINARY_NAME} ; fi
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										30
									
								
								cmd/open_im_demo/main.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								cmd/open_im_demo/main.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,30 @@
 | 
			
		||||
package main
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"Open_IM/internal/demo/register"
 | 
			
		||||
	"Open_IM/pkg/common/log"
 | 
			
		||||
	"Open_IM/pkg/utils"
 | 
			
		||||
	"flag"
 | 
			
		||||
	"strconv"
 | 
			
		||||
 | 
			
		||||
	"github.com/gin-gonic/gin"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func main() {
 | 
			
		||||
 | 
			
		||||
	r := gin.Default()
 | 
			
		||||
	r.Use(utils.CorsHandler())
 | 
			
		||||
 | 
			
		||||
	authRouterGroup := r.Group("/auth")
 | 
			
		||||
	{
 | 
			
		||||
		authRouterGroup.POST("/code", register.SendVerificationCode)
 | 
			
		||||
		authRouterGroup.POST("/verify", register.Verify)
 | 
			
		||||
		authRouterGroup.POST("/password", register.SetPassword)
 | 
			
		||||
		authRouterGroup.POST("/login", register.Login)
 | 
			
		||||
		authRouterGroup.POST("/reset_password", register.ResetPassword)
 | 
			
		||||
	}
 | 
			
		||||
	log.NewPrivateLog("demo")
 | 
			
		||||
	ginPort := flag.Int("port", 42233, "get ginServerPort from cmd,default 42233 as port")
 | 
			
		||||
	flag.Parse()
 | 
			
		||||
	r.Run(":" + strconv.Itoa(*ginPort))
 | 
			
		||||
}
 | 
			
		||||
@ -40,19 +40,19 @@ func main() {
 | 
			
		||||
	//	}
 | 
			
		||||
	//}
 | 
			
		||||
	for {
 | 
			
		||||
		uidList, err := im_mysql_model.SelectAllUID()
 | 
			
		||||
		uidList, err := im_mysql_model.SelectAllUserID()
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			log.NewError("999999", err.Error())
 | 
			
		||||
			//log.NewError("999999", err.Error())
 | 
			
		||||
		} else {
 | 
			
		||||
			for _, v := range uidList {
 | 
			
		||||
				minSeq, err := commonDB.DB.GetMinSeqFromMongo(v)
 | 
			
		||||
				if err != nil {
 | 
			
		||||
					log.NewError("999999", "get user minSeq err", err.Error(), v)
 | 
			
		||||
					//log.NewError("999999", "get user minSeq err", err.Error(), v)
 | 
			
		||||
					continue
 | 
			
		||||
				} else {
 | 
			
		||||
					err := commonDB.DB.SetUserMinSeq(v, minSeq)
 | 
			
		||||
					if err != nil {
 | 
			
		||||
						log.NewError("999999", "set user minSeq err", err.Error(), v)
 | 
			
		||||
						//log.NewError("999999", "set user minSeq err", err.Error(), v)
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
				time.Sleep(time.Duration(100) * time.Millisecond)
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										23
									
								
								cmd/rpc/open_im_admin_cms/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								cmd/rpc/open_im_admin_cms/Makefile
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,23 @@
 | 
			
		||||
.PHONY: all build run gotool install clean help
 | 
			
		||||
 | 
			
		||||
BINARY_NAME=open_im_admin_cms
 | 
			
		||||
BIN_DIR=../../../bin/
 | 
			
		||||
 | 
			
		||||
all: gotool build
 | 
			
		||||
 | 
			
		||||
build:
 | 
			
		||||
	CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-w -s"
 | 
			
		||||
 | 
			
		||||
run:
 | 
			
		||||
	@go run ./
 | 
			
		||||
 | 
			
		||||
gotool:
 | 
			
		||||
	go fmt ./
 | 
			
		||||
	go vet ./
 | 
			
		||||
 | 
			
		||||
install:
 | 
			
		||||
	make build
 | 
			
		||||
	mv ${BINARY_NAME} ${BIN_DIR}
 | 
			
		||||
 | 
			
		||||
clean:
 | 
			
		||||
	@if [ -f ${BINARY_NAME} ] ; then rm ${BINARY_NAME} ; fi
 | 
			
		||||
							
								
								
									
										14
									
								
								cmd/rpc/open_im_admin_cms/main.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								cmd/rpc/open_im_admin_cms/main.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,14 @@
 | 
			
		||||
package main
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	rpcMessageCMS "Open_IM/internal/rpc/admin_cms"
 | 
			
		||||
	"flag"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func main() {
 | 
			
		||||
	rpcPort := flag.Int("port", 11000, "rpc listening port")
 | 
			
		||||
	flag.Parse()
 | 
			
		||||
	rpcServer := rpcMessageCMS.NewAdminCMSServer(*rpcPort)
 | 
			
		||||
	rpcServer.Run()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -10,4 +10,5 @@ func main() {
 | 
			
		||||
	flag.Parse()
 | 
			
		||||
	rpcServer := rpcAuth.NewRpcAuthServer(*rpcPort)
 | 
			
		||||
	rpcServer.Run()
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										23
									
								
								cmd/rpc/open_im_message_cms/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								cmd/rpc/open_im_message_cms/Makefile
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,23 @@
 | 
			
		||||
.PHONY: all build run gotool install clean help
 | 
			
		||||
 | 
			
		||||
BINARY_NAME=open_im_message_cms
 | 
			
		||||
BIN_DIR=../../../bin/
 | 
			
		||||
 | 
			
		||||
all: gotool build
 | 
			
		||||
 | 
			
		||||
build:
 | 
			
		||||
	CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-w -s"
 | 
			
		||||
 | 
			
		||||
run:
 | 
			
		||||
	@go run ./
 | 
			
		||||
 | 
			
		||||
gotool:
 | 
			
		||||
	go fmt ./
 | 
			
		||||
	go vet ./
 | 
			
		||||
 | 
			
		||||
install:
 | 
			
		||||
	make build
 | 
			
		||||
	mv ${BINARY_NAME} ${BIN_DIR}
 | 
			
		||||
 | 
			
		||||
clean:
 | 
			
		||||
	@if [ -f ${BINARY_NAME} ] ; then rm ${BINARY_NAME} ; fi
 | 
			
		||||
							
								
								
									
										13
									
								
								cmd/rpc/open_im_message_cms/main.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								cmd/rpc/open_im_message_cms/main.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,13 @@
 | 
			
		||||
package main
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	rpcMessageCMS "Open_IM/internal/rpc/message_cms"
 | 
			
		||||
	"flag"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func main() {
 | 
			
		||||
	rpcPort := flag.Int("port", 10900, "rpc listening port")
 | 
			
		||||
	flag.Parse()
 | 
			
		||||
	rpcServer := rpcMessageCMS.NewMessageCMSServer(*rpcPort)
 | 
			
		||||
	rpcServer.Run()
 | 
			
		||||
}
 | 
			
		||||
@ -1,7 +1,7 @@
 | 
			
		||||
package main
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	rpcChat "Open_IM/internal/rpc/chat"
 | 
			
		||||
	rpcChat "Open_IM/internal/rpc/msg"
 | 
			
		||||
	"flag"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										23
									
								
								cmd/rpc/open_im_statistics/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								cmd/rpc/open_im_statistics/Makefile
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,23 @@
 | 
			
		||||
.PHONY: all build run gotool install clean help
 | 
			
		||||
 | 
			
		||||
BINARY_NAME=open_im_statistics
 | 
			
		||||
BIN_DIR=../../../bin/
 | 
			
		||||
 | 
			
		||||
all: gotool build
 | 
			
		||||
 | 
			
		||||
build:
 | 
			
		||||
	CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-w -s"
 | 
			
		||||
 | 
			
		||||
run:
 | 
			
		||||
	@go run ./
 | 
			
		||||
 | 
			
		||||
gotool:
 | 
			
		||||
	go fmt ./
 | 
			
		||||
	go vet ./
 | 
			
		||||
 | 
			
		||||
install:
 | 
			
		||||
	make build
 | 
			
		||||
	mv ${BINARY_NAME} ${BIN_DIR}
 | 
			
		||||
 | 
			
		||||
clean:
 | 
			
		||||
	@if [ -f ${BINARY_NAME} ] ; then rm ${BINARY_NAME} ; fi
 | 
			
		||||
							
								
								
									
										13
									
								
								cmd/rpc/open_im_statistics/main.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								cmd/rpc/open_im_statistics/main.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,13 @@
 | 
			
		||||
package main
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"Open_IM/internal/rpc/statistics"
 | 
			
		||||
	"flag"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func main() {
 | 
			
		||||
	rpcPort := flag.Int("port", 10800, "rpc listening port")
 | 
			
		||||
	flag.Parse()
 | 
			
		||||
	rpcServer := statistics.NewStatisticsServer(*rpcPort)
 | 
			
		||||
	rpcServer.Run()
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										69
									
								
								cmd/test/main.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								cmd/test/main.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,69 @@
 | 
			
		||||
package main
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"Open_IM/pkg/utils"
 | 
			
		||||
	"context"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"go.mongodb.org/mongo-driver/bson"
 | 
			
		||||
	"go.mongodb.org/mongo-driver/mongo"
 | 
			
		||||
	"go.mongodb.org/mongo-driver/mongo/options"
 | 
			
		||||
	"time"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type MongoMsg struct {
 | 
			
		||||
	UID string
 | 
			
		||||
	Msg []string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
func main()  {
 | 
			
		||||
	//"mongodb://%s:%s@%s/%s/?maxPoolSize=%d"
 | 
			
		||||
	uri := "mongodb://user:pass@sample.host:27017/?maxPoolSize=20&w=majority"
 | 
			
		||||
	DBAddress := "127.0.0.1:37017"
 | 
			
		||||
	DBDatabase := "new-test-db"
 | 
			
		||||
	Collection := "new-test-collection"
 | 
			
		||||
	DBMaxPoolSize := 100
 | 
			
		||||
	uri = fmt.Sprintf("mongodb://%s/%s/?maxPoolSize=%d",
 | 
			
		||||
		DBAddress,DBDatabase,
 | 
			
		||||
		DBMaxPoolSize)
 | 
			
		||||
 | 
			
		||||
	mongoClient, err := mongo.Connect(context.TODO(), options.Client().ApplyURI(uri))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		panic(err)
 | 
			
		||||
	}
 | 
			
		||||
	filter := bson.M{"uid":"my_uid"}
 | 
			
		||||
	ctx, _ := context.WithTimeout(context.Background(), 30*time.Second)
 | 
			
		||||
	for i:=0; i < 2; i++{
 | 
			
		||||
 | 
			
		||||
		if err = mongoClient.Database(DBDatabase).Collection(Collection).FindOneAndUpdate(ctx, filter,
 | 
			
		||||
			bson.M{"$push": bson.M{"msg": utils.Int32ToString(int32(i))}}).Err(); err != nil{
 | 
			
		||||
			fmt.Println("FindOneAndUpdate failed ", i, )
 | 
			
		||||
			var mmsg MongoMsg
 | 
			
		||||
			mmsg.UID = "my_uid"
 | 
			
		||||
			mmsg.Msg = append(mmsg.Msg, utils.Int32ToString(int32(i)))
 | 
			
		||||
			_, err := mongoClient.Database(DBDatabase).Collection(Collection).InsertOne(ctx, &mmsg)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				fmt.Println("insertone failed ", err.Error(), i)
 | 
			
		||||
			} else{
 | 
			
		||||
				fmt.Println("insertone ok ", i)
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
		}else {
 | 
			
		||||
			fmt.Println("FindOneAndUpdate ok ", i)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var mmsg MongoMsg
 | 
			
		||||
 | 
			
		||||
	if  err = mongoClient.Database(DBDatabase).Collection(Collection).FindOne(ctx, filter).Decode(&mmsg); err != nil {
 | 
			
		||||
		fmt.Println("findone failed ", err.Error())
 | 
			
		||||
	}else{
 | 
			
		||||
		fmt.Println("findone ok ", mmsg.UID)
 | 
			
		||||
		for i, v:=range mmsg.Msg{
 | 
			
		||||
			fmt.Println("find value: ", i, v)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@ -1,47 +1,48 @@
 | 
			
		||||
# The class cannot be named by Pascal or camel case.
 | 
			
		||||
# If it is not used, the corresponding structure will not be set,
 | 
			
		||||
# and it will not be read naturally.
 | 
			
		||||
serverversion: 1.0.3
 | 
			
		||||
serverversion: 2.0.0
 | 
			
		||||
#---------------Infrastructure configuration---------------------#
 | 
			
		||||
etcd:
 | 
			
		||||
  etcdSchema: openIM
 | 
			
		||||
  etcdAddr: [ 127.0.0.1:2379 ]
 | 
			
		||||
  etcdSchema: openIM  #默认即可
 | 
			
		||||
  etcdAddr: [ 127.0.0.1:2379 ] #单机部署时,默认即可
 | 
			
		||||
 | 
			
		||||
mysql:
 | 
			
		||||
  dbMysqlAddress: [ 127.0.0.1:13306 ]
 | 
			
		||||
  dbMysqlUserName: root
 | 
			
		||||
  dbMysqlPassword: openIM
 | 
			
		||||
  dbMysqlDatabaseName: openIM
 | 
			
		||||
  dbTableName: eMsg
 | 
			
		||||
  dbMysqlAddress: [ 127.0.0.1:13306 ] #mysql地址 目前仅支持单机,默认即可
 | 
			
		||||
  dbMysqlUserName: root #mysql用户名,建议修改
 | 
			
		||||
  dbMysqlPassword: openIM # mysql密码,建议修改
 | 
			
		||||
  dbMysqlDatabaseName: openIM_v2 #默认即可
 | 
			
		||||
  dbTableName: eMsg #默认即可
 | 
			
		||||
  dbMsgTableNum: 1
 | 
			
		||||
  dbMaxOpenConns: 20
 | 
			
		||||
  dbMaxIdleConns: 10
 | 
			
		||||
  dbMaxLifeTime: 120
 | 
			
		||||
 | 
			
		||||
mongo:
 | 
			
		||||
  dbAddress: [ 127.0.0.1:37017 ]
 | 
			
		||||
  dbUri: ""#当dbUri值不为空则直接使用该值
 | 
			
		||||
  dbAddress: [ 127.0.0.1:37017 ] #mongo地址 目前仅支持单机,默认即可
 | 
			
		||||
  dbDirect: false
 | 
			
		||||
  dbTimeout: 10
 | 
			
		||||
  dbDatabase: openIM
 | 
			
		||||
  dbDatabase: openIM  #mongo db 默认即可
 | 
			
		||||
  dbSource: admin
 | 
			
		||||
  dbUserName:
 | 
			
		||||
  dbPassword:
 | 
			
		||||
  dbUserName: #mongo用户名,建议先不设置
 | 
			
		||||
  dbPassword: #mongo密码,建议先不设置
 | 
			
		||||
  dbMaxPoolSize: 20
 | 
			
		||||
  dbRetainChatRecords: 7
 | 
			
		||||
  dbRetainChatRecords: 3650 #mongo保存离线消息时间(天),根据需求修改
 | 
			
		||||
 | 
			
		||||
redis:
 | 
			
		||||
  dbAddress: 127.0.0.1:16379
 | 
			
		||||
  dbAddress: 127.0.0.1:16379 #redis地址 目前仅支持单机,默认即可
 | 
			
		||||
  dbMaxIdle: 128
 | 
			
		||||
  dbMaxActive: 0
 | 
			
		||||
  dbIdleTimeout: 120
 | 
			
		||||
  dbPassWord: openIM
 | 
			
		||||
  dbPassWord: openIM #redis密码 建议修改
 | 
			
		||||
 | 
			
		||||
kafka:
 | 
			
		||||
  ws2mschat:
 | 
			
		||||
    addr: [ 127.0.0.1:9092 ]
 | 
			
		||||
    addr: [ 127.0.0.1:9092 ] #kafka配置,默认即可
 | 
			
		||||
    topic: "ws2ms_chat"
 | 
			
		||||
  ms2pschat:
 | 
			
		||||
    addr: [ 127.0.0.1:9092 ]
 | 
			
		||||
    addr: [ 127.0.0.1:9092 ] #kafka配置,默认即可
 | 
			
		||||
    topic: "ms2ps_chat"
 | 
			
		||||
  consumergroupid:
 | 
			
		||||
    msgToMongo: mongo
 | 
			
		||||
@ -55,39 +56,80 @@ kafka:
 | 
			
		||||
# The service ip default is empty,
 | 
			
		||||
# automatically obtain the machine's valid network card ip as the service ip,
 | 
			
		||||
# otherwise the configuration ip is preferred
 | 
			
		||||
#如果是单机模式,用0.0.0.0或者不填,默认即可
 | 
			
		||||
serverip: 0.0.0.0
 | 
			
		||||
 | 
			
		||||
api:
 | 
			
		||||
  openImApiPort: [ 10000 ]
 | 
			
		||||
sdk:
 | 
			
		||||
  openImSdkWsPort: [ 30000 ]
 | 
			
		||||
# endpoints 内部组件间访问的端点host名称,访问时,可以内部直接访问 host:port 来访问
 | 
			
		||||
endpoints:
 | 
			
		||||
  api: openim_api
 | 
			
		||||
  cmsapi: openim_cms_api
 | 
			
		||||
  push: openim_push
 | 
			
		||||
  msg_gateway: openim_msg_gateway
 | 
			
		||||
  rpc_auth: openim_rpc_auth
 | 
			
		||||
  rpc_friend: openim_rpc_friend
 | 
			
		||||
  rpc_group: openim_rpc_group
 | 
			
		||||
  rpc_msg: openim_rpc_msg
 | 
			
		||||
  rpc_user: openim_rpc_user
 | 
			
		||||
  rpc_statistic: openim_rpc_statistic
 | 
			
		||||
  rpc_admin_cms: openim_rpc_admin_cms
 | 
			
		||||
  rpc_message_cms: openim_rpc_admin_cms
 | 
			
		||||
 | 
			
		||||
credential:
 | 
			
		||||
 | 
			
		||||
api:
 | 
			
		||||
  openImApiPort: [ 10000 ] #api服务端口,默认即可,需要开放此端口或做nginx转发
 | 
			
		||||
cmsapi:
 | 
			
		||||
  openImCmsApiPort: [ 8000 ] #管理后台api服务端口,默认即可,需要开放此端口或做nginx转发
 | 
			
		||||
sdk:
 | 
			
		||||
  openImSdkWsPort: [ 30000 ] #jssdk服务端口,默认即可,项目中使用jssdk才需开放此端口或做nginx转发
 | 
			
		||||
 | 
			
		||||
credential: #腾讯cos,发送图片、视频、文件时需要,请自行申请后替换,必须修改
 | 
			
		||||
  tencent:
 | 
			
		||||
    appID: 1302656840
 | 
			
		||||
    region: ap-chengdu
 | 
			
		||||
    bucket: echat-1302656840
 | 
			
		||||
    secretID: AKIDGNYVChzIQinu7QEgtNp0hnNgqcV8vZTC
 | 
			
		||||
    secretKey: kz15vW83qM6dBUWIq681eBZA0c0vlIbe
 | 
			
		||||
  aliyun:
 | 
			
		||||
    accessKeyId:
 | 
			
		||||
    accessKeySecret:
 | 
			
		||||
    roleArn:
 | 
			
		||||
    regionId:
 | 
			
		||||
    region:
 | 
			
		||||
    bucket:
 | 
			
		||||
  minio: #MinIO 发送图片、视频、文件时需要,请自行申请后替换,必须修改。 客户端初始化时相应改动
 | 
			
		||||
    bucket: openim
 | 
			
		||||
    location: us-east-1
 | 
			
		||||
    endpoint: http://127.0.0.1:9000
 | 
			
		||||
    accessKeyID: user12345
 | 
			
		||||
    secretAccessKey: key12345
 | 
			
		||||
  ali: # ali oss
 | 
			
		||||
    regionID: "oss-cn-beijing"
 | 
			
		||||
    accessKeyID: ""
 | 
			
		||||
    accessKeySecret: ""
 | 
			
		||||
    stsEndpoint: "sts.cn-beijing.aliyun.com"
 | 
			
		||||
    ossEndpoint: "oss-cn-beijing.aliyuncs.com"
 | 
			
		||||
    bucket: "bucket1"
 | 
			
		||||
    finalHost: "http://bucket1.oss-cn-beijing.aliyuncs.com"
 | 
			
		||||
    stsDurationSeconds: 3600
 | 
			
		||||
    OssRoleArn: "acs:ram::xxx:role/xxx"
 | 
			
		||||
 | 
			
		||||
rpcport:
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
rpcport: #rpc服务端口 默认即可
 | 
			
		||||
  openImUserPort: [ 10100 ]
 | 
			
		||||
  openImFriendPort: [ 10200 ]
 | 
			
		||||
  openImOfflineMessagePort: [ 10300]
 | 
			
		||||
  openImOfflineMessagePort: [ 10300 ]
 | 
			
		||||
  openImOnlineRelayPort: [ 10400 ]
 | 
			
		||||
  openImGroupPort: [ 10500  ]
 | 
			
		||||
  openImGroupPort: [ 10500 ]
 | 
			
		||||
  openImAuthPort: [ 10600 ]
 | 
			
		||||
  openImPushPort: [ 10700 ]
 | 
			
		||||
  openImStatisticsPort: [ 10800 ]
 | 
			
		||||
  openImMessageCmsPort: [ 10900 ]
 | 
			
		||||
  openImAdminCmsPort: [ 11000 ]
 | 
			
		||||
  c2c:
 | 
			
		||||
    callbackBeforeSendMsg:
 | 
			
		||||
      switch: false
 | 
			
		||||
      timeoutStrategy: 1 #1:send
 | 
			
		||||
    callbackAfterSendMsg:
 | 
			
		||||
      switch: false
 | 
			
		||||
  state:
 | 
			
		||||
    stateChange:
 | 
			
		||||
      switch: false
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
rpcregistername:
 | 
			
		||||
rpcregistername: #rpc注册服务名,默认即可
 | 
			
		||||
  openImUserName: User
 | 
			
		||||
  openImFriendName: Friend
 | 
			
		||||
  openImOfflineMessageName: OfflineMessage
 | 
			
		||||
@ -95,78 +137,380 @@ rpcregistername:
 | 
			
		||||
  openImOnlineMessageRelayName: OnlineMessageRelay
 | 
			
		||||
  openImGroupName: Group
 | 
			
		||||
  openImAuthName: Auth
 | 
			
		||||
  OpenImStatisticsName: Statistics
 | 
			
		||||
  OpenImMessageCMSName: MessageCMS
 | 
			
		||||
  openImAdminCMSName: AdminCMS
 | 
			
		||||
 | 
			
		||||
log:
 | 
			
		||||
  storageLocation: ../logs/
 | 
			
		||||
  rotationTime: 24
 | 
			
		||||
  remainRotationCount: 5
 | 
			
		||||
  remainLogLevel: 6
 | 
			
		||||
  remainRotationCount: 3 #日志数量
 | 
			
		||||
  #日志级别 6表示全都打印,测试阶段建议设置为6
 | 
			
		||||
  remainLogLevel: 4
 | 
			
		||||
  elasticSearchSwitch: false
 | 
			
		||||
  elasticSearchAddr: [ 127.0.0.1:9201 ]
 | 
			
		||||
  elasticSearchUser: ""
 | 
			
		||||
  elasticSearchPassword: ""
 | 
			
		||||
 | 
			
		||||
modulename:
 | 
			
		||||
modulename: #日志文件按模块命名,默认即可
 | 
			
		||||
  longConnSvrName: msg_gateway
 | 
			
		||||
  msgTransferName: msg_transfer
 | 
			
		||||
  pushName: push
 | 
			
		||||
 | 
			
		||||
longconnsvr:
 | 
			
		||||
  openImWsPort: [ 17778 ]
 | 
			
		||||
  openImWsPort: [ 17778 ] # ws服务端口,默认即可,要开放此端口或做nginx转发
 | 
			
		||||
  websocketMaxConnNum: 10000
 | 
			
		||||
  websocketMaxMsgLen: 4096
 | 
			
		||||
  websocketTimeOut: 10
 | 
			
		||||
 | 
			
		||||
push:
 | 
			
		||||
  tpns:
 | 
			
		||||
  tpns: #腾讯推送,暂未测试 暂不要使用
 | 
			
		||||
    ios:
 | 
			
		||||
      accessID: 1600018281
 | 
			
		||||
      secretKey: 3cd68a77a95b89e5089a1aca523f318f
 | 
			
		||||
    android:
 | 
			
		||||
      accessID: 111
 | 
			
		||||
      secretKey: 111
 | 
			
		||||
  jpns:
 | 
			
		||||
  jpns: #极光推送 在极光后台申请后,修改以下四项,必须修改
 | 
			
		||||
    appKey: cf47465a368f24c659608e7e
 | 
			
		||||
    masterSecret: 02204efe3f3832947a236ee5
 | 
			
		||||
    pushUrl: "https://api.jpush.cn/v3/push"
 | 
			
		||||
    pushIntent: "intent:#Intent;component=io.openim.app.enterprisechat/io.openim.app.enterprisechat.MainActivity;end"
 | 
			
		||||
manager:
 | 
			
		||||
  appManagerUid: ["openIM123456","openIM654321"]
 | 
			
		||||
  secrets: ["openIM1","openIM2"]
 | 
			
		||||
  #app管理员userID和对应的secret  建议修改。 用于管理后台登录,也可以用户管理后台对应的api
 | 
			
		||||
  appManagerUid: [ "openIM123456","openIM654321", "openIM333", "openIMAdmin"]
 | 
			
		||||
  secrets: [ "openIM1","openIM2", "openIM333", "openIMAdmin"]
 | 
			
		||||
 | 
			
		||||
secret: tuoyun
 | 
			
		||||
 | 
			
		||||
# 多端互踢策略
 | 
			
		||||
# 1:多平台登录:Android、iOS、Windows、Mac 每种平台只能一个在线,web端可以多个同时在线
 | 
			
		||||
multiloginpolicy: 1
 | 
			
		||||
 | 
			
		||||
#token config
 | 
			
		||||
tokenpolicy:
 | 
			
		||||
  accessSecret: "open_im_server"
 | 
			
		||||
  accessSecret: "open_im_server" #token生成相关,默认即可
 | 
			
		||||
  # Token effective time day as a unit
 | 
			
		||||
  accessExpire: 7
 | 
			
		||||
  accessExpire: 3650 #token过期时间(天) 默认即可
 | 
			
		||||
messageverify:
 | 
			
		||||
  friendVerify: false
 | 
			
		||||
#  c2c:
 | 
			
		||||
#    callbackBeforeSendMsg:
 | 
			
		||||
#      switch: false
 | 
			
		||||
#      timeoutStrategy: 1 #1:send
 | 
			
		||||
#    callbackAfterSendMsg:
 | 
			
		||||
#      switch: false
 | 
			
		||||
#  state:
 | 
			
		||||
#    stateChange:
 | 
			
		||||
#      switch: false
 | 
			
		||||
#ios系统推送声音以及标记计数
 | 
			
		||||
iospush:
 | 
			
		||||
  pushSound: "xxx"
 | 
			
		||||
  badgeCount: true
 | 
			
		||||
 | 
			
		||||
callback:
 | 
			
		||||
  # callback url 需要自行更换callback url
 | 
			
		||||
  callbackUrl : "http://127.0.0.1:8080/callback"
 | 
			
		||||
  # 开启关闭操作前后回调的配置
 | 
			
		||||
  callbackbeforeSendSingleMsg:
 | 
			
		||||
    enable: false # 回调是否启用
 | 
			
		||||
    callbackTimeOut: 2 # 回调超时时间
 | 
			
		||||
    CallbackFailedContinue: true # 回调超时是否继续执行代码
 | 
			
		||||
  callbackAfterSendSingleMsg:
 | 
			
		||||
    enable: false
 | 
			
		||||
    callbackTimeOut: 2
 | 
			
		||||
  callbackBeforeSendGroupMsg:
 | 
			
		||||
    enable: false
 | 
			
		||||
    callbackTimeOut: 2
 | 
			
		||||
    CallbackFailedContinue: true
 | 
			
		||||
  callbackAfterSendGroupMsg:
 | 
			
		||||
    enable: false
 | 
			
		||||
    callbackTimeOut: 2
 | 
			
		||||
  callbackWordFilter:
 | 
			
		||||
    enable: false
 | 
			
		||||
    callbackTimeOut: 2
 | 
			
		||||
    CallbackFailedContinue: true
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
notification:
 | 
			
		||||
  groupCreated:
 | 
			
		||||
    conversation:
 | 
			
		||||
      reliabilityLevel: 3
 | 
			
		||||
      unreadCount: true
 | 
			
		||||
    offlinePush:
 | 
			
		||||
      switch: true
 | 
			
		||||
      title: "create group title" # xx create the group
 | 
			
		||||
      desc: "create group desc"
 | 
			
		||||
      ext: "create group ext"
 | 
			
		||||
    defaultTips:
 | 
			
		||||
      tips: "create the group"  # xx create the group
 | 
			
		||||
 | 
			
		||||
  groupInfoSet:
 | 
			
		||||
    conversation:
 | 
			
		||||
      reliabilityLevel: 3
 | 
			
		||||
      unreadCount: true
 | 
			
		||||
    offlinePush:
 | 
			
		||||
      switch: false
 | 
			
		||||
      title: "groupInfoSet title"
 | 
			
		||||
      desc: "groupInfoSet desc"
 | 
			
		||||
      ext: "groupInfoSet ext"
 | 
			
		||||
    defaultTips:
 | 
			
		||||
      tips: "modified the group profile"  # group info changed by xx
 | 
			
		||||
 | 
			
		||||
  joinGroupApplication:
 | 
			
		||||
    conversation:
 | 
			
		||||
      reliabilityLevel: 2
 | 
			
		||||
      unreadCount: false
 | 
			
		||||
    offlinePush:
 | 
			
		||||
      switch: false
 | 
			
		||||
      title: "joinGroupApplication title"
 | 
			
		||||
      desc: "joinGroupApplication desc"
 | 
			
		||||
      ext: "joinGroupApplication ext"
 | 
			
		||||
    defaultTips:
 | 
			
		||||
      tips: "apply to join the group"  # group info changed by xx
 | 
			
		||||
 | 
			
		||||
  memberQuit:
 | 
			
		||||
    conversation:
 | 
			
		||||
      reliabilityLevel: 3
 | 
			
		||||
      unreadCount: true
 | 
			
		||||
    offlinePush:
 | 
			
		||||
      switch: false
 | 
			
		||||
      title: "memberQuit title"
 | 
			
		||||
      desc: "memberQuit desc"
 | 
			
		||||
      ext: "memberQuit ext"
 | 
			
		||||
    defaultTips:
 | 
			
		||||
      tips: "quit group chat"  # group info changed by xx
 | 
			
		||||
 | 
			
		||||
  groupApplicationAccepted:
 | 
			
		||||
    conversation:
 | 
			
		||||
      reliabilityLevel: 2
 | 
			
		||||
      unreadCount: true
 | 
			
		||||
    offlinePush:
 | 
			
		||||
      switch: false
 | 
			
		||||
      title: "groupApplicationAccepted title"
 | 
			
		||||
      desc: "groupApplicationAccepted desc"
 | 
			
		||||
      ext: "groupApplicationAccepted ext"
 | 
			
		||||
    defaultTips:
 | 
			
		||||
      tips: "was allowed to join the group"  # group info changed by xx
 | 
			
		||||
 | 
			
		||||
  groupApplicationRejected:
 | 
			
		||||
    conversation:
 | 
			
		||||
      reliabilityLevel: 2
 | 
			
		||||
      unreadCount: false
 | 
			
		||||
    offlinePush:
 | 
			
		||||
      switch: false
 | 
			
		||||
      title: " title"
 | 
			
		||||
      desc: " desc"
 | 
			
		||||
      ext: " ext"
 | 
			
		||||
    defaultTips:
 | 
			
		||||
      tips: "was rejected into the group"  # group info changed by xx
 | 
			
		||||
 | 
			
		||||
  groupOwnerTransferred:
 | 
			
		||||
    conversation:
 | 
			
		||||
      reliabilityLevel: 3
 | 
			
		||||
      unreadCount: true
 | 
			
		||||
    offlinePush:
 | 
			
		||||
      switch: false
 | 
			
		||||
      title: "groupOwnerTransferred title"
 | 
			
		||||
      desc: "groupOwnerTransferred desc"
 | 
			
		||||
      ext: "groupOwnerTransferred ext"
 | 
			
		||||
    defaultTips:
 | 
			
		||||
      tips: "become a new group owner"  # group info changed by xx
 | 
			
		||||
 | 
			
		||||
  memberKicked:
 | 
			
		||||
    conversation:
 | 
			
		||||
      reliabilityLevel: 3
 | 
			
		||||
      unreadCount: true
 | 
			
		||||
    offlinePush:
 | 
			
		||||
      switch: false
 | 
			
		||||
      title: "memberKicked title"
 | 
			
		||||
      desc: "memberKicked desc"
 | 
			
		||||
      ext: "memberKicked ext"
 | 
			
		||||
    defaultTips:
 | 
			
		||||
      tips: "was kicked out of the group"  # group info changed by xx
 | 
			
		||||
 | 
			
		||||
  memberInvited:
 | 
			
		||||
    conversation:
 | 
			
		||||
      reliabilityLevel: 3
 | 
			
		||||
      unreadCount: true
 | 
			
		||||
    offlinePush:
 | 
			
		||||
      switch: false
 | 
			
		||||
      title: "memberInvited title"
 | 
			
		||||
      desc: "memberInvited desc"
 | 
			
		||||
      ext: "memberInvited ext"
 | 
			
		||||
    defaultTips:
 | 
			
		||||
      tips: "was invited into the group"  # group info changed by xx
 | 
			
		||||
 | 
			
		||||
  memberEnter:
 | 
			
		||||
    conversation:
 | 
			
		||||
      reliabilityLevel: 3
 | 
			
		||||
      unreadCount: true
 | 
			
		||||
    offlinePush:
 | 
			
		||||
      switch: false
 | 
			
		||||
      title: "memberEnter title"
 | 
			
		||||
      desc: "memberEnter desc"
 | 
			
		||||
      ext: "memberEnter ext"
 | 
			
		||||
    defaultTips:
 | 
			
		||||
      tips: "entered the group"  # group info changed by xx
 | 
			
		||||
 | 
			
		||||
  #############################friend#################################
 | 
			
		||||
 | 
			
		||||
  friendApplicationAdded:
 | 
			
		||||
    conversation:
 | 
			
		||||
      reliabilityLevel: 2
 | 
			
		||||
      unreadCount: false
 | 
			
		||||
    offlinePush:
 | 
			
		||||
      switch: true
 | 
			
		||||
      title: "Somebody applies to add you as a friend"
 | 
			
		||||
      desc: "Somebody applies to add you as a friend"
 | 
			
		||||
      ext: "Somebody applies to add you as a friend"
 | 
			
		||||
    defaultTips:
 | 
			
		||||
      tips: "I applies to add you as a friend"  #
 | 
			
		||||
 | 
			
		||||
  friendApplicationApproved:
 | 
			
		||||
    conversation:
 | 
			
		||||
      reliabilityLevel: 2
 | 
			
		||||
      unreadCount: false
 | 
			
		||||
    offlinePush:
 | 
			
		||||
      switch: true
 | 
			
		||||
      title: "Someone applies to add your friend application"
 | 
			
		||||
      desc: "Someone applies to add your friend application"
 | 
			
		||||
      ext: "Someone applies to add your friend application"
 | 
			
		||||
    defaultTips:
 | 
			
		||||
      tips: "I applies to add your friend application"  #
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  friendApplicationRejected:
 | 
			
		||||
    conversation:
 | 
			
		||||
      reliabilityLevel: 2
 | 
			
		||||
      unreadCount: false
 | 
			
		||||
    offlinePush:
 | 
			
		||||
      switch: true
 | 
			
		||||
      title: "Someone rejected your friend application"
 | 
			
		||||
      desc: "Someone rejected your friend application"
 | 
			
		||||
      ext: "Someone rejected your friend application"
 | 
			
		||||
    defaultTips:
 | 
			
		||||
      tips: "I rejected your friend application"  #
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  friendAdded:
 | 
			
		||||
    conversation:
 | 
			
		||||
      reliabilityLevel: 3
 | 
			
		||||
      unreadCount: true
 | 
			
		||||
    offlinePush:
 | 
			
		||||
      switch: true
 | 
			
		||||
      title: "We have become friends"
 | 
			
		||||
      desc: "We have become friends"
 | 
			
		||||
      ext: "We have become friends"
 | 
			
		||||
    defaultTips:
 | 
			
		||||
      tips: "We have become friends"  #
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  friendDeleted:
 | 
			
		||||
    conversation:
 | 
			
		||||
      reliabilityLevel: 2
 | 
			
		||||
      unreadCount: false
 | 
			
		||||
    offlinePush:
 | 
			
		||||
      switch: true
 | 
			
		||||
      title: "deleted a friend"
 | 
			
		||||
      desc: "deleted a friend"
 | 
			
		||||
      ext: "deleted a friend"
 | 
			
		||||
    defaultTips:
 | 
			
		||||
      tips: "deleted a friend"  #
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  friendRemarkSet:
 | 
			
		||||
    conversation:
 | 
			
		||||
      reliabilityLevel: 2
 | 
			
		||||
      unreadCount: false
 | 
			
		||||
    offlinePush:
 | 
			
		||||
      switch: true
 | 
			
		||||
      title: "Your friend's profile has been changed"
 | 
			
		||||
      desc: "Your friend's profile has been changed"
 | 
			
		||||
      ext: "Your friend's profile has been changed"
 | 
			
		||||
    defaultTips:
 | 
			
		||||
      tips: "Your friend's profile has been changed"  #
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  blackAdded:
 | 
			
		||||
    conversation:
 | 
			
		||||
      reliabilityLevel: 2
 | 
			
		||||
      unreadCount: false
 | 
			
		||||
    offlinePush:
 | 
			
		||||
      switch: true
 | 
			
		||||
      title: "blocked a user"
 | 
			
		||||
      desc: "blocked a user"
 | 
			
		||||
      ext: "blocked a user"
 | 
			
		||||
    defaultTips:
 | 
			
		||||
      tips: "blocked a user"  #
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  blackDeleted:
 | 
			
		||||
    conversation:
 | 
			
		||||
      reliabilityLevel: 2
 | 
			
		||||
      unreadCount: false
 | 
			
		||||
    offlinePush:
 | 
			
		||||
      switch: true
 | 
			
		||||
      title: "Remove a blocked user"
 | 
			
		||||
      desc: "Remove a blocked user"
 | 
			
		||||
      ext: "Remove a blocked user"
 | 
			
		||||
    defaultTips:
 | 
			
		||||
      tips: "Remove a blocked user"
 | 
			
		||||
 | 
			
		||||
  #####################user#########################
 | 
			
		||||
  userInfoUpdated:
 | 
			
		||||
    conversation:
 | 
			
		||||
      reliabilityLevel: 2
 | 
			
		||||
      unreadCount: false
 | 
			
		||||
    offlinePush:
 | 
			
		||||
      switch: true
 | 
			
		||||
      title: "Remove a blocked user"
 | 
			
		||||
      desc: "Remove a blocked user"
 | 
			
		||||
      ext: "Remove a blocked user"
 | 
			
		||||
    defaultTips:
 | 
			
		||||
      tips: "remove a blocked user"
 | 
			
		||||
 | 
			
		||||
  #####################conversation#########################
 | 
			
		||||
  conversationOptUpdate:
 | 
			
		||||
    conversation:
 | 
			
		||||
      reliabilityLevel: 2
 | 
			
		||||
      unreadCount: false
 | 
			
		||||
      offlinePush:
 | 
			
		||||
        switch: true
 | 
			
		||||
        title: "conversation opt update"
 | 
			
		||||
        desc: "conversation opt update"
 | 
			
		||||
        ext: "conversation opt update"
 | 
			
		||||
      defaultTips:
 | 
			
		||||
        tips: "conversation opt update"
 | 
			
		||||
 | 
			
		||||
messagecallback:
 | 
			
		||||
  callbackSwitch: false
 | 
			
		||||
  callbackUrl: "http://www.xxx.com/msg/judge"
 | 
			
		||||
  #TimeOut use second as unit
 | 
			
		||||
  callbackTimeOut: 10
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#---------------demo configuration---------------------#
 | 
			
		||||
#The following configuration items are applied to openIM Demo configuration
 | 
			
		||||
#是否启动demo,如果自身没有账号体系,设置为true
 | 
			
		||||
demoswitch: true
 | 
			
		||||
demo:
 | 
			
		||||
  #demo对外服务端口,默认即可,需要开放此端口或做nginx转发
 | 
			
		||||
  openImDemoPort: [ 42233 ]
 | 
			
		||||
  alismsverify:
 | 
			
		||||
    accessKeyId: LTAI5tJPkn4HuuePdiLdGqe71
 | 
			
		||||
    accessKeySecret: 4n9OJ7ZCVN1U6KeHDAtOyNeVZcjOuV1
 | 
			
		||||
    signName: OpenIM Corporation
 | 
			
		||||
    verificationCodeTemplateCode: SMS_2268101641
 | 
			
		||||
  superCode: 666666
 | 
			
		||||
  mail:
 | 
			
		||||
  alismsverify: #阿里云短信配置,在阿里云申请成功后修改以下四项,必须修改
 | 
			
		||||
    accessKeyId: LTAI5tJPkn4HuuePdiLdGqe7
 | 
			
		||||
    accessKeySecret: 4n9OJ7ZCVN1U6KeHDAtOyNeVZcjOuV
 | 
			
		||||
    signName: 托云信息技术
 | 
			
		||||
    verificationCodeTemplateCode: SMS_226810164
 | 
			
		||||
  superCode: 666666 #超级验证码,建议修改掉,收不到短信验证码时可以用此替代
 | 
			
		||||
  #  second
 | 
			
		||||
  codeTTL: 300
 | 
			
		||||
  mail: #仅支持qq邮箱,具体操作参考 https://service.mail.qq.com/cgi-bin/help?subtype=1&id=28&no=1001256 必须修改
 | 
			
		||||
    title: "openIM"
 | 
			
		||||
    senderMail: "1765567899@qq.com"
 | 
			
		||||
    senderAuthorizationCode: "1gxyausfoevlzbfag"
 | 
			
		||||
    senderMail: "765567899@qq.com"
 | 
			
		||||
    senderAuthorizationCode: "gxyausfoevlzbfag"
 | 
			
		||||
    smtpAddr: "smtp.qq.com"
 | 
			
		||||
    smtpPort: 25
 | 
			
		||||
    smtpPort: 25   #需开放此端口 出口方向
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										6
									
								
								deploy/.dockerignore
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								deploy/.dockerignore
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,6 @@
 | 
			
		||||
# 先设为忽略所有内容
 | 
			
		||||
**/**
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# 然后逐个排除
 | 
			
		||||
!open_im_*
 | 
			
		||||
							
								
								
									
										158
									
								
								deploy/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										158
									
								
								deploy/Makefile
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,158 @@
 | 
			
		||||
 | 
			
		||||
GREEN_PREFIX="\033[32m"
 | 
			
		||||
COLOR_SUFFIX="\033[0m"
 | 
			
		||||
SKY_BLUE_PREFIX="\033[36m"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# 编译所有需要的组件源码
 | 
			
		||||
win-build-all:
 | 
			
		||||
	go env -w GOOS=linux 
 | 
			
		||||
 | 
			
		||||
	make build-api && make build-msg-gateway && make build-msg-transfer  && make build-push && make build-timer-task
 | 
			
		||||
	make build-rpc-user && make build-rpc-friend && make build-rpc-group && make build-rpc-msg && make build-rpc-auth
 | 
			
		||||
	make build-demo
 | 
			
		||||
 | 
			
		||||
	go env -w GOOS=windows
 | 
			
		||||
 | 
			
		||||
# 编译 open_im_api
 | 
			
		||||
build-api:
 | 
			
		||||
	echo -e ${GREEN_PREFIX} "open_im_api building..." ${COLOR_SUFFIX}
 | 
			
		||||
	go build -ldflags="-w -s" -o open_im_api ../cmd/open_im_api/main.go
 | 
			
		||||
	echo -e ${GREEN_PREFIX} "open_im_api build ok" ${COLOR_SUFFIX}
 | 
			
		||||
 | 
			
		||||
# 编译 open_im_msg_gateway
 | 
			
		||||
build-msg-gateway:
 | 
			
		||||
	echo -e ${GREEN_PREFIX} "open_im_msg_gateway building..." ${COLOR_SUFFIX}
 | 
			
		||||
	go build -ldflags="-w -s" -o open_im_msg_gateway ../cmd/open_im_msg_gateway/main.go
 | 
			
		||||
	echo -e ${GREEN_PREFIX} "open_im_msg_gateway build ok" ${COLOR_SUFFIX}
 | 
			
		||||
 | 
			
		||||
# 编译 open_im_msg_transfer
 | 
			
		||||
build-msg-transfer:
 | 
			
		||||
	echo -e ${GREEN_PREFIX} "open_im_msg_transfer building..." ${COLOR_SUFFIX}
 | 
			
		||||
	go build -ldflags="-w -s" -o open_im_msg_transfer ../cmd/open_im_msg_transfer/main.go
 | 
			
		||||
	echo -e ${GREEN_PREFIX} "open_im_msg_transfer build ok" ${COLOR_SUFFIX}
 | 
			
		||||
 | 
			
		||||
# 编译 open_im_push
 | 
			
		||||
build-push:
 | 
			
		||||
	echo -e ${GREEN_PREFIX} "open_im_push building..." ${COLOR_SUFFIX}
 | 
			
		||||
	go build -ldflags="-w -s" -o open_im_push ../cmd/open_im_push/main.go
 | 
			
		||||
	echo -e ${GREEN_PREFIX} "open_im_push build ok" ${COLOR_SUFFIX}
 | 
			
		||||
 | 
			
		||||
# 编译 open_im_timer_task
 | 
			
		||||
build-timer-task:
 | 
			
		||||
	echo -e ${GREEN_PREFIX} "open_im_timer_task building..." ${COLOR_SUFFIX}
 | 
			
		||||
	go build -ldflags="-w -s" -o open_im_timer_task ../cmd/open_im_timer_task/main.go
 | 
			
		||||
	echo -e ${GREEN_PREFIX} "open_im_timer_task build ok" ${COLOR_SUFFIX}
 | 
			
		||||
 | 
			
		||||
# 编译 build-rpc-user
 | 
			
		||||
build-rpc-user:
 | 
			
		||||
	echo -e ${SKY_BLUE_PREFIX} "open_im_rpc_user building..." ${COLOR_SUFFIX}
 | 
			
		||||
	go build -ldflags="-w -s" -o open_im_rpc_user ../cmd/rpc/open_im_user/main.go
 | 
			
		||||
	echo -e ${SKY_BLUE_PREFIX} "open_im_rpc_user build ok" ${COLOR_SUFFIX}
 | 
			
		||||
 | 
			
		||||
# 编译 build-rpc-friend
 | 
			
		||||
build-rpc-friend:
 | 
			
		||||
	echo -e ${SKY_BLUE_PREFIX} "open_im_rpc_friend building..." ${COLOR_SUFFIX}
 | 
			
		||||
	go build -ldflags="-w -s" -o open_im_rpc_friend ../cmd/rpc/open_im_friend/main.go
 | 
			
		||||
	echo -e ${SKY_BLUE_PREFIX} "open_im_rpc_friend build ok" ${COLOR_SUFFIX}
 | 
			
		||||
 | 
			
		||||
# 编译 build-rpc-group
 | 
			
		||||
build-rpc-group:
 | 
			
		||||
	echo -e ${SKY_BLUE_PREFIX} "open_im_rpc_group building..." ${COLOR_SUFFIX}
 | 
			
		||||
	go build -ldflags="-w -s" -o open_im_rpc_group ../cmd/rpc/open_im_group/main.go
 | 
			
		||||
	echo -e ${SKY_BLUE_PREFIX} "open_im_rpc_group build ok" ${COLOR_SUFFIX}
 | 
			
		||||
 | 
			
		||||
# 编译 build-rpc-auth
 | 
			
		||||
build-rpc-auth:
 | 
			
		||||
	echo -e ${SKY_BLUE_PREFIX} "open_im_rpc_auth building..." ${COLOR_SUFFIX}
 | 
			
		||||
	go build -ldflags="-w -s" -o open_im_rpc_auth ../cmd/rpc/open_im_auth/main.go
 | 
			
		||||
	echo -e ${SKY_BLUE_PREFIX} "open_im_rpc_auth build ok" ${COLOR_SUFFIX}
 | 
			
		||||
 | 
			
		||||
# 编译 build-rpc-msg
 | 
			
		||||
build-rpc-msg:
 | 
			
		||||
	echo -e ${SKY_BLUE_PREFIX} "open_im_rpc_msg building..." ${COLOR_SUFFIX}
 | 
			
		||||
	go build -ldflags="-w -s" -o open_im_rpc_msg ../cmd/rpc/open_im_msg/main.go
 | 
			
		||||
	echo -e ${SKY_BLUE_PREFIX} "open_im_rpc_msg build ok" ${COLOR_SUFFIX}
 | 
			
		||||
 | 
			
		||||
# 编译 open_im_demo
 | 
			
		||||
build-demo:
 | 
			
		||||
	echo -e ${SKY_BLUE_PREFIX} "open_im_demo building..." ${COLOR_SUFFIX}
 | 
			
		||||
	go build -ldflags="-w -s" -o open_im_demo ../cmd/open_im_demo/main.go
 | 
			
		||||
	echo -e ${SKY_BLUE_PREFIX} "open_im_demo build ok" ${COLOR_SUFFIX}
 | 
			
		||||
 | 
			
		||||
# 打包所有组件为镜像
 | 
			
		||||
image-all:
 | 
			
		||||
	make image-api && make image-msg-gateway && make image-msg-transfer & make image-push && make image-timer-task
 | 
			
		||||
	make image-rpc-user && make image-rpc-friend && make image-rpc-group && make image-rpc-msg && make image-rpc-auth
 | 
			
		||||
	make image-demo
 | 
			
		||||
 | 
			
		||||
# 打包 open_im_api
 | 
			
		||||
image-api:
 | 
			
		||||
	echo -e ${GREEN_PREFIX} "IMAGE:openim/api building..." ${COLOR_SUFFIX}
 | 
			
		||||
	docker build -t openim/api:latest -f ./dockerfiles/Dockerfile.api .
 | 
			
		||||
	echo -e ${GREEN_PREFIX} "IMAGE:openim/api build ok" ${COLOR_SUFFIX}
 | 
			
		||||
 | 
			
		||||
# 打包 open_im_msg_gateway
 | 
			
		||||
image-msg-gateway:
 | 
			
		||||
	echo -e ${GREEN_PREFIX} "IMAGE:openim/msg_gateway building..." ${COLOR_SUFFIX}
 | 
			
		||||
	docker build -t openim/msg_gateway:latest -f ./dockerfiles/Dockerfile.msg_gateway .
 | 
			
		||||
	echo -e ${GREEN_PREFIX} "IMAGE:openim/msg_gateway build ok" ${COLOR_SUFFIX}
 | 
			
		||||
 | 
			
		||||
# 打包 open_im_msg_transfer
 | 
			
		||||
image-msg-transfer:
 | 
			
		||||
	echo -e ${GREEN_PREFIX} "IMAGE:openim/msg_transfer building..." ${COLOR_SUFFIX}
 | 
			
		||||
	docker build -t openim/msg_transfer:latest -f ./dockerfiles/Dockerfile.msg_transfer .
 | 
			
		||||
	echo -e ${GREEN_PREFIX} "IMAGE:openim/msg_transfer build ok" ${COLOR_SUFFIX}
 | 
			
		||||
 | 
			
		||||
# 打包 open_im_push
 | 
			
		||||
image-push:
 | 
			
		||||
	echo -e ${GREEN_PREFIX} "IMAGE:openim/push building..." ${COLOR_SUFFIX}
 | 
			
		||||
	docker build -t openim/push:latest -f ./dockerfiles/Dockerfile.push .
 | 
			
		||||
	echo -e ${GREEN_PREFIX} "IMAGE:openim/push build ok" ${COLOR_SUFFIX}
 | 
			
		||||
 | 
			
		||||
# 打包 open_im_timer_task
 | 
			
		||||
image-timer-task:
 | 
			
		||||
	echo -e ${GREEN_PREFIX} "IMAGE:openim/timer_task building..." ${COLOR_SUFFIX}
 | 
			
		||||
	docker build -t openim/timer_task:latest -f ./dockerfiles/Dockerfile.timer_task .
 | 
			
		||||
	echo -e ${GREEN_PREFIX} "IMAGE:openim/timer_task build ok" ${COLOR_SUFFIX}
 | 
			
		||||
 | 
			
		||||
# 打包 build-rpc-user
 | 
			
		||||
image-rpc-user:
 | 
			
		||||
	echo -e ${SKY_BLUE_PREFIX} "IMAGE:openim/rpc_user building..." ${COLOR_SUFFIX}
 | 
			
		||||
	docker build -t openim/rpc_user:latest -f ./dockerfiles/Dockerfile.rpc_user .
 | 
			
		||||
	echo -e ${SKY_BLUE_PREFIX} "IMAGE:openim/rpc_user build ok" ${COLOR_SUFFIX}
 | 
			
		||||
 | 
			
		||||
# 打包 build-rpc-friend
 | 
			
		||||
image-rpc-friend:
 | 
			
		||||
	echo -e ${SKY_BLUE_PREFIX} "IMAGE:openim/rpc_friend building..." ${COLOR_SUFFIX}
 | 
			
		||||
	docker build -t openim/rpc_friend:latest -f ./dockerfiles/Dockerfile.rpc_friend .
 | 
			
		||||
	echo -e ${SKY_BLUE_PREFIX} "IMAGE:openim/rpc_friend build ok" ${COLOR_SUFFIX}
 | 
			
		||||
 | 
			
		||||
# 打包 build-rpc-group
 | 
			
		||||
image-rpc-group:
 | 
			
		||||
	echo -e ${SKY_BLUE_PREFIX} "IMAGE:openim/rpc_group building..." ${COLOR_SUFFIX}
 | 
			
		||||
	docker build -t openim/rpc_group:latest -f ./dockerfiles/Dockerfile.rpc_group .
 | 
			
		||||
	echo -e ${SKY_BLUE_PREFIX} "IMAGE:openim/rpc_group build ok" ${COLOR_SUFFIX}
 | 
			
		||||
 | 
			
		||||
# 打包 build-rpc-auth
 | 
			
		||||
image-rpc-auth:
 | 
			
		||||
	echo -e ${SKY_BLUE_PREFIX} "IMAGE:openim/rpc_auth building..." ${COLOR_SUFFIX}
 | 
			
		||||
	docker build -t openim/rpc_auth:latest -f ./dockerfiles/Dockerfile.rpc_auth .
 | 
			
		||||
	echo -e ${SKY_BLUE_PREFIX} "IMAGE:openim/rpc_auth build ok" ${COLOR_SUFFIX}
 | 
			
		||||
 | 
			
		||||
# 打包 build-rpc-msg
 | 
			
		||||
image-rpc-msg:
 | 
			
		||||
	echo -e ${SKY_BLUE_PREFIX} "IMAGE:openim/rpc_msg building..." ${COLOR_SUFFIX}
 | 
			
		||||
	docker build -t openim/rpc_msg:latest -f ./dockerfiles/Dockerfile.rpc_msg .
 | 
			
		||||
	echo -e ${SKY_BLUE_PREFIX} "IMAGE:openim/rpc_msg build ok" ${COLOR_SUFFIX}
 | 
			
		||||
 | 
			
		||||
# 打包 open_im_demo
 | 
			
		||||
image-demo:
 | 
			
		||||
	echo -e ${SKY_BLUE_PREFIX} "IMAGE:openim/demo building..." ${COLOR_SUFFIX}
 | 
			
		||||
	docker build -t openim/demo:latest -f ./dockerfiles/Dockerfile.demo .
 | 
			
		||||
	echo -e ${SKY_BLUE_PREFIX} "IMAGE:openim/demo build ok" ${COLOR_SUFFIX}
 | 
			
		||||
 | 
			
		||||
.PHONY: win-build-all build-api build-msg-gateway build-msg-transfer build-push 
 | 
			
		||||
	build-timer-task build-rpc-user build-rpc-friend build-rpc-group build-rpc-msg build-demo
 | 
			
		||||
	image-all image-api image-msg-gateway image-msg-transfer image-push 
 | 
			
		||||
	image-timer-task image-rpc-user image-rpc-friend image-rpc-group image-rpc-msg image-demo
 | 
			
		||||
							
								
								
									
										183
									
								
								deploy/config.example.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										183
									
								
								deploy/config.example.yaml
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,183 @@
 | 
			
		||||
# The class cannot be named by Pascal or camel case.
 | 
			
		||||
# If it is not used, the corresponding structure will not be set,
 | 
			
		||||
# and it will not be read naturally.
 | 
			
		||||
serverversion: 1.0.3
 | 
			
		||||
#---------------Infrastructure configuration---------------------#
 | 
			
		||||
etcd:
 | 
			
		||||
  etcdSchema: openIM
 | 
			
		||||
  etcdAddr: [ openim_etcd:2379 ]
 | 
			
		||||
 | 
			
		||||
mysql:
 | 
			
		||||
  dbMysqlAddress: [ openim_mysql:3306 ] # openim_mysql 是对应的mysql服务的host
 | 
			
		||||
  dbMysqlUserName: openIM
 | 
			
		||||
  dbMysqlPassword: openIM
 | 
			
		||||
  dbMysqlDatabaseName: openIM
 | 
			
		||||
  dbTableName: eMsg
 | 
			
		||||
  dbMsgTableNum: 1
 | 
			
		||||
  dbMaxOpenConns: 20
 | 
			
		||||
  dbMaxIdleConns: 10
 | 
			
		||||
  dbMaxLifeTime: 120
 | 
			
		||||
 | 
			
		||||
mongo:
 | 
			
		||||
  dbUri: ""#当dbUri值不为空则直接使用该值
 | 
			
		||||
  dbAddress: [ openim_mongo:27017 ]
 | 
			
		||||
  dbDirect: false
 | 
			
		||||
  dbTimeout: 10
 | 
			
		||||
  dbDatabase: openIM
 | 
			
		||||
  dbSource: admin
 | 
			
		||||
  dbUserName:
 | 
			
		||||
  dbPassword:
 | 
			
		||||
  dbMaxPoolSize: 20
 | 
			
		||||
  dbRetainChatRecords: 7
 | 
			
		||||
 | 
			
		||||
redis:
 | 
			
		||||
  dbAddress: openim_redis:6379
 | 
			
		||||
  dbMaxIdle: 128
 | 
			
		||||
  dbMaxActive: 0
 | 
			
		||||
  dbIdleTimeout: 120
 | 
			
		||||
  dbPassWord: openIM
 | 
			
		||||
 | 
			
		||||
kafka:
 | 
			
		||||
  ws2mschat:
 | 
			
		||||
    addr: [ openim_kafka:9092 ]
 | 
			
		||||
    topic: "ws2ms_chat"
 | 
			
		||||
  ms2pschat:
 | 
			
		||||
    addr: [ openim_kafka:9092 ]
 | 
			
		||||
    topic: "ms2ps_chat"
 | 
			
		||||
  consumergroupid:
 | 
			
		||||
    msgToMongo: mongo
 | 
			
		||||
    msgToMySql: mysql
 | 
			
		||||
    msgToPush: push
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#---------------Internal service configuration---------------------#
 | 
			
		||||
 | 
			
		||||
# The service ip default is empty,
 | 
			
		||||
# automatically obtain the machine's valid network card ip as the service ip,
 | 
			
		||||
# otherwise the configuration ip is preferred
 | 
			
		||||
serverip: 0.0.0.0
 | 
			
		||||
 | 
			
		||||
# endpoints 内部组件间访问的端点host名称,访问时,可以内部直接访问 host:port 来访问
 | 
			
		||||
#   新增的这一段配置节,主要是位了注册到etcd时,可以使用同一network下的容器名(host)来访问不同的容器,拆分到不同容器后原来全部使用serverip的形式不能用了
 | 
			
		||||
endpoints:
 | 
			
		||||
  api: openim_api
 | 
			
		||||
  push: openim_push
 | 
			
		||||
  msg_gateway: openim_msg_gateway
 | 
			
		||||
  rpc_auth: openim_rpc_auth
 | 
			
		||||
  rpc_friend: openim_rpc_friend
 | 
			
		||||
  rpc_group: openim_rpc_group
 | 
			
		||||
  rpc_msg: openim_rpc_msg
 | 
			
		||||
  rpc_user: openim_rpc_user
 | 
			
		||||
 | 
			
		||||
api:
 | 
			
		||||
  openImApiPort: [ 10000 ]
 | 
			
		||||
sdk:
 | 
			
		||||
  openImSdkWsPort: [ 30000 ]
 | 
			
		||||
cmsapi:
 | 
			
		||||
  openImCmsApiPort: [ 8000 ]
 | 
			
		||||
 | 
			
		||||
credential:
 | 
			
		||||
  tencent:
 | 
			
		||||
    appID: 1302656840
 | 
			
		||||
    region: ap-chengdu
 | 
			
		||||
    bucket: echat-1302656840
 | 
			
		||||
    secretID: AKIDGNYVChzIQinu7QEgtNp0hnNgqcV8vZTC
 | 
			
		||||
    secretKey: kz15vW83qM6dBUWIq681eBZA0c0vlIbe
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
rpcport:
 | 
			
		||||
  openImUserPort: [ 10100 ]
 | 
			
		||||
  openImFriendPort: [ 10200 ]
 | 
			
		||||
  openImOfflineMessagePort: [ 10300]
 | 
			
		||||
  openImOnlineRelayPort: [ 10400 ]
 | 
			
		||||
  openImGroupPort: [ 10500  ]
 | 
			
		||||
  openImAuthPort: [ 10600 ]
 | 
			
		||||
  openImPushPort: [ 10700 ]
 | 
			
		||||
  openImStatisticsPort: [ 10800 ]
 | 
			
		||||
  openImMessageCmsPort: [ 10900 ]
 | 
			
		||||
  openImAdminCmsPort: [ 11000 ]
 | 
			
		||||
 | 
			
		||||
rpcregistername:
 | 
			
		||||
  openImUserName: User
 | 
			
		||||
  openImFriendName: Friend
 | 
			
		||||
  openImOfflineMessageName: OfflineMessage
 | 
			
		||||
  openImPushName: Push
 | 
			
		||||
  openImOnlineMessageRelayName: OnlineMessageRelay
 | 
			
		||||
  openImGroupName: Group
 | 
			
		||||
  openImAuthName: Auth
 | 
			
		||||
 | 
			
		||||
log:
 | 
			
		||||
  storageLocation: ../logs/
 | 
			
		||||
  rotationTime: 24
 | 
			
		||||
  remainRotationCount: 5
 | 
			
		||||
  remainLogLevel: 6
 | 
			
		||||
  elasticSearchSwitch: false
 | 
			
		||||
  elasticSearchAddr: [ 127.0.0.1:9201 ]
 | 
			
		||||
  elasticSearchUser: ""
 | 
			
		||||
  elasticSearchPassword: ""
 | 
			
		||||
 | 
			
		||||
modulename:
 | 
			
		||||
  longConnSvrName: msg_gateway
 | 
			
		||||
  msgTransferName: msg_transfer
 | 
			
		||||
  pushName: push
 | 
			
		||||
 | 
			
		||||
longconnsvr:
 | 
			
		||||
  openImWsPort: [ 17778 ]
 | 
			
		||||
  websocketMaxConnNum: 10000
 | 
			
		||||
  websocketMaxMsgLen: 4096
 | 
			
		||||
  websocketTimeOut: 10
 | 
			
		||||
 | 
			
		||||
push:
 | 
			
		||||
  tpns:
 | 
			
		||||
    ios:
 | 
			
		||||
      accessID: 1600018281
 | 
			
		||||
      secretKey: 3cd68a77a95b89e5089a1aca523f318f
 | 
			
		||||
    android:
 | 
			
		||||
      accessID: 111
 | 
			
		||||
      secretKey: 111
 | 
			
		||||
  jpns:
 | 
			
		||||
    appKey: cf47465a368f24c659608e7e
 | 
			
		||||
    masterSecret: 02204efe3f3832947a236ee5
 | 
			
		||||
    pushUrl: "https://api.jpush.cn/v3/push"
 | 
			
		||||
    pushIntent: "intent:#Intent;component=io.openim.app.enterprisechat/io.openim.app.enterprisechat.MainActivity;end"
 | 
			
		||||
manager:
 | 
			
		||||
  appManagerUid: ["openIM123456","openIM654321"]
 | 
			
		||||
  secrets: ["openIM1","openIM2"]
 | 
			
		||||
 | 
			
		||||
secret: tuoyun
 | 
			
		||||
 | 
			
		||||
multiloginpolicy: 1
 | 
			
		||||
 | 
			
		||||
#token config
 | 
			
		||||
tokenpolicy:
 | 
			
		||||
  accessSecret: "open_im_server"
 | 
			
		||||
  # Token effective time day as a unit
 | 
			
		||||
  accessExpire: 7
 | 
			
		||||
 | 
			
		||||
messagecallback:
 | 
			
		||||
  callbackSwitch: false
 | 
			
		||||
  callbackUrl: "http://www.xxx.com/msg/judge"
 | 
			
		||||
  #TimeOut use second as unit
 | 
			
		||||
  callbackTimeOut: 10
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#---------------demo configuration---------------------#
 | 
			
		||||
#The following configuration items are applied to openIM Demo configuration
 | 
			
		||||
demoswitch: true
 | 
			
		||||
demo:
 | 
			
		||||
  openImDemoPort: [ 42233 ]
 | 
			
		||||
  alismsverify:
 | 
			
		||||
    accessKeyId: LTAI5tJPkn4HuuePdiLdGqe71
 | 
			
		||||
    accessKeySecret: 4n9OJ7ZCVN1U6KeHDAtOyNeVZcjOuV1
 | 
			
		||||
    signName: OpenIM Corporation
 | 
			
		||||
    verificationCodeTemplateCode: SMS_2268101641
 | 
			
		||||
  superCode: 666666
 | 
			
		||||
  mail:
 | 
			
		||||
    title: "openIM"
 | 
			
		||||
    senderMail: "1765567899@qq.com"
 | 
			
		||||
    senderAuthorizationCode: "1gxyausfoevlzbfag"
 | 
			
		||||
    smtpAddr: "smtp.qq.com"
 | 
			
		||||
    smtpPort: 25
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										16
									
								
								deploy/dockerfiles/Dockerfile.api
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								deploy/dockerfiles/Dockerfile.api
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,16 @@
 | 
			
		||||
FROM alpine:3.13
 | 
			
		||||
 | 
			
		||||
# 设置固定的项目路径
 | 
			
		||||
ENV WORKDIR /app
 | 
			
		||||
ENV CONFIG_NAME $WORKDIR/config/config.yaml
 | 
			
		||||
 | 
			
		||||
# 将可执行文件复制到目标目录
 | 
			
		||||
ADD ./open_im_api $WORKDIR/main
 | 
			
		||||
 | 
			
		||||
# 创建用于挂载的几个目录,添加可执行权限
 | 
			
		||||
RUN mkdir $WORKDIR/logs $WORKDIR/config $WORKDIR/db && \
 | 
			
		||||
  chmod +x $WORKDIR/main
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
WORKDIR $WORKDIR
 | 
			
		||||
CMD ./main
 | 
			
		||||
							
								
								
									
										16
									
								
								deploy/dockerfiles/Dockerfile.demo
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								deploy/dockerfiles/Dockerfile.demo
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,16 @@
 | 
			
		||||
FROM alpine:3.13
 | 
			
		||||
 | 
			
		||||
# 设置固定的项目路径
 | 
			
		||||
ENV WORKDIR /app
 | 
			
		||||
ENV CONFIG_NAME $WORKDIR/config/config.yaml
 | 
			
		||||
 | 
			
		||||
# 将可执行文件复制到目标目录
 | 
			
		||||
ADD ./open_im_demo $WORKDIR/main
 | 
			
		||||
 | 
			
		||||
# 创建用于挂载的几个目录,添加可执行权限
 | 
			
		||||
RUN mkdir $WORKDIR/logs $WORKDIR/config $WORKDIR/db && \
 | 
			
		||||
  chmod +x $WORKDIR/main
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
WORKDIR $WORKDIR
 | 
			
		||||
CMD ./main
 | 
			
		||||
							
								
								
									
										16
									
								
								deploy/dockerfiles/Dockerfile.msg_gateway
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								deploy/dockerfiles/Dockerfile.msg_gateway
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,16 @@
 | 
			
		||||
FROM alpine:3.13
 | 
			
		||||
 | 
			
		||||
# 设置固定的项目路径
 | 
			
		||||
ENV WORKDIR /app
 | 
			
		||||
ENV CONFIG_NAME $WORKDIR/config/config.yaml
 | 
			
		||||
 | 
			
		||||
# 将可执行文件复制到目标目录
 | 
			
		||||
ADD ./open_im_msg_gateway $WORKDIR/main
 | 
			
		||||
 | 
			
		||||
# 创建用于挂载的几个目录,重命名可执行文件为 main,添加可执行权限
 | 
			
		||||
RUN mkdir $WORKDIR/logs $WORKDIR/config $WORKDIR/db && \
 | 
			
		||||
  chmod +x $WORKDIR/main
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
WORKDIR $WORKDIR
 | 
			
		||||
CMD ./main
 | 
			
		||||
							
								
								
									
										16
									
								
								deploy/dockerfiles/Dockerfile.msg_transfer
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								deploy/dockerfiles/Dockerfile.msg_transfer
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,16 @@
 | 
			
		||||
FROM alpine:3.13
 | 
			
		||||
 | 
			
		||||
# 设置固定的项目路径
 | 
			
		||||
ENV WORKDIR /app
 | 
			
		||||
ENV CONFIG_NAME $WORKDIR/config/config.yaml
 | 
			
		||||
 | 
			
		||||
# 将可执行文件复制到目标目录
 | 
			
		||||
ADD ./open_im_msg_transfer $WORKDIR/main
 | 
			
		||||
 | 
			
		||||
# 创建用于挂载的几个目录,添加可执行权限
 | 
			
		||||
RUN mkdir $WORKDIR/logs $WORKDIR/config $WORKDIR/db && \
 | 
			
		||||
  chmod +x $WORKDIR/main
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
WORKDIR $WORKDIR
 | 
			
		||||
CMD ./main
 | 
			
		||||
							
								
								
									
										16
									
								
								deploy/dockerfiles/Dockerfile.push
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								deploy/dockerfiles/Dockerfile.push
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,16 @@
 | 
			
		||||
FROM alpine:3.13
 | 
			
		||||
 | 
			
		||||
# 设置固定的项目路径
 | 
			
		||||
ENV WORKDIR /app
 | 
			
		||||
ENV CONFIG_NAME $WORKDIR/config/config.yaml
 | 
			
		||||
 | 
			
		||||
# 将可执行文件复制到目标目录
 | 
			
		||||
ADD ./open_im_push $WORKDIR/main
 | 
			
		||||
 | 
			
		||||
# 创建用于挂载的几个目录,添加可执行权限
 | 
			
		||||
RUN mkdir $WORKDIR/logs $WORKDIR/config $WORKDIR/db && \
 | 
			
		||||
  chmod +x $WORKDIR/main
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
WORKDIR $WORKDIR
 | 
			
		||||
CMD ./main
 | 
			
		||||
							
								
								
									
										16
									
								
								deploy/dockerfiles/Dockerfile.rpc_auth
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								deploy/dockerfiles/Dockerfile.rpc_auth
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,16 @@
 | 
			
		||||
FROM alpine:3.13
 | 
			
		||||
 | 
			
		||||
# 设置固定的项目路径
 | 
			
		||||
ENV WORKDIR /app
 | 
			
		||||
ENV CONFIG_NAME $WORKDIR/config/config.yaml
 | 
			
		||||
 | 
			
		||||
# 将可执行文件复制到目标目录
 | 
			
		||||
ADD ./open_im_rpc_auth $WORKDIR/main
 | 
			
		||||
 | 
			
		||||
# 创建用于挂载的几个目录,添加可执行权限
 | 
			
		||||
RUN mkdir $WORKDIR/logs $WORKDIR/config $WORKDIR/db && \
 | 
			
		||||
  chmod +x $WORKDIR/main
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
WORKDIR $WORKDIR
 | 
			
		||||
CMD ./main
 | 
			
		||||
							
								
								
									
										16
									
								
								deploy/dockerfiles/Dockerfile.rpc_friend
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								deploy/dockerfiles/Dockerfile.rpc_friend
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,16 @@
 | 
			
		||||
FROM alpine:3.13
 | 
			
		||||
 | 
			
		||||
# 设置固定的项目路径
 | 
			
		||||
ENV WORKDIR /app
 | 
			
		||||
ENV CONFIG_NAME $WORKDIR/config/config.yaml
 | 
			
		||||
 | 
			
		||||
# 将可执行文件复制到目标目录
 | 
			
		||||
ADD ./open_im_rpc_friend $WORKDIR/main
 | 
			
		||||
 | 
			
		||||
# 创建用于挂载的几个目录,添加可执行权限
 | 
			
		||||
RUN mkdir $WORKDIR/logs $WORKDIR/config $WORKDIR/db && \
 | 
			
		||||
  chmod +x $WORKDIR/main
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
WORKDIR $WORKDIR
 | 
			
		||||
CMD ./main
 | 
			
		||||
							
								
								
									
										16
									
								
								deploy/dockerfiles/Dockerfile.rpc_group
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								deploy/dockerfiles/Dockerfile.rpc_group
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,16 @@
 | 
			
		||||
FROM alpine:3.13
 | 
			
		||||
 | 
			
		||||
# 设置固定的项目路径
 | 
			
		||||
ENV WORKDIR /app
 | 
			
		||||
ENV CONFIG_NAME $WORKDIR/config/config.yaml
 | 
			
		||||
 | 
			
		||||
# 将可执行文件复制到目标目录
 | 
			
		||||
ADD ./open_im_rpc_group $WORKDIR/main
 | 
			
		||||
 | 
			
		||||
# 创建用于挂载的几个目录,添加可执行权限
 | 
			
		||||
RUN mkdir $WORKDIR/logs $WORKDIR/config $WORKDIR/db && \
 | 
			
		||||
  chmod +x $WORKDIR/main
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
WORKDIR $WORKDIR
 | 
			
		||||
CMD ./main
 | 
			
		||||
							
								
								
									
										16
									
								
								deploy/dockerfiles/Dockerfile.rpc_msg
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								deploy/dockerfiles/Dockerfile.rpc_msg
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,16 @@
 | 
			
		||||
FROM alpine:3.13
 | 
			
		||||
 | 
			
		||||
# 设置固定的项目路径
 | 
			
		||||
ENV WORKDIR /app
 | 
			
		||||
ENV CONFIG_NAME $WORKDIR/config/config.yaml
 | 
			
		||||
 | 
			
		||||
# 将可执行文件复制到目标目录
 | 
			
		||||
ADD ./open_im_rpc_msg $WORKDIR/main
 | 
			
		||||
 | 
			
		||||
# 创建用于挂载的几个目录,添加可执行权限
 | 
			
		||||
RUN mkdir $WORKDIR/logs $WORKDIR/config $WORKDIR/db && \
 | 
			
		||||
  chmod +x $WORKDIR/main
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
WORKDIR $WORKDIR
 | 
			
		||||
CMD ./main
 | 
			
		||||
							
								
								
									
										16
									
								
								deploy/dockerfiles/Dockerfile.rpc_user
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								deploy/dockerfiles/Dockerfile.rpc_user
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,16 @@
 | 
			
		||||
FROM alpine:3.13
 | 
			
		||||
 | 
			
		||||
# 设置固定的项目路径
 | 
			
		||||
ENV WORKDIR /app
 | 
			
		||||
ENV CONFIG_NAME $WORKDIR/config/config.yaml
 | 
			
		||||
 | 
			
		||||
# 将可执行文件复制到目标目录
 | 
			
		||||
ADD ./open_im_rpc_user $WORKDIR/main
 | 
			
		||||
 | 
			
		||||
# 创建用于挂载的几个目录,添加可执行权限
 | 
			
		||||
RUN mkdir $WORKDIR/logs $WORKDIR/config $WORKDIR/db && \
 | 
			
		||||
  chmod +x $WORKDIR/main
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
WORKDIR $WORKDIR
 | 
			
		||||
CMD ./main
 | 
			
		||||
							
								
								
									
										16
									
								
								deploy/dockerfiles/Dockerfile.timer_task
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								deploy/dockerfiles/Dockerfile.timer_task
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,16 @@
 | 
			
		||||
FROM alpine:3.13
 | 
			
		||||
 | 
			
		||||
# 设置固定的项目路径
 | 
			
		||||
ENV WORKDIR /app
 | 
			
		||||
ENV CONFIG_NAME $WORKDIR/config/config.yaml
 | 
			
		||||
 | 
			
		||||
# 将可执行文件复制到目标目录
 | 
			
		||||
ADD ./open_im_timer_task $WORKDIR/main
 | 
			
		||||
 | 
			
		||||
# 创建用于挂载的几个目录,添加可执行权限
 | 
			
		||||
RUN mkdir $WORKDIR/logs $WORKDIR/config $WORKDIR/db && \
 | 
			
		||||
  chmod +x $WORKDIR/main
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
WORKDIR $WORKDIR
 | 
			
		||||
CMD ./main
 | 
			
		||||
							
								
								
									
										101
									
								
								deploy/env.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										101
									
								
								deploy/env.yaml
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,101 @@
 | 
			
		||||
version: "3.7"
 | 
			
		||||
networks: 
 | 
			
		||||
  openim: 
 | 
			
		||||
    external: true
 | 
			
		||||
 
 | 
			
		||||
services:
 | 
			
		||||
  mysql:
 | 
			
		||||
    networks: 
 | 
			
		||||
      - openim
 | 
			
		||||
    image: mysql:5.7
 | 
			
		||||
    # ports:
 | 
			
		||||
    #   #- 13306:3306
 | 
			
		||||
    #   - 23306:33060
 | 
			
		||||
    container_name: openim_mysql
 | 
			
		||||
    volumes:
 | 
			
		||||
      - ./components/mysql/data:/var/lib/mysql
 | 
			
		||||
      - /etc/localtime:/etc/localtime
 | 
			
		||||
    environment:
 | 
			
		||||
      MYSQL_ROOT_PASSWORD: openIM
 | 
			
		||||
    restart: always
 | 
			
		||||
 | 
			
		||||
  mongodb:
 | 
			
		||||
    networks: 
 | 
			
		||||
      - openim
 | 
			
		||||
    image: mongo:4.4.5-bionic
 | 
			
		||||
    # ports:
 | 
			
		||||
    #   - 37017:27017
 | 
			
		||||
    container_name: openim_mongo
 | 
			
		||||
    volumes:
 | 
			
		||||
      - ./components/mongodb/data/db:/data/db
 | 
			
		||||
      - ./components/mongodb/data/logs:/data/logs
 | 
			
		||||
      - ./components/mongodb/data/conf:/etc/mongo
 | 
			
		||||
   environment:
 | 
			
		||||
    TZ: Asia/Shanghai
 | 
			
		||||
   #   - MONGO_INITDB_ROOT_USERNAME=openIM
 | 
			
		||||
    #  - MONGO_INITDB_ROOT_PASSWORD=openIM
 | 
			
		||||
    restart: always
 | 
			
		||||
 | 
			
		||||
  redis:
 | 
			
		||||
    networks: 
 | 
			
		||||
      - openim
 | 
			
		||||
    image: redis:6.2.4-alpine
 | 
			
		||||
    # ports:
 | 
			
		||||
    #   - 16379:6379
 | 
			
		||||
    container_name: openim_redis
 | 
			
		||||
    volumes:
 | 
			
		||||
      - ./components/redis/data:/data
 | 
			
		||||
      #redis config file
 | 
			
		||||
      #- ./components/redis/config/redis.conf:/usr/local/redis/config/redis.conf
 | 
			
		||||
    environment:
 | 
			
		||||
      TZ: Asia/Shanghai
 | 
			
		||||
    restart: always
 | 
			
		||||
    sysctls:
 | 
			
		||||
      net.core.somaxconn: 1024
 | 
			
		||||
    command: redis-server --requirepass openIM --appendonly yes
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  zookeeper:
 | 
			
		||||
    networks: 
 | 
			
		||||
      - openim
 | 
			
		||||
    image: wurstmeister/zookeeper
 | 
			
		||||
    # ports:
 | 
			
		||||
    #   - 2181:2181
 | 
			
		||||
    container_name: openim_zookeeper
 | 
			
		||||
    volumes:
 | 
			
		||||
      - /etc/localtime:/etc/localtime
 | 
			
		||||
    environment:
 | 
			
		||||
      TZ: Asia/Shanghai
 | 
			
		||||
    restart: always
 | 
			
		||||
 | 
			
		||||
  kafka:
 | 
			
		||||
    networks: 
 | 
			
		||||
      - openim
 | 
			
		||||
    image: wurstmeister/kafka
 | 
			
		||||
    container_name: openim_kafka
 | 
			
		||||
    restart: always
 | 
			
		||||
    environment:
 | 
			
		||||
      TZ: Asia/Shanghai
 | 
			
		||||
      KAFKA_BROKER_ID: 0
 | 
			
		||||
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
 | 
			
		||||
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092
 | 
			
		||||
      KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092
 | 
			
		||||
    depends_on:
 | 
			
		||||
      - zookeeper
 | 
			
		||||
 | 
			
		||||
  etcd:
 | 
			
		||||
    networks: 
 | 
			
		||||
      - openim
 | 
			
		||||
    image: quay.io/coreos/etcd
 | 
			
		||||
    # ports:
 | 
			
		||||
    #   - 2379:2379
 | 
			
		||||
    #   - 2380:2380
 | 
			
		||||
    container_name: openim_etcd
 | 
			
		||||
    volumes:
 | 
			
		||||
      - /etc/timezone:/etc/timezone
 | 
			
		||||
      - /etc/localtime:/etc/localtime
 | 
			
		||||
    environment:
 | 
			
		||||
      ETCDCTL_API: 3
 | 
			
		||||
    restart: always
 | 
			
		||||
    command: /usr/local/bin/etcd --name etcd0 --data-dir /etcd-data --listen-client-urls http://0.0.0.0:2379 --advertise-client-urls http://0.0.0.0:2379 --listen-peer-urls http://0.0.0.0:2380 --initial-advertise-peer-urls http://0.0.0.0:2380 --initial-cluster etcd0=http://0.0.0.0:2380 --initial-cluster-token tkn --initial-cluster-state new
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										223
									
								
								deploy/openim.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										223
									
								
								deploy/openim.yaml
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,223 @@
 | 
			
		||||
version: "3.7"
 | 
			
		||||
networks: 
 | 
			
		||||
  openim:
 | 
			
		||||
    external: true
 | 
			
		||||
 
 | 
			
		||||
services:
 | 
			
		||||
  api:
 | 
			
		||||
    networks: 
 | 
			
		||||
      - openim
 | 
			
		||||
    image: openim/api
 | 
			
		||||
    container_name: openim_api
 | 
			
		||||
    ports:
 | 
			
		||||
      - 10000:10000 # API,必须开
 | 
			
		||||
    volumes:
 | 
			
		||||
      - ./logs:/app/logs
 | 
			
		||||
      # Dockerfile 里定义了配置文件的路径环境变量,CONFIG_NAME,默认指向了 /app/config/config.yaml
 | 
			
		||||
      - ./config/config.yaml:/app/config/config.yaml
 | 
			
		||||
      - ./db/sdk:/app/db/sdk
 | 
			
		||||
    restart: always
 | 
			
		||||
    # depends_on:
 | 
			
		||||
    #   - kafka
 | 
			
		||||
    #   # - mysql
 | 
			
		||||
    #   # - mongodb
 | 
			
		||||
    #   - redis
 | 
			
		||||
    #   - etcd
 | 
			
		||||
    logging:
 | 
			
		||||
      driver: json-file
 | 
			
		||||
      options:
 | 
			
		||||
        max-size: "1g"
 | 
			
		||||
        max-file: "2"
 | 
			
		||||
 | 
			
		||||
  msg_gateway:
 | 
			
		||||
    networks: 
 | 
			
		||||
      - openim
 | 
			
		||||
    image: openim/msg_gateway
 | 
			
		||||
    container_name: openim_msg_gateway
 | 
			
		||||
    ports:
 | 
			
		||||
      - 17778:17778 # 消息,必须开
 | 
			
		||||
    volumes:
 | 
			
		||||
      - ./logs:/app/logs
 | 
			
		||||
      - ./config/config.yaml:/app/config/config.yaml
 | 
			
		||||
      - ./db/sdk:/app/db/sdk
 | 
			
		||||
    restart: always
 | 
			
		||||
    # depends_on:
 | 
			
		||||
    #   - kafka
 | 
			
		||||
    #   # - mysql
 | 
			
		||||
    #   # - mongodb
 | 
			
		||||
    #   - redis
 | 
			
		||||
    #   - etcd
 | 
			
		||||
    logging:
 | 
			
		||||
      driver: json-file
 | 
			
		||||
      options:
 | 
			
		||||
        max-size: "1g"
 | 
			
		||||
        max-file: "2"
 | 
			
		||||
        
 | 
			
		||||
  msg_transfer:
 | 
			
		||||
    networks: 
 | 
			
		||||
      - openim
 | 
			
		||||
    image: openim/msg_transfer
 | 
			
		||||
    container_name: openim_msg_transfer
 | 
			
		||||
    volumes:
 | 
			
		||||
      - ./logs:/app/logs
 | 
			
		||||
      - ./config/config.yaml:/app/config/config.yaml
 | 
			
		||||
      - ./db/sdk:/app/db/sdk
 | 
			
		||||
    restart: always
 | 
			
		||||
    # depends_on:
 | 
			
		||||
    #   - kafka
 | 
			
		||||
    #   # - mysql
 | 
			
		||||
    #   # - mongodb
 | 
			
		||||
    #   - redis
 | 
			
		||||
    #   - etcd
 | 
			
		||||
    logging:
 | 
			
		||||
      driver: json-file
 | 
			
		||||
      options:
 | 
			
		||||
        max-size: "1g"
 | 
			
		||||
        max-file: "2"
 | 
			
		||||
  
 | 
			
		||||
  push:
 | 
			
		||||
    networks: 
 | 
			
		||||
      - openim
 | 
			
		||||
    image: openim/push
 | 
			
		||||
    container_name: openim_push
 | 
			
		||||
    volumes:
 | 
			
		||||
      - ./logs:/app/logs
 | 
			
		||||
      - ./config/config.yaml:/app/config/config.yaml
 | 
			
		||||
      - ./db/sdk:/app/db/sdk
 | 
			
		||||
    restart: always
 | 
			
		||||
    # depends_on:
 | 
			
		||||
    #   - kafka
 | 
			
		||||
    #   # - mysql
 | 
			
		||||
    #   # - mongodb
 | 
			
		||||
    #   - redis
 | 
			
		||||
    #   - etcd
 | 
			
		||||
    logging:
 | 
			
		||||
      driver: json-file
 | 
			
		||||
      options:
 | 
			
		||||
        max-size: "1g"
 | 
			
		||||
        max-file: "2"
 | 
			
		||||
 | 
			
		||||
  timer_task:
 | 
			
		||||
    networks: 
 | 
			
		||||
      - openim
 | 
			
		||||
    image: openim/timer_task
 | 
			
		||||
    container_name: openim_timer_task
 | 
			
		||||
    volumes:
 | 
			
		||||
      - ./logs:/app/logs
 | 
			
		||||
      - ./config/config.yaml:/app/config/config.yaml
 | 
			
		||||
      - ./db/sdk:/app/db/sdk
 | 
			
		||||
    restart: always
 | 
			
		||||
    # depends_on:
 | 
			
		||||
    #   - kafka
 | 
			
		||||
    #   # - mysql
 | 
			
		||||
    #   # - mongodb
 | 
			
		||||
    #   - redis
 | 
			
		||||
    #   - etcd
 | 
			
		||||
    logging:
 | 
			
		||||
      driver: json-file
 | 
			
		||||
      options:
 | 
			
		||||
        max-size: "1g"
 | 
			
		||||
        max-file: "2"
 | 
			
		||||
 | 
			
		||||
  rpc_user:
 | 
			
		||||
    networks: 
 | 
			
		||||
      - openim
 | 
			
		||||
    image: openim/rpc_user
 | 
			
		||||
    container_name: openim_rpc_user
 | 
			
		||||
    volumes:
 | 
			
		||||
      - ./logs:/app/logs
 | 
			
		||||
      - ./config/config.yaml:/app/config/config.yaml
 | 
			
		||||
      - ./db/sdk:/app/db/sdk
 | 
			
		||||
    restart: always
 | 
			
		||||
    # depends_on:
 | 
			
		||||
    #   - kafka
 | 
			
		||||
    #   # - mysql
 | 
			
		||||
    #   # - mongodb
 | 
			
		||||
    #   - redis
 | 
			
		||||
    #   - etcd
 | 
			
		||||
    logging:
 | 
			
		||||
      driver: json-file
 | 
			
		||||
      options:
 | 
			
		||||
        max-size: "1g"
 | 
			
		||||
        max-file: "2"
 | 
			
		||||
 | 
			
		||||
  rpc_friend:
 | 
			
		||||
    networks: 
 | 
			
		||||
      - openim
 | 
			
		||||
    image: openim/rpc_friend
 | 
			
		||||
    container_name: openim_rpc_friend
 | 
			
		||||
    volumes:
 | 
			
		||||
      - ./logs:/app/logs
 | 
			
		||||
      - ./config/config.yaml:/app/config/config.yaml
 | 
			
		||||
      - ./db/sdk:/app/db/sdk
 | 
			
		||||
    restart: always
 | 
			
		||||
    # depends_on:
 | 
			
		||||
    #   - kafka
 | 
			
		||||
    #   # - mysql
 | 
			
		||||
    #   # - mongodb
 | 
			
		||||
    #   - redis
 | 
			
		||||
    #   - etcd
 | 
			
		||||
 | 
			
		||||
  rpc_group:
 | 
			
		||||
    networks: 
 | 
			
		||||
      - openim
 | 
			
		||||
    image: openim/rpc_group
 | 
			
		||||
    container_name: openim_rpc_group
 | 
			
		||||
    volumes:
 | 
			
		||||
      - ./logs:/app/logs
 | 
			
		||||
      - ./config/config.yaml:/app/config/config.yaml
 | 
			
		||||
      - ./db/sdk:/app/db/sdk
 | 
			
		||||
    restart: always
 | 
			
		||||
    # depends_on:
 | 
			
		||||
    #   - kafka
 | 
			
		||||
    #   # - mysql
 | 
			
		||||
    #   # - mongodb
 | 
			
		||||
    #   - redis
 | 
			
		||||
    #   - etcd
 | 
			
		||||
 | 
			
		||||
  rpc_auth:
 | 
			
		||||
    networks: 
 | 
			
		||||
      - openim
 | 
			
		||||
    image: openim/rpc_auth
 | 
			
		||||
    container_name: openim_rpc_auth
 | 
			
		||||
    volumes:
 | 
			
		||||
      - ./logs:/app/logs
 | 
			
		||||
      - ./config/config.yaml:/app/config/config.yaml
 | 
			
		||||
      - ./db/sdk:/app/db/sdk
 | 
			
		||||
    restart: always
 | 
			
		||||
    # depends_on:
 | 
			
		||||
    #   - kafka
 | 
			
		||||
    #   # - mysql
 | 
			
		||||
    #   # - mongodb
 | 
			
		||||
    #   - redis
 | 
			
		||||
    #   - etcd
 | 
			
		||||
 | 
			
		||||
  rpc_msg:
 | 
			
		||||
    networks: 
 | 
			
		||||
      - openim
 | 
			
		||||
    image: openim/rpc_msg
 | 
			
		||||
    container_name: openim_rpc_msg
 | 
			
		||||
    volumes:
 | 
			
		||||
      - ./logs:/app/logs
 | 
			
		||||
      - ./config/config.yaml:/app/config/config.yaml
 | 
			
		||||
      - ./db/sdk:/app/db/sdk
 | 
			
		||||
    restart: always
 | 
			
		||||
    # depends_on:
 | 
			
		||||
    #   - kafka
 | 
			
		||||
    #   # - mysql
 | 
			
		||||
    #   # - mongodb
 | 
			
		||||
    #   - redis
 | 
			
		||||
    #   - etcd
 | 
			
		||||
 | 
			
		||||
  demo:
 | 
			
		||||
    networks: 
 | 
			
		||||
      - openim
 | 
			
		||||
    image: openim/demo
 | 
			
		||||
    container_name: openim_demo
 | 
			
		||||
    ports:
 | 
			
		||||
      - 42233:42233
 | 
			
		||||
    volumes:
 | 
			
		||||
      - ./logs:/app/logs
 | 
			
		||||
      - ./config/config.yaml:/app/config/config.yaml
 | 
			
		||||
      - ./db/sdk:/app/db/sdk
 | 
			
		||||
    restart: always
 | 
			
		||||
							
								
								
									
										30
									
								
								deploy/readme.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								deploy/readme.md
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,30 @@
 | 
			
		||||
 | 
			
		||||
### 以docker-compose 形式单独部署
 | 
			
		||||
```sh
 | 
			
		||||
# 查看 ./Makefile ,先编译各个需要的源码到 ../bin 
 | 
			
		||||
# win-* 表示在win平台编译位linux二进制,其实就是处理了 go env -w GOOS=linux 
 | 
			
		||||
make win-build-all
 | 
			
		||||
 | 
			
		||||
# 得到各个二进制程序之后,打包为镜像
 | 
			
		||||
# 目前没有处理 Open-IM-SDK-Core ,需要的话可以自己单独处理这个模块
 | 
			
		||||
make image-all
 | 
			
		||||
 | 
			
		||||
# docker-compose.yaml 分成了两部分,一部分是openIM的镜像容器 openim.yaml,一部分是依赖的环境 env.yaml
 | 
			
		||||
# 两部分使用一个外部的网络来联通,所以首先创建用到的 network
 | 
			
		||||
docker network create openim --attachable=true -d bridge
 | 
			
		||||
 | 
			
		||||
# 处理openim组件需要的挂载目录,主要是处理config目录
 | 
			
		||||
mkdir ./config
 | 
			
		||||
cp ./config.example.yaml ./config/config.yaml # 修改 ./config/config.yaml 内容,比如各个依赖组件的 host
 | 
			
		||||
 | 
			
		||||
# 然后拉起env.yaml
 | 
			
		||||
docker-compose -f ./env.yaml up -d
 | 
			
		||||
 | 
			
		||||
# 等env 容器全部拉起成功之后,拉起openim.yaml
 | 
			
		||||
docker-compose -f ./openim.yaml up -d
 | 
			
		||||
 | 
			
		||||
# 查看容器运行,推荐使用下 portainer ,web查看容器情况,查看日志等等
 | 
			
		||||
docker container ps -a | grep openim
 | 
			
		||||
 | 
			
		||||
# 正常应该是查看api,demo等的容器日志,看到gin打印的路由日志才算是成功
 | 
			
		||||
```
 | 
			
		||||
@ -24,9 +24,14 @@ services:
 | 
			
		||||
      - ./components/mongodb/data/db:/data/db
 | 
			
		||||
      - ./components/mongodb/data/logs:/data/logs
 | 
			
		||||
      - ./components/mongodb/data/conf:/etc/mongo
 | 
			
		||||
  #  environment:
 | 
			
		||||
   #   - MONGO_INITDB_ROOT_USERNAME=openIM
 | 
			
		||||
    #  - MONGO_INITDB_ROOT_PASSWORD=openIM
 | 
			
		||||
    environment:
 | 
			
		||||
      - TZ=Asia/Shanghai
 | 
			
		||||
      # cache
 | 
			
		||||
      - wiredTigerCacheSizeGB=1
 | 
			
		||||
#    environment:
 | 
			
		||||
#      - MONGO_INITDB_ROOT_USERNAME=openIM
 | 
			
		||||
#      - MONGO_INITDB_ROOT_PASSWORD=openIM
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
      #TZ: Asia/Shanghai
 | 
			
		||||
    restart: always
 | 
			
		||||
@ -89,14 +94,13 @@ services:
 | 
			
		||||
    command: /usr/local/bin/etcd --name etcd0 --data-dir /etcd-data --listen-client-urls http://0.0.0.0:2379 --advertise-client-urls http://0.0.0.0:2379 --listen-peer-urls http://0.0.0.0:2380 --initial-advertise-peer-urls http://0.0.0.0:2380 --initial-cluster etcd0=http://0.0.0.0:2380 --initial-cluster-token tkn --initial-cluster-state new
 | 
			
		||||
 | 
			
		||||
  open_im_server:
 | 
			
		||||
    image: openim/open_im_server:v1.0.8
 | 
			
		||||
    image: openim/open_im_server:v2.0.4
 | 
			
		||||
    container_name: open_im_server
 | 
			
		||||
    volumes:
 | 
			
		||||
      - ./logs:/Open-IM-Server/logs
 | 
			
		||||
      - ./config/config.yaml:/Open-IM-Server/config/config.yaml
 | 
			
		||||
      - ./db/sdk:/Open-IM-Server/db/sdk
 | 
			
		||||
      - ./script:/Open-IM-Server/script
 | 
			
		||||
 | 
			
		||||
    restart: always
 | 
			
		||||
    depends_on:
 | 
			
		||||
      - kafka
 | 
			
		||||
 | 
			
		||||
										
											Binary file not shown.
										
									
								
							| 
		 Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 21 KiB  | 
							
								
								
									
										24
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										24
									
								
								go.mod
									
									
									
									
									
								
							@ -5,43 +5,55 @@ go 1.15
 | 
			
		||||
require (
 | 
			
		||||
	github.com/Shopify/sarama v1.19.0
 | 
			
		||||
	github.com/Shopify/toxiproxy v2.1.4+incompatible // indirect
 | 
			
		||||
	github.com/aliyun/alibaba-cloud-sdk-go v1.61.1422
 | 
			
		||||
	github.com/alibabacloud-go/darabonba-openapi v0.1.11
 | 
			
		||||
	github.com/alibabacloud-go/dysmsapi-20170525/v2 v2.0.8
 | 
			
		||||
	github.com/alibabacloud-go/sts-20150401 v1.1.0
 | 
			
		||||
	github.com/alibabacloud-go/tea v1.1.17
 | 
			
		||||
	github.com/antonfisher/nested-logrus-formatter v1.3.0
 | 
			
		||||
	github.com/bwmarrin/snowflake v0.3.0
 | 
			
		||||
	github.com/coreos/go-semver v0.3.0 // indirect
 | 
			
		||||
	github.com/dustin/go-humanize v1.0.0 // indirect
 | 
			
		||||
	github.com/eapache/go-resiliency v1.2.0 // indirect
 | 
			
		||||
	github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21 // indirect
 | 
			
		||||
	github.com/eapache/queue v1.1.0 // indirect
 | 
			
		||||
	github.com/fatih/structs v1.1.0
 | 
			
		||||
	github.com/frankban/quicktest v1.14.0 // indirect
 | 
			
		||||
	github.com/garyburd/redigo v1.6.2
 | 
			
		||||
	github.com/gin-gonic/gin v1.7.0
 | 
			
		||||
	github.com/go-playground/validator/v10 v10.4.1
 | 
			
		||||
	github.com/go-sql-driver/mysql v1.6.0 // indirect
 | 
			
		||||
	github.com/golang-jwt/jwt/v4 v4.1.0
 | 
			
		||||
	github.com/golang/protobuf v1.5.2
 | 
			
		||||
	github.com/golang/snappy v0.0.4 // indirect
 | 
			
		||||
	github.com/gorilla/websocket v1.4.2
 | 
			
		||||
	github.com/jinzhu/copier v0.3.4
 | 
			
		||||
	github.com/jinzhu/gorm v1.9.16
 | 
			
		||||
	github.com/jinzhu/now v1.1.3 // indirect
 | 
			
		||||
	github.com/jonboulle/clockwork v0.2.2 // indirect
 | 
			
		||||
	github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible
 | 
			
		||||
	github.com/lestrrat-go/strftime v1.0.4 // indirect
 | 
			
		||||
	github.com/lib/pq v1.2.0 // indirect
 | 
			
		||||
	github.com/mattn/go-sqlite3 v1.14.6 // indirect
 | 
			
		||||
	github.com/mitchellh/mapstructure v1.4.1
 | 
			
		||||
	github.com/minio/minio-go/v7 v7.0.22
 | 
			
		||||
	github.com/mitchellh/mapstructure v1.4.2
 | 
			
		||||
	github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646
 | 
			
		||||
	github.com/olivere/elastic/v7 v7.0.23
 | 
			
		||||
	github.com/pierrec/lz4 v2.6.1+incompatible // indirect
 | 
			
		||||
	github.com/pkg/errors v0.9.1
 | 
			
		||||
	github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect
 | 
			
		||||
	github.com/rifflock/lfshook v0.0.0-20180920164130-b9218ef580f5
 | 
			
		||||
	github.com/sirupsen/logrus v1.8.1
 | 
			
		||||
	github.com/spf13/viper v1.9.0
 | 
			
		||||
	github.com/stretchr/testify v1.7.0
 | 
			
		||||
	github.com/tencentyun/qcloud-cos-sts-sdk v0.0.0-20210325043845-84a0811633ca
 | 
			
		||||
	github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5 // indirect
 | 
			
		||||
	go.etcd.io/etcd v0.0.0-20200402134248-51bdeb39e698
 | 
			
		||||
	go.mongodb.org/mongo-driver v1.8.3
 | 
			
		||||
	golang.org/x/image v0.0.0-20210220032944-ac19c3e999fb
 | 
			
		||||
	golang.org/x/net v0.0.0-20210917221730-978cfadd31cf
 | 
			
		||||
	golang.org/x/tools v0.0.0-20210106214847-113979e3529a // indirect
 | 
			
		||||
	google.golang.org/grpc v1.33.2
 | 
			
		||||
	google.golang.org/grpc v1.40.0
 | 
			
		||||
	google.golang.org/protobuf v1.27.1
 | 
			
		||||
	gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
 | 
			
		||||
	gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df
 | 
			
		||||
	gopkg.in/ini.v1 v1.66.2 // indirect
 | 
			
		||||
	gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22
 | 
			
		||||
	gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b
 | 
			
		||||
	sigs.k8s.io/yaml v1.2.0 // indirect
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										613
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										613
									
								
								go.sum
									
									
									
									
									
								
							@ -1,5 +1,48 @@
 | 
			
		||||
github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
 | 
			
		||||
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
 | 
			
		||||
cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
 | 
			
		||||
cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
 | 
			
		||||
cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
 | 
			
		||||
cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
 | 
			
		||||
cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
 | 
			
		||||
cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=
 | 
			
		||||
cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=
 | 
			
		||||
cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=
 | 
			
		||||
cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=
 | 
			
		||||
cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=
 | 
			
		||||
cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=
 | 
			
		||||
cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=
 | 
			
		||||
cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=
 | 
			
		||||
cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI=
 | 
			
		||||
cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk=
 | 
			
		||||
cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg=
 | 
			
		||||
cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8=
 | 
			
		||||
cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0=
 | 
			
		||||
cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY=
 | 
			
		||||
cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM=
 | 
			
		||||
cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY=
 | 
			
		||||
cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ=
 | 
			
		||||
cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI=
 | 
			
		||||
cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
 | 
			
		||||
cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
 | 
			
		||||
cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
 | 
			
		||||
cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=
 | 
			
		||||
cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=
 | 
			
		||||
cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
 | 
			
		||||
cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
 | 
			
		||||
cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
 | 
			
		||||
cloud.google.com/go/firestore v1.6.0/go.mod h1:afJwI0vaXwAG54kI7A//lP/lSPDkQORQuMkv56TxEPU=
 | 
			
		||||
cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
 | 
			
		||||
cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
 | 
			
		||||
cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
 | 
			
		||||
cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=
 | 
			
		||||
cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
 | 
			
		||||
cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=
 | 
			
		||||
cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
 | 
			
		||||
cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
 | 
			
		||||
cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
 | 
			
		||||
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
 | 
			
		||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
 | 
			
		||||
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
 | 
			
		||||
github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc=
 | 
			
		||||
github.com/Shopify/sarama v1.19.0 h1:9oksLxC6uxVPHPVYUmq6xhr1BOF/hHobWH2UzO67z1s=
 | 
			
		||||
github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo=
 | 
			
		||||
@ -7,11 +50,41 @@ github.com/Shopify/toxiproxy v2.1.4+incompatible h1:TKdv8HiTLgE5wdJuEML90aBgNWso
 | 
			
		||||
github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI=
 | 
			
		||||
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
 | 
			
		||||
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
 | 
			
		||||
github.com/aliyun/alibaba-cloud-sdk-go v1.61.1422 h1:cS+mI0luvAyG2ssIq/rhEOvUWf3PtdepvpGjipIi5kQ=
 | 
			
		||||
github.com/aliyun/alibaba-cloud-sdk-go v1.61.1422/go.mod h1:RcDobYh8k5VP6TNybz9m++gL3ijVI5wueVr0EM10VsU=
 | 
			
		||||
github.com/alibabacloud-go/darabonba-openapi v0.1.7/go.mod h1:6FV1Bt1AItYIlC2rVopPTumrRNtkfPBmrPVAZ8v2bLk=
 | 
			
		||||
github.com/alibabacloud-go/darabonba-openapi v0.1.11 h1:w59gtSA0s87p0U5NNG/N/PIHsRP3rtj7qCP9hx9+GL8=
 | 
			
		||||
github.com/alibabacloud-go/darabonba-openapi v0.1.11/go.mod h1:MPJMxv7HYrFm5m9uOZWkDYsAWyZztEgnBRfk9Fg0eIU=
 | 
			
		||||
github.com/alibabacloud-go/darabonba-string v1.0.0/go.mod h1:93cTfV3vuPhhEwGGpKKqhVW4jLe7tDpo3LUM0i0g6mA=
 | 
			
		||||
github.com/alibabacloud-go/debug v0.0.0-20190504072949-9472017b5c68 h1:NqugFkGxx1TXSh/pBcU00Y6bljgDPaFdh5MUSeJ7e50=
 | 
			
		||||
github.com/alibabacloud-go/debug v0.0.0-20190504072949-9472017b5c68/go.mod h1:6pb/Qy8c+lqua8cFpEy7g39NRRqOWc3rOwAy8m5Y2BY=
 | 
			
		||||
github.com/alibabacloud-go/dysmsapi-20170525/v2 v2.0.8 h1:KXMiCg99Jx7B6V+DlRFbWwL9UCGippE5z1wGzhyimiA=
 | 
			
		||||
github.com/alibabacloud-go/dysmsapi-20170525/v2 v2.0.8/go.mod h1:8aL6tSyQIWJygF7W/Vqxdf/QDbN2S+u57k36bEA8hD8=
 | 
			
		||||
github.com/alibabacloud-go/endpoint-util v1.1.0 h1:r/4D3VSw888XGaeNpP994zDUaxdgTSHBbVfZlzf6b5Q=
 | 
			
		||||
github.com/alibabacloud-go/endpoint-util v1.1.0/go.mod h1:O5FuCALmCKs2Ff7JFJMudHs0I5EBgecXXxZRyswlEjE=
 | 
			
		||||
github.com/alibabacloud-go/openapi-util v0.0.8/go.mod h1:sQuElr4ywwFRlCCberQwKRFhRzIyG4QTP/P4y1CJ6Ws=
 | 
			
		||||
github.com/alibabacloud-go/openapi-util v0.0.9 h1:Z0DP4LFzkM/rW2nxOMiiLoQVZSeE3jVc5jrZ9Fd/UX0=
 | 
			
		||||
github.com/alibabacloud-go/openapi-util v0.0.9/go.mod h1:sQuElr4ywwFRlCCberQwKRFhRzIyG4QTP/P4y1CJ6Ws=
 | 
			
		||||
github.com/alibabacloud-go/sts-20150401 v1.1.0 h1:1yVyKz02ES6aKo3xVjmoPLBH1OAmmSqPkhKRdjEkmYs=
 | 
			
		||||
github.com/alibabacloud-go/sts-20150401 v1.1.0/go.mod h1:QW4O/c7Hp4krHYt+6xwnoG8EyZW3V9GYkl6EgIBmxJc=
 | 
			
		||||
github.com/alibabacloud-go/tea v1.1.0/go.mod h1:IkGyUSX4Ba1V+k4pCtJUc6jDpZLFph9QMy2VUPTwukg=
 | 
			
		||||
github.com/alibabacloud-go/tea v1.1.7/go.mod h1:/tmnEaQMyb4Ky1/5D+SE1BAsa5zj/KeGOFfwYm3N/p4=
 | 
			
		||||
github.com/alibabacloud-go/tea v1.1.8/go.mod h1:/tmnEaQMyb4Ky1/5D+SE1BAsa5zj/KeGOFfwYm3N/p4=
 | 
			
		||||
github.com/alibabacloud-go/tea v1.1.11/go.mod h1:/tmnEaQMyb4Ky1/5D+SE1BAsa5zj/KeGOFfwYm3N/p4=
 | 
			
		||||
github.com/alibabacloud-go/tea v1.1.15/go.mod h1:nXxjm6CIFkBhwW4FQkNrolwbfon8Svy6cujmKFUq98A=
 | 
			
		||||
github.com/alibabacloud-go/tea v1.1.17 h1:05R5DnaJXe9sCNIe8KUgWHC/z6w/VZIwczgUwzRnul8=
 | 
			
		||||
github.com/alibabacloud-go/tea v1.1.17/go.mod h1:nXxjm6CIFkBhwW4FQkNrolwbfon8Svy6cujmKFUq98A=
 | 
			
		||||
github.com/alibabacloud-go/tea-utils v1.3.1/go.mod h1:EI/o33aBfj3hETm4RLiAxF/ThQdSngxrpF8rKUDJjPE=
 | 
			
		||||
github.com/alibabacloud-go/tea-utils v1.3.9 h1:TtbzxS+BXrisA7wzbAMRtlU8A2eWLg0ufm7m/Tl6fc4=
 | 
			
		||||
github.com/alibabacloud-go/tea-utils v1.3.9/go.mod h1:EI/o33aBfj3hETm4RLiAxF/ThQdSngxrpF8rKUDJjPE=
 | 
			
		||||
github.com/aliyun/credentials-go v1.1.2 h1:qU1vwGIBb3UJ8BwunHDRFtAhS6jnQLnde/yk0+Ih2GY=
 | 
			
		||||
github.com/aliyun/credentials-go v1.1.2/go.mod h1:ozcZaMR5kLM7pwtCMEpVmQ242suV6qTJya2bDq4X1Tw=
 | 
			
		||||
github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y=
 | 
			
		||||
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
 | 
			
		||||
github.com/antonfisher/nested-logrus-formatter v1.3.0 h1:8zixYquU1Odk+vzAaAQPAdRh1ZjmUXNQ1T+dUBvlhVo=
 | 
			
		||||
github.com/antonfisher/nested-logrus-formatter v1.3.0/go.mod h1:6WTfyWFkBc9+zyBaKIqRrg/KwMqBbodBjgbHjDz7zjA=
 | 
			
		||||
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
 | 
			
		||||
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
 | 
			
		||||
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
 | 
			
		||||
github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
 | 
			
		||||
github.com/aws/aws-sdk-go v1.38.3/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro=
 | 
			
		||||
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
 | 
			
		||||
github.com/beorn7/perks v1.0.0 h1:HWo1m869IqiPhD389kmkxeTalrjNbbJTC8LXupb+sl0=
 | 
			
		||||
@ -20,14 +93,18 @@ github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kB
 | 
			
		||||
github.com/bwmarrin/snowflake v0.3.0 h1:xm67bEhkKh6ij1790JB83OujPR5CzNe8QuQqAgISZN0=
 | 
			
		||||
github.com/bwmarrin/snowflake v0.3.0/go.mod h1:NdZxfVWX+oR6y2K0o6qAYv6gIOP9rjG0/E9WsDpxqwE=
 | 
			
		||||
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
 | 
			
		||||
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
 | 
			
		||||
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
 | 
			
		||||
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
 | 
			
		||||
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
 | 
			
		||||
github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa h1:OaNxuTZr7kxeODyLWsRMC+OD03aFUH+mW6r2d+MWa5Y=
 | 
			
		||||
github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8=
 | 
			
		||||
github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
 | 
			
		||||
github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM=
 | 
			
		||||
github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
 | 
			
		||||
github.com/coreos/go-systemd/v22 v22.0.0 h1:XJIw/+VlJ+87J+doOxznsAWIdmWuViOVhkQamW5YV28=
 | 
			
		||||
github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk=
 | 
			
		||||
github.com/coreos/go-systemd/v22 v22.3.2 h1:D9/bQk5vlXQFZ6Kwuu6zaiXJ9oTPe68++AzAJc1DzSI=
 | 
			
		||||
github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
 | 
			
		||||
github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
 | 
			
		||||
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
 | 
			
		||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 | 
			
		||||
@ -51,10 +128,15 @@ github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7
 | 
			
		||||
github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5 h1:Yzb9+7DPaBjB8zlTR87/ElzFsnQfuHnVUVqpZZIcV5Y=
 | 
			
		||||
github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a2zkGnVExMxdzMo3M0Hi/3sEU+cWnZpSni0O6/Yb/P0=
 | 
			
		||||
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
 | 
			
		||||
github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=
 | 
			
		||||
github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo=
 | 
			
		||||
github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M=
 | 
			
		||||
github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw=
 | 
			
		||||
github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g=
 | 
			
		||||
github.com/frankban/quicktest v1.14.0 h1:+cqqvzZV87b4adx/5ayVOaYZ2CrvM4ejQvUdBzPPUss=
 | 
			
		||||
github.com/frankban/quicktest v1.14.0/go.mod h1:NeW+ay9A/U67EYXNFA1nPE8e/tnQv/09mUdL/ijj8og=
 | 
			
		||||
github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI=
 | 
			
		||||
github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU=
 | 
			
		||||
github.com/garyburd/redigo v1.6.2 h1:yE/pwKCrbLpLpQICzYTeZ7JsTA/C53wFTJHaEtRqniM=
 | 
			
		||||
github.com/garyburd/redigo v1.6.2/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY=
 | 
			
		||||
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
 | 
			
		||||
@ -62,6 +144,9 @@ github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE
 | 
			
		||||
github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
 | 
			
		||||
github.com/gin-gonic/gin v1.7.0 h1:jGB9xAJQ12AIGNB4HguylppmDK1Am9ppF7XnGXXJuoU=
 | 
			
		||||
github.com/gin-gonic/gin v1.7.0/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY=
 | 
			
		||||
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
 | 
			
		||||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
 | 
			
		||||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
 | 
			
		||||
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
 | 
			
		||||
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
 | 
			
		||||
github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A=
 | 
			
		||||
@ -72,52 +157,102 @@ github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD87
 | 
			
		||||
github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA=
 | 
			
		||||
github.com/go-playground/validator/v10 v10.4.1 h1:pH2c5ADXtd66mxoE0Zm9SUhxE20r7aM3F26W0hOn+GE=
 | 
			
		||||
github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4=
 | 
			
		||||
github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs=
 | 
			
		||||
github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
 | 
			
		||||
github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE=
 | 
			
		||||
github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
 | 
			
		||||
github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk=
 | 
			
		||||
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
 | 
			
		||||
github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
 | 
			
		||||
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
 | 
			
		||||
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
 | 
			
		||||
github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE=
 | 
			
		||||
github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
 | 
			
		||||
github.com/goji/httpauth v0.0.0-20160601135302-2da839ab0f4d/go.mod h1:nnjvkQ9ptGaCkuDUx6wNykzzlUixGxvkme+H/lnzb+A=
 | 
			
		||||
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
 | 
			
		||||
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
 | 
			
		||||
github.com/golang-jwt/jwt/v4 v4.1.0 h1:XUgk2Ex5veyVFVeLm0xhusUTQybEbexJXrvPNOKkSY0=
 | 
			
		||||
github.com/golang-jwt/jwt/v4 v4.1.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg=
 | 
			
		||||
github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe h1:lXe2qZdvpiX5WZkZR4hgp4KJVfY3nMkvmwbVkpv1rVY=
 | 
			
		||||
github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0=
 | 
			
		||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
 | 
			
		||||
github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
 | 
			
		||||
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
 | 
			
		||||
github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
 | 
			
		||||
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY=
 | 
			
		||||
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
 | 
			
		||||
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
 | 
			
		||||
github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
 | 
			
		||||
github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
 | 
			
		||||
github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
 | 
			
		||||
github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
 | 
			
		||||
github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
 | 
			
		||||
github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
 | 
			
		||||
github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8=
 | 
			
		||||
github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=
 | 
			
		||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 | 
			
		||||
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 | 
			
		||||
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 | 
			
		||||
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
 | 
			
		||||
github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
 | 
			
		||||
github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
 | 
			
		||||
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
 | 
			
		||||
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
 | 
			
		||||
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
 | 
			
		||||
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
 | 
			
		||||
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
 | 
			
		||||
github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
 | 
			
		||||
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
 | 
			
		||||
github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
 | 
			
		||||
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
 | 
			
		||||
github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM=
 | 
			
		||||
github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
 | 
			
		||||
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
 | 
			
		||||
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 | 
			
		||||
github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 | 
			
		||||
github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
 | 
			
		||||
github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 | 
			
		||||
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
 | 
			
		||||
github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo=
 | 
			
		||||
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
 | 
			
		||||
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
 | 
			
		||||
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
 | 
			
		||||
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
 | 
			
		||||
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 | 
			
		||||
github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 | 
			
		||||
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 | 
			
		||||
github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 | 
			
		||||
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 | 
			
		||||
github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 | 
			
		||||
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 | 
			
		||||
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 | 
			
		||||
github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ=
 | 
			
		||||
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 | 
			
		||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 | 
			
		||||
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
 | 
			
		||||
github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
 | 
			
		||||
github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
 | 
			
		||||
github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk=
 | 
			
		||||
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
 | 
			
		||||
github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
 | 
			
		||||
github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
 | 
			
		||||
github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
 | 
			
		||||
github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
 | 
			
		||||
github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
 | 
			
		||||
github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
 | 
			
		||||
github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
 | 
			
		||||
github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
 | 
			
		||||
github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
 | 
			
		||||
github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
 | 
			
		||||
github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
 | 
			
		||||
github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
 | 
			
		||||
github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
 | 
			
		||||
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
 | 
			
		||||
github.com/google/uuid v1.0.0 h1:b4Gk+7WdP/d3HZH8EJsZpvV7EtDOgaZLtnaNGIu1adA=
 | 
			
		||||
github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 | 
			
		||||
github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY=
 | 
			
		||||
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 | 
			
		||||
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
 | 
			
		||||
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
 | 
			
		||||
github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0=
 | 
			
		||||
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
 | 
			
		||||
github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
 | 
			
		||||
github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
 | 
			
		||||
github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=
 | 
			
		||||
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
 | 
			
		||||
@ -125,17 +260,43 @@ github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de
 | 
			
		||||
github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
 | 
			
		||||
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho=
 | 
			
		||||
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
 | 
			
		||||
github.com/grpc-ecosystem/grpc-gateway v1.9.5 h1:UImYN5qQ8tuGpGE16ZmjvcTtTw24zw1QAp/SlnNrZhI=
 | 
			
		||||
github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
 | 
			
		||||
github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo=
 | 
			
		||||
github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
 | 
			
		||||
github.com/hashicorp/consul/api v1.10.1/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M=
 | 
			
		||||
github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms=
 | 
			
		||||
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
 | 
			
		||||
github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
 | 
			
		||||
github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=
 | 
			
		||||
github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
 | 
			
		||||
github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
 | 
			
		||||
github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
 | 
			
		||||
github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=
 | 
			
		||||
github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=
 | 
			
		||||
github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=
 | 
			
		||||
github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=
 | 
			
		||||
github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
 | 
			
		||||
github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
 | 
			
		||||
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
 | 
			
		||||
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
 | 
			
		||||
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
 | 
			
		||||
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
 | 
			
		||||
github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
 | 
			
		||||
github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY=
 | 
			
		||||
github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE=
 | 
			
		||||
github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk=
 | 
			
		||||
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
 | 
			
		||||
github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
 | 
			
		||||
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
 | 
			
		||||
github.com/jinzhu/copier v0.3.4 h1:mfU6jI9PtCeUjkjQ322dlff9ELjGDu975C2p/nrubVI=
 | 
			
		||||
github.com/jinzhu/copier v0.3.4/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg=
 | 
			
		||||
github.com/jinzhu/gorm v1.9.16 h1:+IyIjPEABKRpsu/F8OvDPy9fyQlgsg2luMV2ZIH5i5o=
 | 
			
		||||
github.com/jinzhu/gorm v1.9.16/go.mod h1:G3LB3wezTOWM2ITLzPxEXgSkOXAntiLHS7UdBefADcs=
 | 
			
		||||
github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
 | 
			
		||||
github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
 | 
			
		||||
github.com/jinzhu/now v1.0.1 h1:HjfetcXq097iXP0uoPCdnM4Efp5/9MsM0/M+XOTeR3M=
 | 
			
		||||
github.com/jinzhu/now v1.0.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
 | 
			
		||||
github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
 | 
			
		||||
github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg=
 | 
			
		||||
github.com/jinzhu/now v1.1.3 h1:PlHq1bSCSZL9K0wUhbm2pGLoTWs2GwVhsP6emvGV/ZI=
 | 
			
		||||
github.com/jinzhu/now v1.1.3/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
 | 
			
		||||
github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
 | 
			
		||||
github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8=
 | 
			
		||||
github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
 | 
			
		||||
@ -147,14 +308,28 @@ github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFF
 | 
			
		||||
github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
 | 
			
		||||
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
 | 
			
		||||
github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
 | 
			
		||||
github.com/json-iterator/go v1.1.9 h1:9yzud/Ht36ygwatGx56VwCZtlI/2AD15T1X2sjSuGns=
 | 
			
		||||
github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
 | 
			
		||||
github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
 | 
			
		||||
github.com/json-iterator/go v1.1.11 h1:uVUAXhF2To8cbw/3xN3pxj6kk7TYKs98NIrTqPlMWAQ=
 | 
			
		||||
github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
 | 
			
		||||
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
 | 
			
		||||
github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
 | 
			
		||||
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
 | 
			
		||||
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
 | 
			
		||||
github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
 | 
			
		||||
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
 | 
			
		||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
 | 
			
		||||
github.com/klauspost/compress v1.13.5/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
 | 
			
		||||
github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc=
 | 
			
		||||
github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
 | 
			
		||||
github.com/klauspost/cpuid v1.2.3/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
 | 
			
		||||
github.com/klauspost/cpuid v1.3.1 h1:5JNjFYYQrZeKRJ0734q51WCEEn2huer72Dc7K+R/b6s=
 | 
			
		||||
github.com/klauspost/cpuid v1.3.1/go.mod h1:bYW4mA6ZgKPob1/Dlai2LviZJO7KGI3uoWLd42rAQw4=
 | 
			
		||||
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 | 
			
		||||
github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
 | 
			
		||||
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
 | 
			
		||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
 | 
			
		||||
github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
 | 
			
		||||
github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
 | 
			
		||||
github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
 | 
			
		||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
 | 
			
		||||
@ -172,10 +347,18 @@ github.com/lestrrat-go/strftime v1.0.4/go.mod h1:E1nN3pCbtMSu1yjSVeyuRFVm/U0xoR7
 | 
			
		||||
github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
 | 
			
		||||
github.com/lib/pq v1.2.0 h1:LXpIM/LZ5xGFhOpXAQUIMM1HdyqzVYM13zNdjCEEcA0=
 | 
			
		||||
github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
 | 
			
		||||
github.com/magiconair/properties v1.8.5 h1:b6kJs+EmPFMYGkow9GiUyCyOvIwYetYJ3fSaWak/Gls=
 | 
			
		||||
github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60=
 | 
			
		||||
github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
 | 
			
		||||
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
 | 
			
		||||
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
 | 
			
		||||
github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
 | 
			
		||||
github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
 | 
			
		||||
github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
 | 
			
		||||
github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
 | 
			
		||||
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
 | 
			
		||||
github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=
 | 
			
		||||
github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=
 | 
			
		||||
github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
 | 
			
		||||
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
 | 
			
		||||
github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
 | 
			
		||||
@ -184,29 +367,52 @@ github.com/mattn/go-sqlite3 v1.14.6 h1:dNPt6NO46WmLVt2DLNpwczCmdV5boIZ6g/tlDrlRU
 | 
			
		||||
github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
 | 
			
		||||
github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
 | 
			
		||||
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
 | 
			
		||||
github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag=
 | 
			
		||||
github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
 | 
			
		||||
github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
 | 
			
		||||
github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=
 | 
			
		||||
github.com/minio/md5-simd v1.1.0 h1:QPfiOqlZH+Cj9teu0t9b1nTBfPbyTl16Of5MeuShdK4=
 | 
			
		||||
github.com/minio/md5-simd v1.1.0/go.mod h1:XpBqgZULrMYD3R+M28PcmP0CkI7PEMzB3U77ZrKZ0Gw=
 | 
			
		||||
github.com/minio/minio-go/v7 v7.0.22 h1:iXhsiRyYh1ozm/+jN2qGgEIahYjEkvcpuu6NcdpSxcA=
 | 
			
		||||
github.com/minio/minio-go/v7 v7.0.22/go.mod h1:ei5JjmxwHaMrgsMrn4U/+Nmg+d8MKS1U2DAn1ou4+Do=
 | 
			
		||||
github.com/minio/sha256-simd v0.1.1 h1:5QHSlgo3nt5yKOJrC7W8w7X+NFl8cMPZm96iu8kKUJU=
 | 
			
		||||
github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM=
 | 
			
		||||
github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=
 | 
			
		||||
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
 | 
			
		||||
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
 | 
			
		||||
github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=
 | 
			
		||||
github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
 | 
			
		||||
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
 | 
			
		||||
github.com/mitchellh/mapstructure v1.4.2 h1:6h7AQ0yhTcIsmFmnAwQls75jp2Gzs4iB8W7pjMO+rqo=
 | 
			
		||||
github.com/mitchellh/mapstructure v1.4.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
 | 
			
		||||
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
 | 
			
		||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
 | 
			
		||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
 | 
			
		||||
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
 | 
			
		||||
github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI=
 | 
			
		||||
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
 | 
			
		||||
github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=
 | 
			
		||||
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
 | 
			
		||||
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ=
 | 
			
		||||
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8=
 | 
			
		||||
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
 | 
			
		||||
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
 | 
			
		||||
github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
 | 
			
		||||
github.com/olivere/elastic/v7 v7.0.23 h1:b7tjMogDMhf2CisGI+L02LXLVa0ZyE82Z15XfW1e8t8=
 | 
			
		||||
github.com/olivere/elastic/v7 v7.0.23/go.mod h1:OuWmD2DiuYhddWegBKPWQuelVKBLrW0fa/VUYgxuGTY=
 | 
			
		||||
github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
 | 
			
		||||
github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
 | 
			
		||||
github.com/pelletier/go-toml v1.9.4 h1:tjENF6MfZAg8e4ZmZTeWaWiT2vXtsoO6+iuOjFhECwM=
 | 
			
		||||
github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
 | 
			
		||||
github.com/pierrec/lz4 v2.6.1+incompatible h1:9UY3+iC23yxF0UfGaYrGplQ+79Rg+h/q9FV9ix19jjM=
 | 
			
		||||
github.com/pierrec/lz4 v2.6.1+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
 | 
			
		||||
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 | 
			
		||||
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 | 
			
		||||
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
 | 
			
		||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 | 
			
		||||
github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI=
 | 
			
		||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 | 
			
		||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 | 
			
		||||
github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
 | 
			
		||||
github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=
 | 
			
		||||
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
 | 
			
		||||
github.com/prometheus/client_golang v1.0.0 h1:vrDKnkGzuGvhNAL56c7DBz29ZL+KxnoR0x7enabFceM=
 | 
			
		||||
github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
 | 
			
		||||
@ -224,31 +430,57 @@ github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqn
 | 
			
		||||
github.com/rifflock/lfshook v0.0.0-20180920164130-b9218ef580f5 h1:mZHayPoR0lNmnHyvtYjDeq0zlVHn9K/ZXoy17ylucdo=
 | 
			
		||||
github.com/rifflock/lfshook v0.0.0-20180920164130-b9218ef580f5/go.mod h1:GEXHk5HgEKCvEIIrSpFI3ozzG5xOKA2DVlEX/gGnewM=
 | 
			
		||||
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
 | 
			
		||||
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
 | 
			
		||||
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
 | 
			
		||||
github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k=
 | 
			
		||||
github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
 | 
			
		||||
github.com/rs/xid v1.2.1 h1:mhH9Nq+C1fY2l1XIpgxIiUOfNpRBYH1kKcr+qfKgjRc=
 | 
			
		||||
github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ=
 | 
			
		||||
github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
 | 
			
		||||
github.com/sagikazarmark/crypt v0.1.0/go.mod h1:B/mN0msZuINBtQ1zZLEQcegFJJf9vnYIR88KRMEuODE=
 | 
			
		||||
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
 | 
			
		||||
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
 | 
			
		||||
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
 | 
			
		||||
github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE=
 | 
			
		||||
github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
 | 
			
		||||
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
 | 
			
		||||
github.com/smartystreets/assertions v1.1.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo=
 | 
			
		||||
github.com/smartystreets/assertions v1.1.1/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo=
 | 
			
		||||
github.com/smartystreets/go-aws-auth v0.0.0-20180515143844-0c1422d1fdb9/go.mod h1:SnhjPscd9TpLiy1LpzGSKh3bXCfxxXuqd9xmQJy3slM=
 | 
			
		||||
github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
 | 
			
		||||
github.com/smartystreets/gunit v1.4.2/go.mod h1:ZjM1ozSIMJlAz/ay4SG8PeKF00ckUp+zMHZXV9/bvak=
 | 
			
		||||
github.com/soheilhy/cmux v0.1.4 h1:0HKaf1o97UwFjHH9o5XsHUOF+tqmdA7KEzXLpiyaw0E=
 | 
			
		||||
github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
 | 
			
		||||
github.com/spf13/afero v1.6.0 h1:xoax2sJ2DT8S8xA2paPFjDCScCNeWsg75VG0DLRreiY=
 | 
			
		||||
github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=
 | 
			
		||||
github.com/spf13/cast v1.4.1 h1:s0hze+J0196ZfEMTs80N7UlFt0BDuQ7Q+JDnHiMWKdA=
 | 
			
		||||
github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
 | 
			
		||||
github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
 | 
			
		||||
github.com/spf13/pflag v1.0.1 h1:aCvUg6QPl3ibpQUxyLkrEkCHtPqYJL4x9AuhqVqFis4=
 | 
			
		||||
github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk=
 | 
			
		||||
github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo=
 | 
			
		||||
github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
 | 
			
		||||
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
 | 
			
		||||
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
 | 
			
		||||
github.com/spf13/viper v1.9.0 h1:yR6EXjTp0y0cLN8OZg1CRZmOBdI88UcGkhgyJhu6nZk=
 | 
			
		||||
github.com/spf13/viper v1.9.0/go.mod h1:+i6ajR7OX2XaiBkrcZJFK21htRk7eDeLg7+O6bhUPP4=
 | 
			
		||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 | 
			
		||||
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 | 
			
		||||
github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
 | 
			
		||||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
 | 
			
		||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
 | 
			
		||||
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
 | 
			
		||||
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
 | 
			
		||||
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 | 
			
		||||
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
 | 
			
		||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 | 
			
		||||
github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s=
 | 
			
		||||
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
 | 
			
		||||
github.com/tencentyun/qcloud-cos-sts-sdk v0.0.0-20210325043845-84a0811633ca h1:G/aIr3WiUesWHL2YGYgEqjM5tCAJ43Ml+0C18wDkWWs=
 | 
			
		||||
github.com/tencentyun/qcloud-cos-sts-sdk v0.0.0-20210325043845-84a0811633ca/go.mod h1:b18KQa4IxHbxeseW1GcZox53d7J0z39VNONTxvvlkXw=
 | 
			
		||||
github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4=
 | 
			
		||||
github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
 | 
			
		||||
github.com/tjfoc/gmsm v1.3.2 h1:7JVkAn5bvUJ7HtU08iW6UiD+UTmJTIToHCfeFzkcCxM=
 | 
			
		||||
github.com/tjfoc/gmsm v1.3.2/go.mod h1:HaUcFuY0auTiaHB9MHFGCPx5IaLhTUd2atbCFBQXn9w=
 | 
			
		||||
github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
 | 
			
		||||
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5 h1:LnC5Kc/wtumK+WB441p7ynQJzVuNRJiqddSIE3IlSEQ=
 | 
			
		||||
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
 | 
			
		||||
@ -257,118 +489,428 @@ github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVM
 | 
			
		||||
github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs=
 | 
			
		||||
github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY=
 | 
			
		||||
github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
 | 
			
		||||
github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c=
 | 
			
		||||
github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
 | 
			
		||||
github.com/xdg-go/scram v1.0.2 h1:akYIkZ28e6A96dkWNJQu3nmCzH3YfwMPQExUYDaRv7w=
 | 
			
		||||
github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs=
 | 
			
		||||
github.com/xdg-go/stringprep v1.0.2 h1:6iq84/ryjjeRmMJwxutI51F2GIPlP5BfTvXHeYjyhBc=
 | 
			
		||||
github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM=
 | 
			
		||||
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8=
 | 
			
		||||
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
 | 
			
		||||
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA=
 | 
			
		||||
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA=
 | 
			
		||||
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 | 
			
		||||
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 | 
			
		||||
github.com/yuin/goldmark v1.1.30/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 | 
			
		||||
github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 | 
			
		||||
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 | 
			
		||||
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
 | 
			
		||||
go.etcd.io/bbolt v1.3.4 h1:hi1bXHMVrlQh6WwxAy+qZCV/SYIlqo+Ushwdpa4tAKg=
 | 
			
		||||
go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ=
 | 
			
		||||
go.etcd.io/etcd v0.0.0-20200402134248-51bdeb39e698 h1:jWtjCJX1qxhHISBMLRztWwR+EXkI7MJAF2HjHAE/x/I=
 | 
			
		||||
go.etcd.io/etcd v0.0.0-20200402134248-51bdeb39e698/go.mod h1:YoUyTScD3Vcv2RBm3eGVOq7i1ULiz3OuXoQFWOirmAM=
 | 
			
		||||
go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs=
 | 
			
		||||
go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g=
 | 
			
		||||
go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ=
 | 
			
		||||
go.mongodb.org/mongo-driver v1.8.3 h1:TDKlTkGDKm9kkJVUOAXDK5/fkqKHJVwYQSpoRfB43R4=
 | 
			
		||||
go.mongodb.org/mongo-driver v1.8.3/go.mod h1:0sQWfOeY63QTntERDJJ/0SuKK0T1uVSgKCuAROlKEPY=
 | 
			
		||||
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
 | 
			
		||||
go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
 | 
			
		||||
go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
 | 
			
		||||
go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
 | 
			
		||||
go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
 | 
			
		||||
go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
 | 
			
		||||
go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
 | 
			
		||||
go.uber.org/atomic v1.6.0 h1:Ezj3JGmsOnG1MoRWQkPBsKLe9DwWD9QeXzTRzzldNVk=
 | 
			
		||||
go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
 | 
			
		||||
go.uber.org/multierr v1.5.0 h1:KCa4XfM8CWFCpxXRGok+Q0SS/0XBhMDbHHGABQLvD2A=
 | 
			
		||||
go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw=
 | 
			
		||||
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
 | 
			
		||||
go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU=
 | 
			
		||||
go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4=
 | 
			
		||||
go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4=
 | 
			
		||||
go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
 | 
			
		||||
go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
 | 
			
		||||
go.uber.org/zap v1.14.1 h1:nYDKopTbvAPq/NrUVZwT15y2lpROBiLLyoRTbXOYWOo=
 | 
			
		||||
go.uber.org/zap v1.14.1/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc=
 | 
			
		||||
go.uber.org/zap v1.17.0 h1:MTjgFu6ZLKvY6Pvaqk97GlxNBuMpV4Hy/3P6tRGlI2U=
 | 
			
		||||
go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20191205180655-e7c4368fe9dd/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20191219195013-becbf705a915/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20210817164053-32db794688a5 h1:HWj/xjIHfjYU5nVXpTM0s39J9CbLn7Cc5a7IC5rwsMQ=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 | 
			
		||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 | 
			
		||||
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 | 
			
		||||
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
 | 
			
		||||
golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
 | 
			
		||||
golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
 | 
			
		||||
golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
 | 
			
		||||
golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
 | 
			
		||||
golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
 | 
			
		||||
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
 | 
			
		||||
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
 | 
			
		||||
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
 | 
			
		||||
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
 | 
			
		||||
golang.org/x/image v0.0.0-20210220032944-ac19c3e999fb h1:fqpd0EBDzlHRCjiphRR5Zo/RSWWQlWv34418dnEixWk=
 | 
			
		||||
golang.org/x/image v0.0.0-20210220032944-ac19c3e999fb/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
 | 
			
		||||
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
 | 
			
		||||
golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs=
 | 
			
		||||
golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
 | 
			
		||||
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
 | 
			
		||||
golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
 | 
			
		||||
golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
 | 
			
		||||
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
 | 
			
		||||
golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
 | 
			
		||||
golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
 | 
			
		||||
golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
 | 
			
		||||
golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
 | 
			
		||||
golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
 | 
			
		||||
golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
 | 
			
		||||
golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
 | 
			
		||||
golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
 | 
			
		||||
golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4=
 | 
			
		||||
golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
 | 
			
		||||
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
 | 
			
		||||
golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
 | 
			
		||||
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 | 
			
		||||
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 | 
			
		||||
golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 | 
			
		||||
golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 | 
			
		||||
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 | 
			
		||||
golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
			
		||||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
			
		||||
golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
			
		||||
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
			
		||||
golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
			
		||||
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
			
		||||
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
			
		||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 | 
			
		||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 | 
			
		||||
golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 | 
			
		||||
golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 | 
			
		||||
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
 | 
			
		||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 | 
			
		||||
golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 | 
			
		||||
golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 | 
			
		||||
golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 | 
			
		||||
golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 | 
			
		||||
golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 | 
			
		||||
golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 | 
			
		||||
golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 | 
			
		||||
golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 | 
			
		||||
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 | 
			
		||||
golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 | 
			
		||||
golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
 | 
			
		||||
golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
 | 
			
		||||
golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
 | 
			
		||||
golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
 | 
			
		||||
golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
 | 
			
		||||
golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
 | 
			
		||||
golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
 | 
			
		||||
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
 | 
			
		||||
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
 | 
			
		||||
golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
 | 
			
		||||
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
 | 
			
		||||
golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
 | 
			
		||||
golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
 | 
			
		||||
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
 | 
			
		||||
golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=
 | 
			
		||||
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
 | 
			
		||||
golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 | 
			
		||||
golang.org/x/net v0.0.0-20210917221730-978cfadd31cf h1:R150MpwJIv1MpS0N/pc+NhTM8ajzvlmxlY5OYsrevXQ=
 | 
			
		||||
golang.org/x/net v0.0.0-20210917221730-978cfadd31cf/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 | 
			
		||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 | 
			
		||||
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 | 
			
		||||
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 | 
			
		||||
golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 | 
			
		||||
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 | 
			
		||||
golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
 | 
			
		||||
golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
 | 
			
		||||
golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
 | 
			
		||||
golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
 | 
			
		||||
golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
 | 
			
		||||
golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
 | 
			
		||||
golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
 | 
			
		||||
golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
 | 
			
		||||
golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
 | 
			
		||||
golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
 | 
			
		||||
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
			
		||||
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
			
		||||
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
			
		||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
			
		||||
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
			
		||||
golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
			
		||||
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
			
		||||
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
			
		||||
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
			
		||||
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ=
 | 
			
		||||
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
			
		||||
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
			
		||||
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
			
		||||
golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
			
		||||
golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
			
		||||
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
			
		||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
			
		||||
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
			
		||||
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20200509044756-6aff5f38e54f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20210423082822-04245dca01da h1:b3NXsE2LusjYGGjL5bxEVZZORm/YEFFrWFjR8eFrw/c=
 | 
			
		||||
golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf h1:2ucpDCmfkl8Bd/FsLtiD653Wf96cW37s+iGx93zsu4k=
 | 
			
		||||
golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
 | 
			
		||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 | 
			
		||||
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 | 
			
		||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 | 
			
		||||
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 | 
			
		||||
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
 | 
			
		||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 | 
			
		||||
golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 | 
			
		||||
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 | 
			
		||||
golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M=
 | 
			
		||||
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 | 
			
		||||
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2 h1:+DCIGbF/swA92ohVg0//6X2IVY3KZs6p9mix0ziNYJM=
 | 
			
		||||
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 | 
			
		||||
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 | 
			
		||||
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 | 
			
		||||
golang.org/x/time v0.0.0-20191024005414-555d28b269f0 h1:/5xXl8Y5W96D+TtHSlonuFqGHIWVuyCkGJLwGh9JJFs=
 | 
			
		||||
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 | 
			
		||||
golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 | 
			
		||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 | 
			
		||||
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
 | 
			
		||||
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 | 
			
		||||
golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 | 
			
		||||
golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 | 
			
		||||
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 | 
			
		||||
golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
 | 
			
		||||
golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
 | 
			
		||||
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
 | 
			
		||||
golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
 | 
			
		||||
golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
 | 
			
		||||
golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
 | 
			
		||||
golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
 | 
			
		||||
golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
			
		||||
golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
			
		||||
golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
			
		||||
golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
			
		||||
golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
			
		||||
golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
			
		||||
golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
			
		||||
golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
			
		||||
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
			
		||||
golang.org/x/tools v0.0.0-20210106214847-113979e3529a h1:CB3a9Nez8M13wwlr/E2YtwoU+qYHKfC+JrDa45RXXoQ=
 | 
			
		||||
golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
			
		||||
golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
			
		||||
golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
 | 
			
		||||
golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
 | 
			
		||||
golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
 | 
			
		||||
golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
 | 
			
		||||
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
 | 
			
		||||
golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
 | 
			
		||||
golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
 | 
			
		||||
golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
 | 
			
		||||
golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
 | 
			
		||||
golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
 | 
			
		||||
golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
 | 
			
		||||
golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
 | 
			
		||||
golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
 | 
			
		||||
golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 | 
			
		||||
golang.org/x/tools v0.0.0-20200509030707-2212a7e161a5/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 | 
			
		||||
golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 | 
			
		||||
golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 | 
			
		||||
golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 | 
			
		||||
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 | 
			
		||||
golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
 | 
			
		||||
golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
 | 
			
		||||
golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
 | 
			
		||||
golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE=
 | 
			
		||||
golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
 | 
			
		||||
golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
 | 
			
		||||
golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
 | 
			
		||||
golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
 | 
			
		||||
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
 | 
			
		||||
golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
 | 
			
		||||
golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
 | 
			
		||||
golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
 | 
			
		||||
golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
 | 
			
		||||
golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
 | 
			
		||||
golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
 | 
			
		||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 | 
			
		||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 | 
			
		||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 | 
			
		||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
 | 
			
		||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 | 
			
		||||
google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
 | 
			
		||||
google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
 | 
			
		||||
google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
 | 
			
		||||
google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
 | 
			
		||||
google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
 | 
			
		||||
google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
 | 
			
		||||
google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
 | 
			
		||||
google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
 | 
			
		||||
google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
 | 
			
		||||
google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
 | 
			
		||||
google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
 | 
			
		||||
google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
 | 
			
		||||
google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
 | 
			
		||||
google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
 | 
			
		||||
google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=
 | 
			
		||||
google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=
 | 
			
		||||
google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg=
 | 
			
		||||
google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE=
 | 
			
		||||
google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8=
 | 
			
		||||
google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU=
 | 
			
		||||
google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94=
 | 
			
		||||
google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo=
 | 
			
		||||
google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4=
 | 
			
		||||
google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw=
 | 
			
		||||
google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU=
 | 
			
		||||
google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k=
 | 
			
		||||
google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE=
 | 
			
		||||
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 | 
			
		||||
google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 | 
			
		||||
google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
 | 
			
		||||
google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
 | 
			
		||||
google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
 | 
			
		||||
google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55 h1:gSJIx1SDwno+2ElGhA4+qG2zF97qiUzTM+rQ0klBOcE=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71 h1:z+ErRPu0+KS02Td3fOAgdX+lnPDh/VyaABEJPD4JRQs=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
 | 
			
		||||
google.golang.org/grpc v1.29.1 h1:EC2SB8S04d2r73uptxphDSUG+kTKVgjRPF+N3xpxRB4=
 | 
			
		||||
google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
 | 
			
		||||
google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw=
 | 
			
		||||
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
 | 
			
		||||
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
 | 
			
		||||
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
 | 
			
		||||
google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
 | 
			
		||||
google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
 | 
			
		||||
google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
 | 
			
		||||
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
 | 
			
		||||
google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
 | 
			
		||||
google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
 | 
			
		||||
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
 | 
			
		||||
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
 | 
			
		||||
google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk=
 | 
			
		||||
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
 | 
			
		||||
google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ=
 | 
			
		||||
google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
 | 
			
		||||
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
 | 
			
		||||
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc h1:2gGKlE2+asNV9m7xrywl36YYNnBG5ZQ0r/BOOxqPpmk=
 | 
			
		||||
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod h1:m7x9LTH6d71AHyAX77c9yqWCCa3UKHcVEj9y7hAtKDk=
 | 
			
		||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
			
		||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
 | 
			
		||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
			
		||||
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
			
		||||
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU=
 | 
			
		||||
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
			
		||||
gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw=
 | 
			
		||||
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
 | 
			
		||||
gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df h1:n7WqCuqOuCbNr617RXOY0AWRXxgwEyPp2z+p0+hgMuE=
 | 
			
		||||
gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df/go.mod h1:LRQQ+SO6ZHR7tOkpBDuZnXENFzX8qRjMDMyPD6BRkCw=
 | 
			
		||||
gopkg.in/ini.v1 v1.56.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
 | 
			
		||||
gopkg.in/ini.v1 v1.57.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
 | 
			
		||||
gopkg.in/ini.v1 v1.63.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
 | 
			
		||||
gopkg.in/ini.v1 v1.66.2 h1:XfR1dOYubytKy4Shzc2LHrrGhU0lDCfDGG1yLPmpgsI=
 | 
			
		||||
gopkg.in/ini.v1 v1.66.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
 | 
			
		||||
gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 h1:VpOs+IwYnYBaFnrNAeB8UUWtL3vEUnzSCL1nVjPhqrw=
 | 
			
		||||
@ -377,14 +919,23 @@ gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
 | 
			
		||||
gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
 | 
			
		||||
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 | 
			
		||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 | 
			
		||||
gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
 | 
			
		||||
gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 | 
			
		||||
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 | 
			
		||||
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
 | 
			
		||||
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
 | 
			
		||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 | 
			
		||||
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo=
 | 
			
		||||
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 | 
			
		||||
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 | 
			
		||||
honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM=
 | 
			
		||||
honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 | 
			
		||||
honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 | 
			
		||||
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 | 
			
		||||
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
 | 
			
		||||
honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
 | 
			
		||||
honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
 | 
			
		||||
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
 | 
			
		||||
rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
 | 
			
		||||
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
 | 
			
		||||
sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o=
 | 
			
		||||
sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q=
 | 
			
		||||
sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										85
									
								
								internal/api/auth/auth.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										85
									
								
								internal/api/auth/auth.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,85 @@
 | 
			
		||||
package apiAuth
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	api "Open_IM/pkg/base_info"
 | 
			
		||||
	"Open_IM/pkg/common/config"
 | 
			
		||||
	"Open_IM/pkg/common/log"
 | 
			
		||||
	"Open_IM/pkg/grpc-etcdv3/getcdv3"
 | 
			
		||||
	rpc "Open_IM/pkg/proto/auth"
 | 
			
		||||
	open_im_sdk "Open_IM/pkg/proto/sdk_ws"
 | 
			
		||||
	"Open_IM/pkg/utils"
 | 
			
		||||
	"context"
 | 
			
		||||
	"github.com/gin-gonic/gin"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"strings"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func UserRegister(c *gin.Context) {
 | 
			
		||||
	params := api.UserRegisterReq{}
 | 
			
		||||
	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
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if params.Secret != config.Config.Secret {
 | 
			
		||||
		log.NewError(params.OperationID, "params.Secret != config.Config.Secret", params.Secret, config.Config.Secret)
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"errCode": 401, "errMsg": "not authorized"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	req := &rpc.UserRegisterReq{UserInfo: &open_im_sdk.UserInfo{}}
 | 
			
		||||
	utils.CopyStructFields(req.UserInfo, ¶ms)
 | 
			
		||||
	//copier.Copy(req.UserInfo, ¶ms)
 | 
			
		||||
	req.OperationID = params.OperationID
 | 
			
		||||
	log.NewInfo(req.OperationID, "UserRegister args ", req.String())
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImAuthName)
 | 
			
		||||
	client := rpc.NewAuthClient(etcdConn)
 | 
			
		||||
	reply, err := client.UserRegister(context.Background(), req)
 | 
			
		||||
	if err != nil || reply.CommonResp.ErrCode != 0 {
 | 
			
		||||
		log.NewError(req.OperationID, "UserRegister failed ", err, reply.CommonResp.ErrCode)
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": reply.CommonResp.ErrMsg})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	pbDataToken := &rpc.UserTokenReq{Platform: params.Platform, FromUserID: params.UserID, OperationID: params.OperationID}
 | 
			
		||||
	replyToken, err := client.UserToken(context.Background(), pbDataToken)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(req.OperationID, "UserToken failed ", err.Error(), pbDataToken)
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	resp := api.UserRegisterResp{CommResp: api.CommResp{ErrCode: replyToken.CommonResp.ErrCode, ErrMsg: replyToken.CommonResp.ErrMsg},
 | 
			
		||||
		UserToken: api.UserTokenInfo{UserID: req.UserInfo.UserID, Token: replyToken.Token, ExpiredTime: replyToken.ExpiredTime}}
 | 
			
		||||
	log.NewInfo(req.OperationID, "UserRegister return ", resp)
 | 
			
		||||
	c.JSON(http.StatusOK, resp)
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func UserToken(c *gin.Context) {
 | 
			
		||||
	params := api.UserTokenReq{}
 | 
			
		||||
	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
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if params.Secret != config.Config.Secret {
 | 
			
		||||
		log.NewError(params.OperationID, "params.Secret != config.Config.Secret", params.Secret, config.Config.Secret)
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"errCode": 401, "errMsg": "not authorized"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	req := &rpc.UserTokenReq{Platform: params.Platform, FromUserID: params.UserID, OperationID: params.OperationID}
 | 
			
		||||
	log.NewInfo(req.OperationID, "UserToken args ", req.String())
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImAuthName)
 | 
			
		||||
	client := rpc.NewAuthClient(etcdConn)
 | 
			
		||||
	reply, err := client.UserToken(context.Background(), req)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(req.OperationID, "UserToken failed ", err.Error(), req.String())
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	resp := api.UserTokenResp{CommResp: api.CommResp{ErrCode: reply.CommonResp.ErrCode, ErrMsg: reply.CommonResp.ErrMsg},
 | 
			
		||||
		UserToken: api.UserTokenInfo{UserID: req.FromUserID, Token: reply.Token, ExpiredTime: reply.ExpiredTime}}
 | 
			
		||||
	log.NewInfo(req.OperationID, "UserRegister return ", resp)
 | 
			
		||||
	c.JSON(http.StatusOK, resp)
 | 
			
		||||
}
 | 
			
		||||
@ -1,95 +0,0 @@
 | 
			
		||||
package apiAuth
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"Open_IM/pkg/common/config"
 | 
			
		||||
	"Open_IM/pkg/common/log"
 | 
			
		||||
	"Open_IM/pkg/grpc-etcdv3/getcdv3"
 | 
			
		||||
	pbAuth "Open_IM/pkg/proto/auth"
 | 
			
		||||
	"context"
 | 
			
		||||
	"github.com/gin-gonic/gin"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"strings"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type paramsUserRegister struct {
 | 
			
		||||
	Secret   string `json:"secret" binding:"required,max=32"`
 | 
			
		||||
	Platform int32  `json:"platform" binding:"required,min=1,max=7"`
 | 
			
		||||
	UID      string `json:"uid" binding:"required,min=1,max=64"`
 | 
			
		||||
	Name     string `json:"name" binding:"required,min=1,max=64"`
 | 
			
		||||
	Icon     string `json:"icon" binding:"omitempty,max=1024"`
 | 
			
		||||
	Gender   int32  `json:"gender" binding:"omitempty,oneof=0 1 2"`
 | 
			
		||||
	Mobile   string `json:"mobile" binding:"omitempty,max=32"`
 | 
			
		||||
	Birth    string `json:"birth" binding:"omitempty,max=16"`
 | 
			
		||||
	Email    string `json:"email" binding:"omitempty,max=64"`
 | 
			
		||||
	Ex       string `json:"ex" binding:"omitempty,max=1024"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func newUserRegisterReq(params *paramsUserRegister) *pbAuth.UserRegisterReq {
 | 
			
		||||
	pbData := pbAuth.UserRegisterReq{
 | 
			
		||||
		UID:    params.UID,
 | 
			
		||||
		Name:   params.Name,
 | 
			
		||||
		Icon:   params.Icon,
 | 
			
		||||
		Gender: params.Gender,
 | 
			
		||||
		Mobile: params.Mobile,
 | 
			
		||||
		Birth:  params.Birth,
 | 
			
		||||
		Email:  params.Email,
 | 
			
		||||
		Ex:     params.Ex,
 | 
			
		||||
	}
 | 
			
		||||
	return &pbData
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func UserRegister(c *gin.Context) {
 | 
			
		||||
	log.Info("", "", "api user_register init ....")
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImAuthName)
 | 
			
		||||
	client := pbAuth.NewAuthClient(etcdConn)
 | 
			
		||||
	//defer etcdConn.Close()
 | 
			
		||||
 | 
			
		||||
	params := paramsUserRegister{}
 | 
			
		||||
	if err := c.BindJSON(¶ms); err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	if params.Secret != config.Config.Secret {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"errCode": 401, "errMsg": "not authorized"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	pbData := newUserRegisterReq(¶ms)
 | 
			
		||||
 | 
			
		||||
	log.Info("", "", "api user_register is server, [data: %s]", pbData.String())
 | 
			
		||||
	reply, err := client.UserRegister(context.Background(), pbData)
 | 
			
		||||
	if err != nil || !reply.Success {
 | 
			
		||||
		log.Error("", "", "api user_register call rpc fail, [data: %s] [err: %s]", pbData.String(), err.Error())
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	log.Info("", "", "api user_register call rpc success, [data: %s] [reply: %s]", pbData.String(), reply.String())
 | 
			
		||||
 | 
			
		||||
	pbDataToken := &pbAuth.UserTokenReq{
 | 
			
		||||
		Platform: params.Platform,
 | 
			
		||||
		UID:      params.UID,
 | 
			
		||||
	}
 | 
			
		||||
	replyToken, err := client.UserToken(context.Background(), pbDataToken)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Error("", "", "api user_register call rpc fail, [data: %s] [err: %s]", pbData.String(), err.Error())
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	log.Info("", "", "api user_register call success, [data: %s] [reply: %s]", pbData.String(), reply.String())
 | 
			
		||||
 | 
			
		||||
	if replyToken.ErrCode == 0 {
 | 
			
		||||
		c.JSON(http.StatusOK, gin.H{
 | 
			
		||||
			"errCode": replyToken.ErrCode,
 | 
			
		||||
			"errMsg":  replyToken.ErrMsg,
 | 
			
		||||
			"data": gin.H{
 | 
			
		||||
				"uid":         pbData.UID,
 | 
			
		||||
				"token":       replyToken.Token,
 | 
			
		||||
				"expiredTime": replyToken.ExpiredTime,
 | 
			
		||||
			},
 | 
			
		||||
		})
 | 
			
		||||
	} else {
 | 
			
		||||
		c.JSON(http.StatusOK, gin.H{
 | 
			
		||||
			"errCode": replyToken.ErrCode,
 | 
			
		||||
			"errMsg":  replyToken.ErrMsg,
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
@ -1,72 +0,0 @@
 | 
			
		||||
package apiAuth
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"Open_IM/pkg/common/config"
 | 
			
		||||
	"Open_IM/pkg/common/log"
 | 
			
		||||
	"Open_IM/pkg/grpc-etcdv3/getcdv3"
 | 
			
		||||
	pbAuth "Open_IM/pkg/proto/auth"
 | 
			
		||||
	"context"
 | 
			
		||||
	"github.com/gin-gonic/gin"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"strings"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type paramsUserToken struct {
 | 
			
		||||
	Secret   string `json:"secret" binding:"required,max=32"`
 | 
			
		||||
	Platform int32  `json:"platform" binding:"required,min=1,max=8"`
 | 
			
		||||
	UID      string `json:"uid" binding:"required,min=1,max=64"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func newUserTokenReq(params *paramsUserToken) *pbAuth.UserTokenReq {
 | 
			
		||||
	pbData := pbAuth.UserTokenReq{
 | 
			
		||||
		Platform: params.Platform,
 | 
			
		||||
		UID:      params.UID,
 | 
			
		||||
	}
 | 
			
		||||
	return &pbData
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func UserToken(c *gin.Context) {
 | 
			
		||||
	log.Info("", "", "api user_token init ....")
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImAuthName)
 | 
			
		||||
	client := pbAuth.NewAuthClient(etcdConn)
 | 
			
		||||
	//defer etcdConn.Close()
 | 
			
		||||
 | 
			
		||||
	params := paramsUserToken{}
 | 
			
		||||
	if err := c.BindJSON(¶ms); err != nil {
 | 
			
		||||
		log.Error("", "", params.UID, params.Platform, params.Secret)
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	if params.Secret != config.Config.Secret {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"errCode": 401, "errMsg": "not authorized"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	pbData := newUserTokenReq(¶ms)
 | 
			
		||||
 | 
			
		||||
	log.Info("", "", "api user_token is server, [data: %s]", pbData.String())
 | 
			
		||||
	reply, err := client.UserToken(context.Background(), pbData)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Error("", "", "api user_token call rpc fail, [data: %s] [err: %s]", pbData.String(), err.Error())
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	log.Info("", "", "api user_token call rpc success, [data: %s] [reply: %s]", pbData.String(), reply.String())
 | 
			
		||||
 | 
			
		||||
	if reply.ErrCode == 0 {
 | 
			
		||||
		c.JSON(http.StatusOK, gin.H{
 | 
			
		||||
			"errCode": reply.ErrCode,
 | 
			
		||||
			"errMsg":  reply.ErrMsg,
 | 
			
		||||
			"data": gin.H{
 | 
			
		||||
				"uid":         pbData.UID,
 | 
			
		||||
				"token":       reply.Token,
 | 
			
		||||
				"expiredTime": reply.ExpiredTime,
 | 
			
		||||
			},
 | 
			
		||||
		})
 | 
			
		||||
	} else {
 | 
			
		||||
		c.JSON(http.StatusOK, gin.H{
 | 
			
		||||
			"errCode": reply.ErrCode,
 | 
			
		||||
			"errMsg":  reply.ErrMsg,
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@ -3,9 +3,9 @@ package apiChat
 | 
			
		||||
import (
 | 
			
		||||
	"Open_IM/pkg/common/config"
 | 
			
		||||
	"Open_IM/pkg/common/log"
 | 
			
		||||
	"Open_IM/pkg/common/token_verify"
 | 
			
		||||
	"Open_IM/pkg/grpc-etcdv3/getcdv3"
 | 
			
		||||
	pbMsg "Open_IM/pkg/proto/chat"
 | 
			
		||||
	"Open_IM/pkg/utils"
 | 
			
		||||
	"context"
 | 
			
		||||
	"github.com/gin-gonic/gin"
 | 
			
		||||
	"net/http"
 | 
			
		||||
@ -19,7 +19,7 @@ type paramsUserNewestSeq struct {
 | 
			
		||||
	MsgIncr       int    `json:"msgIncr" binding:"required"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func UserGetSeq(c *gin.Context) {
 | 
			
		||||
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()})
 | 
			
		||||
@ -27,8 +27,8 @@ func UserGetSeq(c *gin.Context) {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	token := c.Request.Header.Get("token")
 | 
			
		||||
	if !utils.VerifyToken(token, params.SendID) {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": "token validate err"})
 | 
			
		||||
	if ok, err := token_verify.VerifyToken(token, params.SendID); !ok {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": "token validate err" + err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	pbData := pbMsg.GetMaxAndMinSeqReq{}
 | 
			
		||||
@ -42,7 +42,8 @@ func UserGetSeq(c *gin.Context) {
 | 
			
		||||
	msgClient := pbMsg.NewChatClient(grpcConn)
 | 
			
		||||
	reply, err := msgClient.GetMaxAndMinSeq(context.Background(), &pbData)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.ErrorByKv("rpc call failed to getNewSeq", pbData.OperationID, "err", err, "pbData", pbData.String())
 | 
			
		||||
		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
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -3,9 +3,10 @@ package apiChat
 | 
			
		||||
import (
 | 
			
		||||
	"Open_IM/pkg/common/config"
 | 
			
		||||
	"Open_IM/pkg/common/log"
 | 
			
		||||
	"Open_IM/pkg/common/token_verify"
 | 
			
		||||
	"Open_IM/pkg/grpc-etcdv3/getcdv3"
 | 
			
		||||
	"Open_IM/pkg/proto/chat"
 | 
			
		||||
	"Open_IM/pkg/utils"
 | 
			
		||||
	open_im_sdk "Open_IM/pkg/proto/sdk_ws"
 | 
			
		||||
	"context"
 | 
			
		||||
	"github.com/gin-gonic/gin"
 | 
			
		||||
	"net/http"
 | 
			
		||||
@ -22,63 +23,14 @@ type paramsUserPullMsg struct {
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func UserPullMsg(c *gin.Context) {
 | 
			
		||||
	params := paramsUserPullMsg{}
 | 
			
		||||
	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 !utils.VerifyToken(token, params.SendID) {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": "token validate err"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	pbData := pbChat.PullMessageReq{}
 | 
			
		||||
	pbData.UserID = params.SendID
 | 
			
		||||
	pbData.OperationID = params.OperationID
 | 
			
		||||
	pbData.SeqBegin = *params.Data.SeqBegin
 | 
			
		||||
	pbData.SeqEnd = *params.Data.SeqEnd
 | 
			
		||||
	grpcConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImOfflineMessageName)
 | 
			
		||||
	msgClient := pbChat.NewChatClient(grpcConn)
 | 
			
		||||
	reply, err := msgClient.PullMessage(context.Background(), &pbData)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.ErrorByKv("PullMessage error", pbData.OperationID, "err", err.Error())
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	log.InfoByKv("rpc call success to pullMsgRep", pbData.OperationID, "ReplyArgs", reply.String(), "maxSeq", reply.GetMaxSeq(),
 | 
			
		||||
		"MinSeq", reply.GetMinSeq(), "singLen", len(reply.GetSingleUserMsg()), "groupLen", len(reply.GetGroupUserMsg()))
 | 
			
		||||
 | 
			
		||||
	msg := make(map[string]interface{})
 | 
			
		||||
	if v := reply.GetSingleUserMsg(); v != nil {
 | 
			
		||||
		msg["single"] = v
 | 
			
		||||
	} else {
 | 
			
		||||
		msg["single"] = []pbChat.GatherFormat{}
 | 
			
		||||
	}
 | 
			
		||||
	if v := reply.GetGroupUserMsg(); v != nil {
 | 
			
		||||
		msg["group"] = v
 | 
			
		||||
	} else {
 | 
			
		||||
		msg["group"] = []pbChat.GatherFormat{}
 | 
			
		||||
	}
 | 
			
		||||
	msg["maxSeq"] = reply.GetMaxSeq()
 | 
			
		||||
	msg["minSeq"] = reply.GetMinSeq()
 | 
			
		||||
	c.JSON(http.StatusOK, gin.H{
 | 
			
		||||
		"errCode":       reply.ErrCode,
 | 
			
		||||
		"errMsg":        reply.ErrMsg,
 | 
			
		||||
		"reqIdentifier": *params.ReqIdentifier,
 | 
			
		||||
		"data":          msg,
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type paramsUserPullMsgBySeqList struct {
 | 
			
		||||
	ReqIdentifier int     `json:"reqIdentifier" binding:"required"`
 | 
			
		||||
	SendID        string  `json:"sendID" binding:"required"`
 | 
			
		||||
	OperationID   string  `json:"operationID" binding:"required"`
 | 
			
		||||
	SeqList       []int64 `json:"seqList"`
 | 
			
		||||
	ReqIdentifier int      `json:"reqIdentifier" binding:"required"`
 | 
			
		||||
	SendID        string   `json:"sendID" binding:"required"`
 | 
			
		||||
	OperationID   string   `json:"operationID" binding:"required"`
 | 
			
		||||
	SeqList       []uint32 `json:"seqList"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func UserPullMsgBySeqList(c *gin.Context) {
 | 
			
		||||
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()})
 | 
			
		||||
@ -86,11 +38,11 @@ func UserPullMsgBySeqList(c *gin.Context) {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	token := c.Request.Header.Get("token")
 | 
			
		||||
	if !utils.VerifyToken(token, params.SendID) {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": "token validate err"})
 | 
			
		||||
	if ok, err := token_verify.VerifyToken(token, params.SendID); !ok {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": "token validate err" + err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	pbData := pbChat.PullMessageBySeqListReq{}
 | 
			
		||||
	pbData := open_im_sdk.PullMessageBySeqListReq{}
 | 
			
		||||
	pbData.UserID = params.SendID
 | 
			
		||||
	pbData.OperationID = params.OperationID
 | 
			
		||||
	pbData.SeqList = params.SeqList
 | 
			
		||||
@ -102,26 +54,11 @@ func UserPullMsgBySeqList(c *gin.Context) {
 | 
			
		||||
		log.ErrorByKv("PullMessageBySeqList error", pbData.OperationID, "err", err.Error())
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	log.InfoByKv("rpc call success to PullMessageBySeqList", pbData.OperationID, "ReplyArgs", reply.String(), "maxSeq", reply.GetMaxSeq(),
 | 
			
		||||
		"MinSeq", reply.GetMinSeq(), "singLen", len(reply.GetSingleUserMsg()), "groupLen", len(reply.GetGroupUserMsg()))
 | 
			
		||||
 | 
			
		||||
	msg := make(map[string]interface{})
 | 
			
		||||
	if v := reply.GetSingleUserMsg(); v != nil {
 | 
			
		||||
		msg["single"] = v
 | 
			
		||||
	} else {
 | 
			
		||||
		msg["single"] = []pbChat.GatherFormat{}
 | 
			
		||||
	}
 | 
			
		||||
	if v := reply.GetGroupUserMsg(); v != nil {
 | 
			
		||||
		msg["group"] = v
 | 
			
		||||
	} else {
 | 
			
		||||
		msg["group"] = []pbChat.GatherFormat{}
 | 
			
		||||
	}
 | 
			
		||||
	msg["maxSeq"] = reply.GetMaxSeq()
 | 
			
		||||
	msg["minSeq"] = reply.GetMinSeq()
 | 
			
		||||
	log.InfoByKv("rpc call success to PullMessageBySeqList", pbData.OperationID, "ReplyArgs", reply.String(), len(reply.List))
 | 
			
		||||
	c.JSON(http.StatusOK, gin.H{
 | 
			
		||||
		"errCode":       reply.ErrCode,
 | 
			
		||||
		"errMsg":        reply.ErrMsg,
 | 
			
		||||
		"reqIdentifier": params.ReqIdentifier,
 | 
			
		||||
		"data":          msg,
 | 
			
		||||
		"data":          reply.List,
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -4,7 +4,7 @@ import (
 | 
			
		||||
	"Open_IM/pkg/common/config"
 | 
			
		||||
	"Open_IM/pkg/common/log"
 | 
			
		||||
	pbChat "Open_IM/pkg/proto/chat"
 | 
			
		||||
	"Open_IM/pkg/utils"
 | 
			
		||||
	open_im_sdk "Open_IM/pkg/proto/sdk_ws"
 | 
			
		||||
	"context"
 | 
			
		||||
 | 
			
		||||
	"Open_IM/pkg/grpc-etcdv3/getcdv3"
 | 
			
		||||
@ -14,50 +14,51 @@ import (
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type paramsUserSendMsg struct {
 | 
			
		||||
	ReqIdentifier  int32  `json:"reqIdentifier" binding:"required"`
 | 
			
		||||
	PlatformID     int32  `json:"platformID" 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" binding:"required"`
 | 
			
		||||
		ForceList   []string               `json:"forceList"`
 | 
			
		||||
		Content     string                 `json:"content" binding:"required"`
 | 
			
		||||
		Options     map[string]interface{} `json:"options" `
 | 
			
		||||
		ClientMsgID string                 `json:"clientMsgID" binding:"required"`
 | 
			
		||||
		OffLineInfo map[string]interface{} `json:"offlineInfo" `
 | 
			
		||||
		Ex          map[string]interface{} `json:"ext"`
 | 
			
		||||
	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 *open_im_sdk.OfflinePushInfo `json:"offlineInfo" `
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func newUserSendMsgReq(token string, params *paramsUserSendMsg) *pbChat.UserSendMsgReq {
 | 
			
		||||
	pbData := pbChat.UserSendMsgReq{
 | 
			
		||||
		ReqIdentifier:  params.ReqIdentifier,
 | 
			
		||||
		Token:          token,
 | 
			
		||||
		SendID:         params.SendID,
 | 
			
		||||
		SenderNickName: params.SenderNickName,
 | 
			
		||||
		SenderFaceURL:  params.SenderFaceURL,
 | 
			
		||||
		OperationID:    params.OperationID,
 | 
			
		||||
		PlatformID:     params.PlatformID,
 | 
			
		||||
		SessionType:    params.Data.SessionType,
 | 
			
		||||
		MsgFrom:        params.Data.MsgFrom,
 | 
			
		||||
		ContentType:    params.Data.ContentType,
 | 
			
		||||
		RecvID:         params.Data.RecvID,
 | 
			
		||||
		ForceList:      params.Data.ForceList,
 | 
			
		||||
		Content:        params.Data.Content,
 | 
			
		||||
		Options:        utils.MapToJsonString(params.Data.Options),
 | 
			
		||||
		ClientMsgID:    params.Data.ClientMsgID,
 | 
			
		||||
		OffLineInfo:    utils.MapToJsonString(params.Data.OffLineInfo),
 | 
			
		||||
		Ex:             utils.MapToJsonString(params.Data.Ex),
 | 
			
		||||
func newUserSendMsgReq(token string, params *paramsUserSendMsg) *pbChat.SendMsgReq {
 | 
			
		||||
	pbData := pbChat.SendMsgReq{
 | 
			
		||||
		Token:       token,
 | 
			
		||||
		OperationID: params.OperationID,
 | 
			
		||||
		MsgData: &open_im_sdk.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 UserSendMsg(c *gin.Context) {
 | 
			
		||||
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()})
 | 
			
		||||
@ -70,20 +71,24 @@ func UserSendMsg(c *gin.Context) {
 | 
			
		||||
	log.InfoByKv("api call success to sendMsgReq", params.OperationID, "Parameters", params)
 | 
			
		||||
 | 
			
		||||
	pbData := newUserSendMsgReq(token, ¶ms)
 | 
			
		||||
	log.Info("", "", "api UserSendMsg call start..., [data: %s]", pbData.String())
 | 
			
		||||
	log.Info("", "", "api SendMsg call start..., [data: %s]", pbData.String())
 | 
			
		||||
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImOfflineMessageName)
 | 
			
		||||
	client := pbChat.NewChatClient(etcdConn)
 | 
			
		||||
 | 
			
		||||
	log.Info("", "", "api UserSendMsg call, api call rpc...")
 | 
			
		||||
	log.Info("", "", "api SendMsg call, api call rpc...")
 | 
			
		||||
 | 
			
		||||
	reply, _ := client.UserSendMsg(context.Background(), pbData)
 | 
			
		||||
	log.Info("", "", "api UserSendMsg call end..., [data: %s] [reply: %s]", pbData.String(), reply.String())
 | 
			
		||||
	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("", "", "api SendMsg call end..., [data: %s] [reply: %s]", pbData.String(), reply.String())
 | 
			
		||||
 | 
			
		||||
	c.JSON(http.StatusOK, gin.H{
 | 
			
		||||
		"errCode":       reply.ErrCode,
 | 
			
		||||
		"errMsg":        reply.ErrMsg,
 | 
			
		||||
		"reqIdentifier": reply.ReqIdentifier,
 | 
			
		||||
		"errCode": reply.ErrCode,
 | 
			
		||||
		"errMsg":  reply.ErrMsg,
 | 
			
		||||
		"data": gin.H{
 | 
			
		||||
			"clientMsgID": reply.ClientMsgID,
 | 
			
		||||
			"serverMsgID": reply.ServerMsgID,
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										125
									
								
								internal/api/conversation/conversation.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										125
									
								
								internal/api/conversation/conversation.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,125 @@
 | 
			
		||||
package conversation
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	api "Open_IM/pkg/base_info"
 | 
			
		||||
	"Open_IM/pkg/common/config"
 | 
			
		||||
	"Open_IM/pkg/common/log"
 | 
			
		||||
	"Open_IM/pkg/common/token_verify"
 | 
			
		||||
	"Open_IM/pkg/grpc-etcdv3/getcdv3"
 | 
			
		||||
	"Open_IM/pkg/proto/user"
 | 
			
		||||
	rpc "Open_IM/pkg/proto/user"
 | 
			
		||||
	"Open_IM/pkg/utils"
 | 
			
		||||
	"context"
 | 
			
		||||
	"github.com/gin-gonic/gin"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"strings"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func GetAllConversationMessageOpt(c *gin.Context) {
 | 
			
		||||
	params := api.GetAllConversationMessageOptReq{}
 | 
			
		||||
	if err := c.BindJSON(¶ms); err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": "bind json failed " + err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	req := &rpc.GetAllConversationMsgOptReq{}
 | 
			
		||||
	utils.CopyStructFields(req, ¶ms)
 | 
			
		||||
	var ok bool
 | 
			
		||||
	ok, req.OpUserID = token_verify.GetUserIDFromToken(c.Request.Header.Get("token"))
 | 
			
		||||
	if !ok {
 | 
			
		||||
		log.NewError(req.OperationID, "GetUserIDFromToken false ", c.Request.Header.Get("token"))
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "GetUserIDFromToken failed or not set token in header"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	log.NewInfo(params.OperationID, "GetAllConversationMessageOpt args ", req.String())
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImUserName)
 | 
			
		||||
	client := user.NewUserClient(etcdConn)
 | 
			
		||||
	RpcResp, err := client.GetAllConversationMsgOpt(context.Background(), req)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(params.OperationID, "GetAllConversationMsgOpt rpc failed, ", req, err.Error())
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"errCode": 500, "errMsg": "GetAllConversationMsgOpt rpc failed, " + err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	optResult := make([]*api.OptResult, 0)
 | 
			
		||||
	for _, v := range RpcResp.ConversationOptResultList {
 | 
			
		||||
		temp := new(api.OptResult)
 | 
			
		||||
		temp.ConversationID = v.ConversationID
 | 
			
		||||
		temp.Result = &v.Result
 | 
			
		||||
		optResult = append(optResult, temp)
 | 
			
		||||
	}
 | 
			
		||||
	resp := api.GetAllConversationMessageOptResp{CommResp: api.CommResp{ErrCode: RpcResp.CommonResp.ErrCode, ErrMsg: RpcResp.CommonResp.ErrMsg}, ConversationOptResultList: optResult}
 | 
			
		||||
	log.NewInfo(req.OperationID, "GetAllConversationMsgOpt api return: ", resp)
 | 
			
		||||
	c.JSON(http.StatusOK, resp)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func GetReceiveMessageOpt(c *gin.Context) {
 | 
			
		||||
	params := api.GetReceiveMessageOptReq{}
 | 
			
		||||
	if err := c.BindJSON(¶ms); err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": "bind json failed " + err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	req := &rpc.GetReceiveMessageOptReq{}
 | 
			
		||||
	utils.CopyStructFields(req, ¶ms)
 | 
			
		||||
	var ok bool
 | 
			
		||||
	ok, req.OpUserID = token_verify.GetUserIDFromToken(c.Request.Header.Get("token"))
 | 
			
		||||
	if !ok {
 | 
			
		||||
		log.NewError(req.OperationID, "GetUserIDFromToken false ", c.Request.Header.Get("token"))
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "GetUserIDFromToken failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	log.NewInfo(params.OperationID, "GetReceiveMessageOpt args ", req.String())
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImUserName)
 | 
			
		||||
	client := user.NewUserClient(etcdConn)
 | 
			
		||||
	RpcResp, err := client.GetReceiveMessageOpt(context.Background(), req)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(params.OperationID, "GetReceiveMessageOpt rpc failed, ", req, err.Error())
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"errCode": 500, "errMsg": "GetReceiveMessageOpt rpc failed, " + err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	optResult := make([]*api.OptResult, 0)
 | 
			
		||||
	for _, v := range RpcResp.ConversationOptResultList {
 | 
			
		||||
		temp := new(api.OptResult)
 | 
			
		||||
		temp.ConversationID = v.ConversationID
 | 
			
		||||
		temp.Result = &v.Result
 | 
			
		||||
		optResult = append(optResult, temp)
 | 
			
		||||
	}
 | 
			
		||||
	resp := api.GetReceiveMessageOptResp{CommResp: api.CommResp{ErrCode: RpcResp.CommonResp.ErrCode, ErrMsg: RpcResp.CommonResp.ErrMsg}, ConversationOptResultList: optResult}
 | 
			
		||||
	log.NewInfo(req.OperationID, "GetReceiveMessageOpt api return: ", resp)
 | 
			
		||||
	c.JSON(http.StatusOK, resp)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SetReceiveMessageOpt(c *gin.Context) {
 | 
			
		||||
	params := api.SetReceiveMessageOptReq{}
 | 
			
		||||
	if err := c.BindJSON(¶ms); err != nil {
 | 
			
		||||
		log.NewError(params.OperationID, utils.GetSelfFuncName(), "bind json failed", err.Error())
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": "bind json failed " + err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	req := &rpc.SetReceiveMessageOptReq{}
 | 
			
		||||
	utils.CopyStructFields(req, ¶ms)
 | 
			
		||||
	var ok bool
 | 
			
		||||
	ok, req.OpUserID = token_verify.GetUserIDFromToken(c.Request.Header.Get("token"))
 | 
			
		||||
	if !ok {
 | 
			
		||||
		log.NewError(req.OperationID, "GetUserIDFromToken false ", c.Request.Header.Get("token"))
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "GetUserIDFromToken failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	log.NewInfo(params.OperationID, "SetReceiveMessageOpt args ", req.String())
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImUserName)
 | 
			
		||||
	client := user.NewUserClient(etcdConn)
 | 
			
		||||
	RpcResp, err := client.SetReceiveMessageOpt(context.Background(), req)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(params.OperationID, "SetReceiveMessageOpt rpc failed, ", req, err.Error())
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"errCode": 500, "errMsg": "SetReceiveMessageOpt rpc failed, " + err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	optResult := make([]*api.OptResult, 0)
 | 
			
		||||
	for _, v := range RpcResp.ConversationOptResultList {
 | 
			
		||||
		temp := new(api.OptResult)
 | 
			
		||||
		temp.ConversationID = v.ConversationID
 | 
			
		||||
		temp.Result = &v.Result
 | 
			
		||||
		optResult = append(optResult, temp)
 | 
			
		||||
	}
 | 
			
		||||
	resp := api.SetReceiveMessageOptResp{CommResp: api.CommResp{ErrCode: RpcResp.CommonResp.ErrCode, ErrMsg: RpcResp.CommonResp.ErrMsg}, ConversationOptResultList: optResult}
 | 
			
		||||
	log.NewInfo(req.OperationID, "SetReceiveMessageOpt api return: ", resp)
 | 
			
		||||
	c.JSON(http.StatusOK, resp)
 | 
			
		||||
}
 | 
			
		||||
@ -1,49 +0,0 @@
 | 
			
		||||
package friend
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	pbFriend "Open_IM/pkg/proto/friend"
 | 
			
		||||
	"Open_IM/pkg/common/config"
 | 
			
		||||
	"Open_IM/pkg/common/log"
 | 
			
		||||
	"Open_IM/pkg/grpc-etcdv3/getcdv3"
 | 
			
		||||
	"context"
 | 
			
		||||
	"github.com/gin-gonic/gin"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"strings"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
type paramsAddBlackList struct {
 | 
			
		||||
	OperationID string `json:"operationID" binding:"required"`
 | 
			
		||||
	UID         string `json:"uid" binding:"required"`
 | 
			
		||||
}*/
 | 
			
		||||
 | 
			
		||||
func AddBlacklist(c *gin.Context) {
 | 
			
		||||
	log.Info("", "", "api add blacklist init ....")
 | 
			
		||||
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImFriendName)
 | 
			
		||||
	client := pbFriend.NewFriendClient(etcdConn)
 | 
			
		||||
	//defer etcdConn.Close()
 | 
			
		||||
 | 
			
		||||
	params := paramsSearchFriend{}
 | 
			
		||||
	if err := c.BindJSON(¶ms); err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	req := &pbFriend.AddBlacklistReq{
 | 
			
		||||
		Uid:         params.UID,
 | 
			
		||||
		OperationID: params.OperationID,
 | 
			
		||||
		Token:       c.Request.Header.Get("token"),
 | 
			
		||||
		OwnerUid:    params.OwnerUid,
 | 
			
		||||
	}
 | 
			
		||||
	log.Info(req.Token, req.OperationID, "api add blacklist is server:userID=%s", req.Uid)
 | 
			
		||||
	RpcResp, err := client.AddBlacklist(context.Background(), req)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Error(req.Token, req.OperationID, "err=%s,call add blacklist rpc server failed", err)
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "call add blacklist rpc server failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	log.InfoByArgs("call add blacklist rpc server success,args=%s", RpcResp.String())
 | 
			
		||||
	resp := gin.H{"errCode": RpcResp.ErrorCode, "errMsg": RpcResp.ErrorMsg}
 | 
			
		||||
	c.JSON(http.StatusOK, resp)
 | 
			
		||||
	log.InfoByArgs("api add blacklist success return,get args=%s,return args=%s", req.String(), RpcResp.String())
 | 
			
		||||
}
 | 
			
		||||
@ -1,84 +0,0 @@
 | 
			
		||||
package friend
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"Open_IM/pkg/common/config"
 | 
			
		||||
	"Open_IM/pkg/common/log"
 | 
			
		||||
	"Open_IM/pkg/grpc-etcdv3/getcdv3"
 | 
			
		||||
	pbFriend "Open_IM/pkg/proto/friend"
 | 
			
		||||
	"context"
 | 
			
		||||
	"github.com/gin-gonic/gin"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"strings"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type paramsImportFriendReq struct {
 | 
			
		||||
	OperationID string   `json:"operationID" binding:"required"`
 | 
			
		||||
	UIDList     []string `json:"uidList" binding:"required"`
 | 
			
		||||
	OwnerUid    string   `json:"ownerUid" binding:"required"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type paramsAddFriend struct {
 | 
			
		||||
	OperationID string `json:"operationID" binding:"required"`
 | 
			
		||||
	UID         string `json:"uid" binding:"required"`
 | 
			
		||||
	ReqMessage  string `json:"reqMessage"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
func ImportFriend(c *gin.Context) {
 | 
			
		||||
	log.Info("", "", "ImportFriend init ....")
 | 
			
		||||
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImFriendName)
 | 
			
		||||
	client := pbFriend.NewFriendClient(etcdConn)
 | 
			
		||||
 | 
			
		||||
	params := paramsImportFriendReq{}
 | 
			
		||||
	if err := c.BindJSON(¶ms); err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	req := &pbFriend.ImportFriendReq{
 | 
			
		||||
		UidList:     params.UIDList,
 | 
			
		||||
		OperationID: params.OperationID,
 | 
			
		||||
		OwnerUid:    params.OwnerUid,
 | 
			
		||||
		Token:       c.Request.Header.Get("token"),
 | 
			
		||||
	}
 | 
			
		||||
	RpcResp, err := client.ImportFriend(context.Background(), req)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Error(req.Token, req.OperationID, "err=%s,ImportFriend failed", err)
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "cImportFriend failed" + err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	log.InfoByArgs("ImportFriend  success,args=%s", RpcResp.String())
 | 
			
		||||
	resp := gin.H{"errCode": RpcResp.CommonResp.ErrorCode, "errMsg": RpcResp.CommonResp.ErrorMsg, "failedUidList": RpcResp.FailedUidList}
 | 
			
		||||
	c.JSON(http.StatusOK, resp)
 | 
			
		||||
	log.InfoByArgs("ImportFriend success return,get args=%s,return args=%s", req.String(), RpcResp.String())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func AddFriend(c *gin.Context) {
 | 
			
		||||
	log.Info("", "", "api add friend init ....")
 | 
			
		||||
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImFriendName)
 | 
			
		||||
	client := pbFriend.NewFriendClient(etcdConn)
 | 
			
		||||
 | 
			
		||||
	params := paramsAddFriend{}
 | 
			
		||||
	if err := c.BindJSON(¶ms); err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	req := &pbFriend.AddFriendReq{
 | 
			
		||||
		Uid:         params.UID,
 | 
			
		||||
		OperationID: params.OperationID,
 | 
			
		||||
		ReqMessage:  params.ReqMessage,
 | 
			
		||||
		Token:       c.Request.Header.Get("token"),
 | 
			
		||||
	}
 | 
			
		||||
	log.Info(req.Token, req.OperationID, "api add friend is server")
 | 
			
		||||
	RpcResp, err := client.AddFriend(context.Background(), req)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Error(req.Token, req.OperationID, "err=%s,call add friend rpc server failed", err)
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "call add friend rpc server failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	log.InfoByArgs("call add friend rpc server success,args=%s", RpcResp.String())
 | 
			
		||||
	resp := gin.H{"errCode": RpcResp.ErrorCode, "errMsg": RpcResp.ErrorMsg}
 | 
			
		||||
	c.JSON(http.StatusOK, resp)
 | 
			
		||||
	log.InfoByArgs("api add friend success return,get args=%s,return args=%s", req.String(), RpcResp.String())
 | 
			
		||||
}
 | 
			
		||||
@ -1,49 +0,0 @@
 | 
			
		||||
package friend
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	pbFriend "Open_IM/pkg/proto/friend"
 | 
			
		||||
	"Open_IM/pkg/common/config"
 | 
			
		||||
	"Open_IM/pkg/common/log"
 | 
			
		||||
	"Open_IM/pkg/grpc-etcdv3/getcdv3"
 | 
			
		||||
	"context"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"github.com/gin-gonic/gin"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"strings"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type paramsAddFriendResponse struct {
 | 
			
		||||
	OperationID string `json:"operationID" binding:"required"`
 | 
			
		||||
	UID         string `json:"uid" binding:"required"`
 | 
			
		||||
	Flag        int32  `json:"flag" binding:"required"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func AddFriendResponse(c *gin.Context) {
 | 
			
		||||
	log.Info("", "", fmt.Sprintf("api add friend response init ...."))
 | 
			
		||||
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImFriendName)
 | 
			
		||||
	client := pbFriend.NewFriendClient(etcdConn)
 | 
			
		||||
	//defer etcdConn.Close()
 | 
			
		||||
 | 
			
		||||
	params := paramsAddFriendResponse{}
 | 
			
		||||
	if err := c.BindJSON(¶ms); err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	req := &pbFriend.AddFriendResponseReq{
 | 
			
		||||
		Uid:         params.UID,
 | 
			
		||||
		Flag:        params.Flag,
 | 
			
		||||
		OperationID: params.OperationID,
 | 
			
		||||
		Token:       c.Request.Header.Get("token"),
 | 
			
		||||
	}
 | 
			
		||||
	log.Info(req.Token, req.OperationID, "api add friend response is server:userID=%s", req.Uid)
 | 
			
		||||
	RpcResp, err := client.AddFriendResponse(context.Background(), req)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Error(req.Token, req.OperationID, "err=%s,call add_friend_response rpc server failed", err)
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "call add_friend_response rpc server failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	log.InfoByArgs("call add friend response rpc server success,args=%s", RpcResp.String())
 | 
			
		||||
	c.JSON(http.StatusOK, gin.H{"errCode": RpcResp.ErrorCode, "errMsg": RpcResp.ErrorMsg})
 | 
			
		||||
	log.InfoByArgs("api add friend response success return,get args=%s,return args=%s", req.String(), RpcResp.String())
 | 
			
		||||
}
 | 
			
		||||
@ -1,48 +0,0 @@
 | 
			
		||||
package friend
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	pbFriend "Open_IM/pkg/proto/friend"
 | 
			
		||||
	"Open_IM/pkg/common/config"
 | 
			
		||||
	"Open_IM/pkg/common/log"
 | 
			
		||||
	"Open_IM/pkg/grpc-etcdv3/getcdv3"
 | 
			
		||||
	"context"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"github.com/gin-gonic/gin"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"strings"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type paramsDeleteFriend struct {
 | 
			
		||||
	OperationID string `json:"operationID" binding:"required"`
 | 
			
		||||
	UID         string `json:"uid" binding:"required"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func DeleteFriend(c *gin.Context) {
 | 
			
		||||
	log.Info("", "", fmt.Sprintf("api delete_friend init ...."))
 | 
			
		||||
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImFriendName)
 | 
			
		||||
	client := pbFriend.NewFriendClient(etcdConn)
 | 
			
		||||
	//defer etcdConn.Close()
 | 
			
		||||
 | 
			
		||||
	params := paramsDeleteFriend{}
 | 
			
		||||
	if err := c.BindJSON(¶ms); err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	req := &pbFriend.DeleteFriendReq{
 | 
			
		||||
		Uid:         params.UID,
 | 
			
		||||
		OperationID: params.OperationID,
 | 
			
		||||
		Token:       c.Request.Header.Get("token"),
 | 
			
		||||
	}
 | 
			
		||||
	log.Info(req.Token, req.OperationID, "api delete_friend  is server:%s", req.Uid)
 | 
			
		||||
	RpcResp, err := client.DeleteFriend(context.Background(), req)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Error(req.Token, req.OperationID, "err=%s,call delete_friend rpc server failed", err)
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "call delete_friend rpc server failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	log.InfoByArgs("call delete_friend rpc server,args=%s", RpcResp.String())
 | 
			
		||||
	resp := gin.H{"errCode": RpcResp.ErrorCode, "errMsg": RpcResp.ErrorMsg}
 | 
			
		||||
	c.JSON(http.StatusOK, resp)
 | 
			
		||||
	log.InfoByArgs("api delete_friend success return,get args=%s,return args=%s", req.String(), RpcResp.String())
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										456
									
								
								internal/api/friend/friend.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										456
									
								
								internal/api/friend/friend.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,456 @@
 | 
			
		||||
package friend
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	jsonData "Open_IM/internal/utils"
 | 
			
		||||
	api "Open_IM/pkg/base_info"
 | 
			
		||||
	"Open_IM/pkg/common/config"
 | 
			
		||||
	"Open_IM/pkg/common/log"
 | 
			
		||||
	"Open_IM/pkg/common/token_verify"
 | 
			
		||||
	"Open_IM/pkg/grpc-etcdv3/getcdv3"
 | 
			
		||||
	rpc "Open_IM/pkg/proto/friend"
 | 
			
		||||
	open_im_sdk "Open_IM/pkg/proto/sdk_ws"
 | 
			
		||||
	"Open_IM/pkg/utils"
 | 
			
		||||
	"context"
 | 
			
		||||
	"github.com/gin-gonic/gin"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"strings"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func AddBlack(c *gin.Context) {
 | 
			
		||||
	params := api.AddBlacklistReq{}
 | 
			
		||||
	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.AddBlacklistReq{CommID: &rpc.CommID{}}
 | 
			
		||||
	utils.CopyStructFields(req.CommID, ¶ms)
 | 
			
		||||
	var ok bool
 | 
			
		||||
	ok, req.CommID.OpUserID = token_verify.GetUserIDFromToken(c.Request.Header.Get("token"))
 | 
			
		||||
	if !ok {
 | 
			
		||||
		log.NewError(req.CommID.OperationID, "GetUserIDFromToken false ", c.Request.Header.Get("token"))
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "GetUserIDFromToken failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	log.NewInfo(params.OperationID, "AddBlacklist args ", req.String())
 | 
			
		||||
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImFriendName)
 | 
			
		||||
	client := rpc.NewFriendClient(etcdConn)
 | 
			
		||||
	RpcResp, err := client.AddBlacklist(context.Background(), req)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(req.CommID.OperationID, "AddBlacklist failed ", err.Error())
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "call add blacklist rpc server failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	resp := api.AddBlacklistResp{CommResp: api.CommResp{ErrCode: RpcResp.CommonResp.ErrCode, ErrMsg: RpcResp.CommonResp.ErrMsg}}
 | 
			
		||||
	log.NewInfo(req.CommID.OperationID, "AddBlacklist api return ", resp)
 | 
			
		||||
	c.JSON(http.StatusOK, resp)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func ImportFriend(c *gin.Context) {
 | 
			
		||||
	params := api.ImportFriendReq{}
 | 
			
		||||
	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.ImportFriendReq{}
 | 
			
		||||
	utils.CopyStructFields(req, ¶ms)
 | 
			
		||||
	var ok bool
 | 
			
		||||
	ok, req.OpUserID = token_verify.GetUserIDFromToken(c.Request.Header.Get("token"))
 | 
			
		||||
	if !ok {
 | 
			
		||||
		log.NewError(req.OperationID, "GetUserIDFromToken false ", c.Request.Header.Get("token"))
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "GetUserIDFromToken failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	log.NewInfo(req.OperationID, "ImportFriend args ", req.String())
 | 
			
		||||
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImFriendName)
 | 
			
		||||
	client := rpc.NewFriendClient(etcdConn)
 | 
			
		||||
	RpcResp, err := client.ImportFriend(context.Background(), req)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(req.OperationID, "ImportFriend failed ", err.Error(), req.String())
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "ImportFriend failed "})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	resp := api.ImportFriendResp{CommResp: api.CommResp{ErrCode: RpcResp.CommonResp.ErrCode, ErrMsg: RpcResp.CommonResp.ErrMsg}}
 | 
			
		||||
	if resp.ErrCode == 0 {
 | 
			
		||||
		for _, v := range RpcResp.UserIDResultList {
 | 
			
		||||
			resp.UserIDResultList = append(resp.UserIDResultList, api.UserIDResult{UserID: v.UserID, Result: v.Result})
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if len(resp.UserIDResultList) == 0 {
 | 
			
		||||
		resp.UserIDResultList = []api.UserIDResult{}
 | 
			
		||||
	}
 | 
			
		||||
	log.NewInfo(req.OperationID, "ImportFriend api return ", resp)
 | 
			
		||||
	c.JSON(http.StatusOK, resp)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func AddFriend(c *gin.Context) {
 | 
			
		||||
	params := api.AddFriendReq{}
 | 
			
		||||
	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.AddFriendReq{CommID: &rpc.CommID{}}
 | 
			
		||||
	utils.CopyStructFields(req.CommID, ¶ms.ParamsCommFriend)
 | 
			
		||||
	req.ReqMsg = params.ReqMsg
 | 
			
		||||
	var ok bool
 | 
			
		||||
	ok, req.CommID.OpUserID = token_verify.GetUserIDFromToken(c.Request.Header.Get("token"))
 | 
			
		||||
	if !ok {
 | 
			
		||||
		log.NewError(req.CommID.OperationID, "GetUserIDFromToken false ", c.Request.Header.Get("token"))
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "GetUserIDFromToken failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	log.NewInfo(req.CommID.OperationID, "AddFriend args ", req.String())
 | 
			
		||||
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImFriendName)
 | 
			
		||||
	client := rpc.NewFriendClient(etcdConn)
 | 
			
		||||
	RpcResp, err := client.AddFriend(context.Background(), req)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(req.CommID.OperationID, "AddFriend failed ", err.Error(), req.String())
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "call AddFriend rpc server failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	resp := api.AddFriendResp{CommResp: api.CommResp{ErrCode: RpcResp.CommonResp.ErrCode, ErrMsg: RpcResp.CommonResp.ErrMsg}}
 | 
			
		||||
	log.NewInfo(req.CommID.OperationID, "AddFriend api return ", resp)
 | 
			
		||||
	c.JSON(http.StatusOK, resp)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func AddFriendResponse(c *gin.Context) {
 | 
			
		||||
	params := api.AddFriendResponseReq{}
 | 
			
		||||
	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.AddFriendResponseReq{CommID: &rpc.CommID{}}
 | 
			
		||||
	utils.CopyStructFields(req.CommID, ¶ms.ParamsCommFriend)
 | 
			
		||||
	req.HandleMsg = params.HandleMsg
 | 
			
		||||
	req.HandleResult = params.Flag
 | 
			
		||||
	var ok bool
 | 
			
		||||
	ok, req.CommID.OpUserID = token_verify.GetUserIDFromToken(c.Request.Header.Get("token"))
 | 
			
		||||
	if !ok {
 | 
			
		||||
		log.NewError(req.CommID.OperationID, "GetUserIDFromToken false ", c.Request.Header.Get("token"))
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "GetUserIDFromToken failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	utils.CopyStructFields(req, ¶ms)
 | 
			
		||||
	log.NewInfo(req.CommID.OperationID, "AddFriendResponse args ", req.String())
 | 
			
		||||
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImFriendName)
 | 
			
		||||
	client := rpc.NewFriendClient(etcdConn)
 | 
			
		||||
	RpcResp, err := client.AddFriendResponse(context.Background(), req)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(req.CommID.OperationID, "AddFriendResponse failed ", err.Error(), req.String())
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "call add_friend_response rpc server failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	resp := api.AddFriendResponseResp{CommResp: api.CommResp{ErrCode: RpcResp.CommonResp.ErrCode, ErrMsg: RpcResp.CommonResp.ErrMsg}}
 | 
			
		||||
	log.NewInfo(req.CommID.OperationID, "AddFriendResponse api return ", resp)
 | 
			
		||||
	c.JSON(http.StatusOK, resp)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func DeleteFriend(c *gin.Context) {
 | 
			
		||||
	params := api.DeleteFriendReq{}
 | 
			
		||||
	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.DeleteFriendReq{CommID: &rpc.CommID{}}
 | 
			
		||||
	utils.CopyStructFields(req.CommID, ¶ms.ParamsCommFriend)
 | 
			
		||||
	var ok bool
 | 
			
		||||
	ok, req.CommID.OpUserID = token_verify.GetUserIDFromToken(c.Request.Header.Get("token"))
 | 
			
		||||
	if !ok {
 | 
			
		||||
		log.NewError(req.CommID.OperationID, "GetUserIDFromToken false ", c.Request.Header.Get("token"))
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "GetUserIDFromToken failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	log.NewInfo(req.CommID.OperationID, "DeleteFriend args ", req.String())
 | 
			
		||||
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImFriendName)
 | 
			
		||||
	client := rpc.NewFriendClient(etcdConn)
 | 
			
		||||
	RpcResp, err := client.DeleteFriend(context.Background(), req)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(req.CommID.OperationID, "DeleteFriend failed ", err, req.String())
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "call delete_friend rpc server failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	resp := api.DeleteFriendResp{CommResp: api.CommResp{ErrCode: RpcResp.CommonResp.ErrCode, ErrMsg: RpcResp.CommonResp.ErrMsg}}
 | 
			
		||||
	log.NewInfo(req.CommID.OperationID, "DeleteFriend api return ", resp)
 | 
			
		||||
	c.JSON(http.StatusOK, resp)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func GetBlacklist(c *gin.Context) {
 | 
			
		||||
	params := api.GetBlackListReq{}
 | 
			
		||||
	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.GetBlacklistReq{CommID: &rpc.CommID{}}
 | 
			
		||||
	utils.CopyStructFields(req.CommID, ¶ms)
 | 
			
		||||
	var ok bool
 | 
			
		||||
	ok, req.CommID.OpUserID = token_verify.GetUserIDFromToken(c.Request.Header.Get("token"))
 | 
			
		||||
	if !ok {
 | 
			
		||||
		log.NewError(req.CommID.OperationID, "GetUserIDFromToken false ", c.Request.Header.Get("token"))
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "GetUserIDFromToken failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	log.NewInfo(req.CommID.OperationID, "GetBlacklist args ", req.String())
 | 
			
		||||
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImFriendName)
 | 
			
		||||
	client := rpc.NewFriendClient(etcdConn)
 | 
			
		||||
	RpcResp, err := client.GetBlacklist(context.Background(), req)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(req.CommID.OperationID, "GetBlacklist failed ", err.Error(), req.String())
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "call get blacklist rpc server failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	resp := api.GetBlackListResp{CommResp: api.CommResp{ErrCode: RpcResp.ErrCode, ErrMsg: RpcResp.ErrMsg}}
 | 
			
		||||
	for _, v := range RpcResp.BlackUserInfoList {
 | 
			
		||||
		black := open_im_sdk.PublicUserInfo{}
 | 
			
		||||
		utils.CopyStructFields(&black, v)
 | 
			
		||||
		resp.BlackUserInfoList = append(resp.BlackUserInfoList, &black)
 | 
			
		||||
	}
 | 
			
		||||
	resp.Data = jsonData.JsonDataList(resp.BlackUserInfoList)
 | 
			
		||||
	log.NewInfo(req.CommID.OperationID, "GetBlacklist api return ", resp)
 | 
			
		||||
	c.JSON(http.StatusOK, resp)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SetFriendRemark(c *gin.Context) {
 | 
			
		||||
	params := api.SetFriendRemarkReq{}
 | 
			
		||||
	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.SetFriendRemarkReq{CommID: &rpc.CommID{}}
 | 
			
		||||
	utils.CopyStructFields(req.CommID, ¶ms.ParamsCommFriend)
 | 
			
		||||
	req.Remark = params.Remark
 | 
			
		||||
	var ok bool
 | 
			
		||||
	ok, req.CommID.OpUserID = token_verify.GetUserIDFromToken(c.Request.Header.Get("token"))
 | 
			
		||||
	if !ok {
 | 
			
		||||
		log.NewError(req.CommID.OperationID, "GetUserIDFromToken false ", c.Request.Header.Get("token"))
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "GetUserIDFromToken failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	log.NewInfo(req.CommID.OperationID, "SetFriendComment args ", req.String())
 | 
			
		||||
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImFriendName)
 | 
			
		||||
	client := rpc.NewFriendClient(etcdConn)
 | 
			
		||||
	RpcResp, err := client.SetFriendRemark(context.Background(), req)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(req.CommID.OperationID, "SetFriendComment failed ", err.Error(), req.String())
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "call set friend comment rpc server failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	resp := api.SetFriendRemarkResp{CommResp: api.CommResp{ErrCode: RpcResp.CommonResp.ErrCode, ErrMsg: RpcResp.CommonResp.ErrMsg}}
 | 
			
		||||
 | 
			
		||||
	log.NewInfo(req.CommID.OperationID, "SetFriendComment api return ", resp)
 | 
			
		||||
	c.JSON(http.StatusOK, resp)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func RemoveBlack(c *gin.Context) {
 | 
			
		||||
	params := api.RemoveBlackListReq{}
 | 
			
		||||
	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.RemoveBlacklistReq{CommID: &rpc.CommID{}}
 | 
			
		||||
	utils.CopyStructFields(req.CommID, ¶ms.ParamsCommFriend)
 | 
			
		||||
	var ok bool
 | 
			
		||||
	ok, req.CommID.OpUserID = token_verify.GetUserIDFromToken(c.Request.Header.Get("token"))
 | 
			
		||||
	if !ok {
 | 
			
		||||
		log.NewError(req.CommID.OperationID, "GetUserIDFromToken false ", c.Request.Header.Get("token"))
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "GetUserIDFromToken failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	log.NewInfo(req.CommID.OperationID, "RemoveBlacklist args ", req.String())
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImFriendName)
 | 
			
		||||
	client := rpc.NewFriendClient(etcdConn)
 | 
			
		||||
	RpcResp, err := client.RemoveBlacklist(context.Background(), req)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(req.CommID.OperationID, "RemoveBlacklist failed ", err.Error(), req.String())
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "call remove blacklist rpc server failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	resp := api.RemoveBlackListResp{CommResp: api.CommResp{ErrCode: RpcResp.CommonResp.ErrCode, ErrMsg: RpcResp.CommonResp.ErrMsg}}
 | 
			
		||||
	log.NewInfo(req.CommID.OperationID, "RemoveBlacklist api return ", resp)
 | 
			
		||||
	c.JSON(http.StatusOK, resp)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func IsFriend(c *gin.Context) {
 | 
			
		||||
	params := api.IsFriendReq{}
 | 
			
		||||
	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.IsFriendReq{CommID: &rpc.CommID{}}
 | 
			
		||||
	utils.CopyStructFields(req.CommID, ¶ms.ParamsCommFriend)
 | 
			
		||||
	var ok bool
 | 
			
		||||
	ok, req.CommID.OpUserID = token_verify.GetUserIDFromToken(c.Request.Header.Get("token"))
 | 
			
		||||
	if !ok {
 | 
			
		||||
		log.NewError(req.CommID.OperationID, "GetUserIDFromToken false ", c.Request.Header.Get("token"))
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "GetUserIDFromToken failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	log.NewInfo(req.CommID.OperationID, "IsFriend args ", req.String())
 | 
			
		||||
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImFriendName)
 | 
			
		||||
	client := rpc.NewFriendClient(etcdConn)
 | 
			
		||||
	RpcResp, err := client.IsFriend(context.Background(), req)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(req.CommID.OperationID, "IsFriend failed ", err.Error(), req.String())
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "call add friend rpc server failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	resp := api.IsFriendResp{CommResp: api.CommResp{ErrCode: RpcResp.ErrCode, ErrMsg: RpcResp.ErrMsg}}
 | 
			
		||||
	resp.Response.Friend = RpcResp.Response
 | 
			
		||||
 | 
			
		||||
	log.NewInfo(req.CommID.OperationID, "IsFriend api return ", resp)
 | 
			
		||||
	c.JSON(http.StatusOK, resp)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//func GetFriendsInfo(c *gin.Context) {
 | 
			
		||||
//	params := api.GetFriendsInfoReq{}
 | 
			
		||||
//	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.GetFriendsInfoReq{}
 | 
			
		||||
//	utils.CopyStructFields(req.CommID, params)
 | 
			
		||||
//	var ok bool
 | 
			
		||||
//	ok, req.CommID.OpUserID = token_verify.GetUserIDFromToken(c.Request.Header.Get("token"))
 | 
			
		||||
//	if !ok {
 | 
			
		||||
//		log.NewError(req.CommID.OperationID, "GetUserIDFromToken false ", c.Request.Header.Get("token"))
 | 
			
		||||
//		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "GetUserIDFromToken failed"})
 | 
			
		||||
//		return
 | 
			
		||||
//	}
 | 
			
		||||
//	log.NewInfo(req.CommID.OperationID, "GetFriendsInfo args ", req.String())
 | 
			
		||||
//
 | 
			
		||||
//	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImFriendName)
 | 
			
		||||
//	client := rpc.NewFriendClient(etcdConn)
 | 
			
		||||
//	RpcResp, err := client.GetFriendsInfo(context.Background(), req)
 | 
			
		||||
//	if err != nil {
 | 
			
		||||
//		log.NewError(req.CommID.OperationID, "GetFriendsInfo failed ", err.Error(), req.String())
 | 
			
		||||
//		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "call search friend rpc server failed"})
 | 
			
		||||
//		return
 | 
			
		||||
//	}
 | 
			
		||||
//
 | 
			
		||||
//	resp := api.GetFriendsInfoResp{CommResp:api.CommResp{ErrCode: RpcResp.ErrCode, ErrMsg: RpcResp.ErrMsg}}
 | 
			
		||||
//	utils.CopyStructFields(&resp, RpcResp)
 | 
			
		||||
//	c.JSON(http.StatusOK, resp)
 | 
			
		||||
//	log.NewInfo(req.CommID.OperationID, "GetFriendsInfo api return ", resp)
 | 
			
		||||
//}
 | 
			
		||||
 | 
			
		||||
func GetFriendList(c *gin.Context) {
 | 
			
		||||
	params := api.GetFriendListReq{}
 | 
			
		||||
	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.GetFriendListReq{CommID: &rpc.CommID{}}
 | 
			
		||||
	utils.CopyStructFields(req.CommID, ¶ms)
 | 
			
		||||
	var ok bool
 | 
			
		||||
	ok, req.CommID.OpUserID = token_verify.GetUserIDFromToken(c.Request.Header.Get("token"))
 | 
			
		||||
	if !ok {
 | 
			
		||||
		log.NewError(req.CommID.OperationID, "GetUserIDFromToken false ", c.Request.Header.Get("token"))
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "GetUserIDFromToken failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	log.NewInfo(req.CommID.OperationID, "GetFriendList args ", req.String())
 | 
			
		||||
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImFriendName)
 | 
			
		||||
	client := rpc.NewFriendClient(etcdConn)
 | 
			
		||||
	RpcResp, err := client.GetFriendList(context.Background(), req)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(req.CommID.OperationID, "GetFriendList failed ", err.Error(), req.String())
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "call get friend list rpc server failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	resp := api.GetFriendListResp{CommResp: api.CommResp{ErrCode: RpcResp.ErrCode, ErrMsg: RpcResp.ErrMsg}, FriendInfoList: RpcResp.FriendInfoList}
 | 
			
		||||
	resp.Data = jsonData.JsonDataList(resp.FriendInfoList)
 | 
			
		||||
	log.NewInfo(req.CommID.OperationID, "GetFriendList api return ", resp)
 | 
			
		||||
	c.JSON(http.StatusOK, resp)
 | 
			
		||||
	//c.JSON(http.StatusOK, resp)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func GetFriendApplyList(c *gin.Context) {
 | 
			
		||||
	params := api.GetFriendApplyListReq{}
 | 
			
		||||
	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.GetFriendApplyListReq{CommID: &rpc.CommID{}}
 | 
			
		||||
	utils.CopyStructFields(req.CommID, ¶ms)
 | 
			
		||||
	var ok bool
 | 
			
		||||
	ok, req.CommID.OpUserID = token_verify.GetUserIDFromToken(c.Request.Header.Get("token"))
 | 
			
		||||
	if !ok {
 | 
			
		||||
		log.NewError(req.CommID.OperationID, "GetUserIDFromToken false ", c.Request.Header.Get("token"))
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "GetUserIDFromToken failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	log.NewInfo(req.CommID.OperationID, "GetFriendApplyList args ", req.String())
 | 
			
		||||
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImFriendName)
 | 
			
		||||
	client := rpc.NewFriendClient(etcdConn)
 | 
			
		||||
 | 
			
		||||
	RpcResp, err := client.GetFriendApplyList(context.Background(), req)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(req.CommID.OperationID, "GetFriendApplyList failed ", err.Error(), req.String())
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "call get friend apply list rpc server failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	resp := api.GetFriendApplyListResp{CommResp: api.CommResp{ErrCode: RpcResp.ErrCode, ErrMsg: RpcResp.ErrMsg}, FriendRequestList: RpcResp.FriendRequestList}
 | 
			
		||||
	resp.Data = jsonData.JsonDataList(resp.FriendRequestList)
 | 
			
		||||
	log.NewInfo(req.CommID.OperationID, "GetFriendApplyList api return ", resp)
 | 
			
		||||
	c.JSON(http.StatusOK, resp)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func GetSelfFriendApplyList(c *gin.Context) {
 | 
			
		||||
	params := api.GetSelfApplyListReq{}
 | 
			
		||||
	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.GetSelfApplyListReq{CommID: &rpc.CommID{}}
 | 
			
		||||
	utils.CopyStructFields(req.CommID, ¶ms)
 | 
			
		||||
	var ok bool
 | 
			
		||||
	ok, req.CommID.OpUserID = token_verify.GetUserIDFromToken(c.Request.Header.Get("token"))
 | 
			
		||||
	if !ok {
 | 
			
		||||
		log.NewError(req.CommID.OperationID, "GetUserIDFromToken false ", c.Request.Header.Get("token"))
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "GetUserIDFromToken failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	log.NewInfo(req.CommID.OperationID, "GetSelfApplyList args ", req.String())
 | 
			
		||||
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImFriendName)
 | 
			
		||||
	client := rpc.NewFriendClient(etcdConn)
 | 
			
		||||
	RpcResp, err := client.GetSelfApplyList(context.Background(), req)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(req.CommID.OperationID, "GetSelfApplyList failed ", err.Error(), req.String())
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "call get self apply list rpc server failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	resp := api.GetSelfApplyListResp{CommResp: api.CommResp{ErrCode: RpcResp.ErrCode, ErrMsg: RpcResp.ErrMsg}, FriendRequestList: RpcResp.FriendRequestList}
 | 
			
		||||
	resp.Data = jsonData.JsonDataList(resp.FriendRequestList)
 | 
			
		||||
	log.NewInfo(req.CommID.OperationID, "GetSelfApplyList api return ", resp)
 | 
			
		||||
	c.JSON(http.StatusOK, resp)
 | 
			
		||||
}
 | 
			
		||||
@ -1,79 +0,0 @@
 | 
			
		||||
package friend
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	pbFriend "Open_IM/pkg/proto/friend"
 | 
			
		||||
	"Open_IM/pkg/common/config"
 | 
			
		||||
	"Open_IM/pkg/common/log"
 | 
			
		||||
	"Open_IM/pkg/grpc-etcdv3/getcdv3"
 | 
			
		||||
	"context"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"github.com/gin-gonic/gin"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"strings"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type paramsGetBlackList struct {
 | 
			
		||||
	OperationID string `json:"operationID" binding:"required"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type blackListUserInfo struct {
 | 
			
		||||
	UID    string `json:"uid"`
 | 
			
		||||
	Name   string `json:"name"`
 | 
			
		||||
	Icon   string `json:"icon"`
 | 
			
		||||
	Gender int32  `json:"gender"`
 | 
			
		||||
	Mobile string `json:"mobile"`
 | 
			
		||||
	Birth  string `json:"birth"`
 | 
			
		||||
	Email  string `json:"email"`
 | 
			
		||||
	Ex     string `json:"ex"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func GetBlacklist(c *gin.Context) {
 | 
			
		||||
	log.Info("", "", "api get blacklist init ....")
 | 
			
		||||
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImFriendName)
 | 
			
		||||
	client := pbFriend.NewFriendClient(etcdConn)
 | 
			
		||||
	//defer etcdConn.Close()
 | 
			
		||||
 | 
			
		||||
	params := paramsGetBlackList{}
 | 
			
		||||
	if err := c.BindJSON(¶ms); err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	req := &pbFriend.GetBlacklistReq{
 | 
			
		||||
		OperationID: params.OperationID,
 | 
			
		||||
		Token:       c.Request.Header.Get("token"),
 | 
			
		||||
	}
 | 
			
		||||
	log.Info(req.Token, req.OperationID, fmt.Sprintf("api get blacklist is server"))
 | 
			
		||||
	RpcResp, err := client.GetBlacklist(context.Background(), req)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Error(req.Token, req.OperationID, "err=%s,call get_friend_list rpc server failed", err)
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "call get blacklist rpc server failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	log.InfoByArgs("call get blacklist rpc server success,args=%s", RpcResp.String())
 | 
			
		||||
	if RpcResp.ErrorCode == 0 {
 | 
			
		||||
		userBlackList := make([]blackListUserInfo, 0)
 | 
			
		||||
		for _, friend := range RpcResp.Data {
 | 
			
		||||
			var fi blackListUserInfo
 | 
			
		||||
			fi.UID = friend.Uid
 | 
			
		||||
			fi.Name = friend.Name
 | 
			
		||||
			fi.Icon = friend.Icon
 | 
			
		||||
			fi.Gender = friend.Gender
 | 
			
		||||
			fi.Mobile = friend.Mobile
 | 
			
		||||
			fi.Birth = friend.Birth
 | 
			
		||||
			fi.Email = friend.Email
 | 
			
		||||
			fi.Ex = friend.Ex
 | 
			
		||||
			userBlackList = append(userBlackList, fi)
 | 
			
		||||
		}
 | 
			
		||||
		resp := gin.H{
 | 
			
		||||
			"errCode": RpcResp.ErrorCode,
 | 
			
		||||
			"errMsg":  RpcResp.ErrorMsg,
 | 
			
		||||
			"data":    userBlackList,
 | 
			
		||||
		}
 | 
			
		||||
		c.JSON(http.StatusOK, resp)
 | 
			
		||||
	} else {
 | 
			
		||||
		resp := gin.H{"errCode": RpcResp.ErrorCode, "errMsg": RpcResp.ErrorMsg}
 | 
			
		||||
		c.JSON(http.StatusOK, resp)
 | 
			
		||||
	}
 | 
			
		||||
	log.InfoByArgs("api get black list success return,get args=%s,return=%s", req.String(), RpcResp.String())
 | 
			
		||||
}
 | 
			
		||||
@ -1,129 +0,0 @@
 | 
			
		||||
package friend
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	pbFriend "Open_IM/pkg/proto/friend"
 | 
			
		||||
	"Open_IM/pkg/common/config"
 | 
			
		||||
	"Open_IM/pkg/common/log"
 | 
			
		||||
	"Open_IM/pkg/grpc-etcdv3/getcdv3"
 | 
			
		||||
	"context"
 | 
			
		||||
	"github.com/gin-gonic/gin"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"strings"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type paramsGetApplyList struct {
 | 
			
		||||
	OperationID string `json:"operationID" binding:"required"`
 | 
			
		||||
}
 | 
			
		||||
type UserInfo struct {
 | 
			
		||||
	UID        string `json:"uid"`
 | 
			
		||||
	Name       string `json:"name"`
 | 
			
		||||
	Icon       string `json:"icon"`
 | 
			
		||||
	Gender     int32  `json:"gender"`
 | 
			
		||||
	Mobile     string `json:"mobile"`
 | 
			
		||||
	Birth      string `json:"birth"`
 | 
			
		||||
	Email      string `json:"email"`
 | 
			
		||||
	Ex         string `json:"ex"`
 | 
			
		||||
	ReqMessage string `json:"reqMessage"`
 | 
			
		||||
	ApplyTime  string `json:"applyTime"`
 | 
			
		||||
	Flag       int32  `json:"flag"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func GetFriendApplyList(c *gin.Context) {
 | 
			
		||||
	log.Info("", "", "api get_friend_apply_list init ....")
 | 
			
		||||
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImFriendName)
 | 
			
		||||
	client := pbFriend.NewFriendClient(etcdConn)
 | 
			
		||||
	//defer etcdConn.Close()
 | 
			
		||||
 | 
			
		||||
	params := paramsGetApplyList{}
 | 
			
		||||
	if err := c.BindJSON(¶ms); err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	req := &pbFriend.GetFriendApplyReq{
 | 
			
		||||
		OperationID: params.OperationID,
 | 
			
		||||
		Token:       c.Request.Header.Get("token"),
 | 
			
		||||
	}
 | 
			
		||||
	log.Info(req.Token, req.OperationID, "api get friend apply list  is server")
 | 
			
		||||
	RpcResp, err := client.GetFriendApplyList(context.Background(), req)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Error(req.Token, req.OperationID, "err=%s,call get friend apply list rpc server failed", err)
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "call get friend apply list rpc server failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	log.InfoByArgs("call get friend apply list rpc server success,args=%s", RpcResp.String())
 | 
			
		||||
	if RpcResp.ErrorCode == 0 {
 | 
			
		||||
		userInfoList := make([]UserInfo, 0)
 | 
			
		||||
		for _, applyUserinfo := range RpcResp.Data {
 | 
			
		||||
			var un UserInfo
 | 
			
		||||
			un.UID = applyUserinfo.Uid
 | 
			
		||||
			un.Name = applyUserinfo.Name
 | 
			
		||||
			un.Icon = applyUserinfo.Icon
 | 
			
		||||
			un.Gender = applyUserinfo.Gender
 | 
			
		||||
			un.Mobile = applyUserinfo.Mobile
 | 
			
		||||
			un.Birth = applyUserinfo.Birth
 | 
			
		||||
			un.Email = applyUserinfo.Email
 | 
			
		||||
			un.Ex = applyUserinfo.Ex
 | 
			
		||||
			un.Flag = applyUserinfo.Flag
 | 
			
		||||
			un.ApplyTime = applyUserinfo.ApplyTime
 | 
			
		||||
			un.ReqMessage = applyUserinfo.ReqMessage
 | 
			
		||||
			userInfoList = append(userInfoList, un)
 | 
			
		||||
		}
 | 
			
		||||
		resp := gin.H{"errCode": RpcResp.ErrorCode, "errMsg": RpcResp.ErrorMsg, "data": userInfoList}
 | 
			
		||||
		c.JSON(http.StatusOK, resp)
 | 
			
		||||
	} else {
 | 
			
		||||
		resp := gin.H{"errCode": RpcResp.ErrorCode, "errMsg": RpcResp.ErrorMsg}
 | 
			
		||||
		c.JSON(http.StatusOK, resp)
 | 
			
		||||
	}
 | 
			
		||||
	log.InfoByArgs("api get friend apply list success return,get args=%s,return args=%s", req.String(), RpcResp.String())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func GetSelfApplyList(c *gin.Context) {
 | 
			
		||||
	log.Info("", "", "api get self friend apply list init ....")
 | 
			
		||||
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImFriendName)
 | 
			
		||||
	client := pbFriend.NewFriendClient(etcdConn)
 | 
			
		||||
	//defer etcdConn.Close()
 | 
			
		||||
 | 
			
		||||
	params := paramsGetApplyList{}
 | 
			
		||||
	if err := c.BindJSON(¶ms); err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	req := &pbFriend.GetFriendApplyReq{
 | 
			
		||||
		OperationID: params.OperationID,
 | 
			
		||||
		Token:       c.Request.Header.Get("token"),
 | 
			
		||||
	}
 | 
			
		||||
	log.Info(req.Token, req.OperationID, "api get self apply list  is server")
 | 
			
		||||
	RpcResp, err := client.GetSelfApplyList(context.Background(), req)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Error(req.Token, req.OperationID, "err=%s,call get self apply list rpc server failed", err)
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "call get self apply list rpc server failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	log.InfoByArgs("call get self apply list rpc server success,args=%s", RpcResp.String())
 | 
			
		||||
	if RpcResp.ErrorCode == 0 {
 | 
			
		||||
		userInfoList := make([]UserInfo, 0)
 | 
			
		||||
		for _, selfApplyOtherUserinfo := range RpcResp.Data {
 | 
			
		||||
			var un UserInfo
 | 
			
		||||
			un.UID = selfApplyOtherUserinfo.Uid
 | 
			
		||||
			un.Name = selfApplyOtherUserinfo.Name
 | 
			
		||||
			un.Icon = selfApplyOtherUserinfo.Icon
 | 
			
		||||
			un.Gender = selfApplyOtherUserinfo.Gender
 | 
			
		||||
			un.Mobile = selfApplyOtherUserinfo.Mobile
 | 
			
		||||
			un.Birth = selfApplyOtherUserinfo.Birth
 | 
			
		||||
			un.Email = selfApplyOtherUserinfo.Email
 | 
			
		||||
			un.Ex = selfApplyOtherUserinfo.Ex
 | 
			
		||||
			un.Flag = selfApplyOtherUserinfo.Flag
 | 
			
		||||
			un.ApplyTime = selfApplyOtherUserinfo.ApplyTime
 | 
			
		||||
			un.ReqMessage = selfApplyOtherUserinfo.ReqMessage
 | 
			
		||||
			userInfoList = append(userInfoList, un)
 | 
			
		||||
		}
 | 
			
		||||
		resp := gin.H{"errCode": RpcResp.ErrorCode, "errMsg": RpcResp.ErrorMsg, "data": userInfoList}
 | 
			
		||||
		c.JSON(http.StatusOK, resp)
 | 
			
		||||
	} else {
 | 
			
		||||
		resp := gin.H{"errCode": RpcResp.ErrorCode, "errMsg": RpcResp.ErrorMsg}
 | 
			
		||||
		c.JSON(http.StatusOK, resp)
 | 
			
		||||
	}
 | 
			
		||||
	log.InfoByArgs("api get self apply list success return,get args=%s,return args=%s", req.String(), RpcResp.String())
 | 
			
		||||
}
 | 
			
		||||
@ -1,83 +0,0 @@
 | 
			
		||||
package friend
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	pbFriend "Open_IM/pkg/proto/friend"
 | 
			
		||||
	"Open_IM/pkg/common/config"
 | 
			
		||||
	"Open_IM/pkg/common/log"
 | 
			
		||||
	"Open_IM/pkg/grpc-etcdv3/getcdv3"
 | 
			
		||||
	"context"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"github.com/gin-gonic/gin"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"strings"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type paramsGetFriendLIst struct {
 | 
			
		||||
	OperationID string `json:"operationID" binding:"required"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type friendInfo struct {
 | 
			
		||||
	UID           string `json:"uid"`
 | 
			
		||||
	Name          string `json:"name"`
 | 
			
		||||
	Icon          string `json:"icon"`
 | 
			
		||||
	Gender        int32  `json:"gender"`
 | 
			
		||||
	Mobile        string `json:"mobile"`
 | 
			
		||||
	Birth         string `json:"birth"`
 | 
			
		||||
	Email         string `json:"email"`
 | 
			
		||||
	Ex            string `json:"ex"`
 | 
			
		||||
	Comment       string `json:"comment"`
 | 
			
		||||
	IsInBlackList int32  `json:"isInBlackList"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func GetFriendList(c *gin.Context) {
 | 
			
		||||
	log.Info("", "", fmt.Sprintf("api get_friendlist init ...."))
 | 
			
		||||
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImFriendName)
 | 
			
		||||
	client := pbFriend.NewFriendClient(etcdConn)
 | 
			
		||||
	//defer etcdConn.Close()
 | 
			
		||||
 | 
			
		||||
	params := paramsGetFriendLIst{}
 | 
			
		||||
	if err := c.BindJSON(¶ms); err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	req := &pbFriend.GetFriendListReq{
 | 
			
		||||
		OperationID: params.OperationID,
 | 
			
		||||
		Token:       c.Request.Header.Get("token"),
 | 
			
		||||
	}
 | 
			
		||||
	log.Info(req.Token, req.OperationID, "api get friend list is server")
 | 
			
		||||
	RpcResp, err := client.GetFriendList(context.Background(), req)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Error(req.Token, req.OperationID, "err=%s,call get friend list rpc server failed", err)
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "call get friend list rpc server failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	log.InfoByArgs("call get friend list rpc server success,args=%s", RpcResp.String())
 | 
			
		||||
	if RpcResp.ErrorCode == 0 {
 | 
			
		||||
		friendsInfo := make([]friendInfo, 0)
 | 
			
		||||
		for _, friend := range RpcResp.Data {
 | 
			
		||||
			var fi friendInfo
 | 
			
		||||
			fi.UID = friend.Uid
 | 
			
		||||
			fi.Name = friend.Name
 | 
			
		||||
			fi.Icon = friend.Icon
 | 
			
		||||
			fi.Gender = friend.Gender
 | 
			
		||||
			fi.Mobile = friend.Mobile
 | 
			
		||||
			fi.Birth = friend.Birth
 | 
			
		||||
			fi.Email = friend.Email
 | 
			
		||||
			fi.Ex = friend.Ex
 | 
			
		||||
			fi.Comment = friend.Comment
 | 
			
		||||
			fi.IsInBlackList = friend.IsInBlackList
 | 
			
		||||
			friendsInfo = append(friendsInfo, fi)
 | 
			
		||||
		}
 | 
			
		||||
		resp := gin.H{
 | 
			
		||||
			"errCode": RpcResp.ErrorCode,
 | 
			
		||||
			"errMsg":  RpcResp.ErrorMsg,
 | 
			
		||||
			"data":    friendsInfo,
 | 
			
		||||
		}
 | 
			
		||||
		c.JSON(http.StatusOK, resp)
 | 
			
		||||
	} else {
 | 
			
		||||
		resp := gin.H{"errCode": RpcResp.ErrorCode, "errMsg": RpcResp.ErrorMsg}
 | 
			
		||||
		c.JSON(http.StatusOK, resp)
 | 
			
		||||
	}
 | 
			
		||||
	log.InfoByArgs("api get friend list success return,get args=%s,return=%s", req.String(), RpcResp.String())
 | 
			
		||||
}
 | 
			
		||||
@ -1,70 +0,0 @@
 | 
			
		||||
package friend
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	pbFriend "Open_IM/pkg/proto/friend"
 | 
			
		||||
	"Open_IM/pkg/common/config"
 | 
			
		||||
	"Open_IM/pkg/common/log"
 | 
			
		||||
	"Open_IM/pkg/grpc-etcdv3/getcdv3"
 | 
			
		||||
	"context"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"github.com/gin-gonic/gin"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"strings"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type paramsSearchFriend struct {
 | 
			
		||||
	OperationID string `json:"operationID" binding:"required"`
 | 
			
		||||
	UID         string `json:"uid" binding:"required"`
 | 
			
		||||
	OwnerUid    string `json:"ownerUid"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func GetFriendsInfo(c *gin.Context) {
 | 
			
		||||
	log.Info("", "", fmt.Sprintf("api search friend init ...."))
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImFriendName)
 | 
			
		||||
	client := pbFriend.NewFriendClient(etcdConn)
 | 
			
		||||
	//defer etcdConn.Close()
 | 
			
		||||
 | 
			
		||||
	params := paramsSearchFriend{}
 | 
			
		||||
	if err := c.BindJSON(¶ms); err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	req := &pbFriend.GetFriendsInfoReq{
 | 
			
		||||
		Uid:         params.UID,
 | 
			
		||||
		OperationID: params.OperationID,
 | 
			
		||||
		Token:       c.Request.Header.Get("token"),
 | 
			
		||||
	}
 | 
			
		||||
	log.Info(req.Token, req.OperationID, "api search_friend is server")
 | 
			
		||||
	RpcResp, err := client.GetFriendsInfo(context.Background(), req)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Error(req.Token, req.OperationID, "err=%s,call search friend rpc server failed", err)
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "call search friend rpc server failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	log.InfoByArgs("call search friend rpc server success,args=%s", RpcResp.String())
 | 
			
		||||
	if RpcResp.ErrorCode == 0 {
 | 
			
		||||
		resp := gin.H{
 | 
			
		||||
			"errCode": RpcResp.ErrorCode,
 | 
			
		||||
			"errMsg":  RpcResp.ErrorMsg,
 | 
			
		||||
			"data": gin.H{
 | 
			
		||||
				"uid":     RpcResp.Data.Uid,
 | 
			
		||||
				"icon":    RpcResp.Data.Icon,
 | 
			
		||||
				"name":    RpcResp.Data.Name,
 | 
			
		||||
				"gender":  RpcResp.Data.Gender,
 | 
			
		||||
				"mobile":  RpcResp.Data.Mobile,
 | 
			
		||||
				"birth":   RpcResp.Data.Birth,
 | 
			
		||||
				"email":   RpcResp.Data.Email,
 | 
			
		||||
				"ex":      RpcResp.Data.Ex,
 | 
			
		||||
				"comment": RpcResp.Data.Comment,
 | 
			
		||||
			},
 | 
			
		||||
		}
 | 
			
		||||
		c.JSON(http.StatusOK, resp)
 | 
			
		||||
	} else {
 | 
			
		||||
		resp := gin.H{
 | 
			
		||||
			"errCode": RpcResp.ErrorCode,
 | 
			
		||||
			"errMsg":  RpcResp.ErrorMsg,
 | 
			
		||||
		}
 | 
			
		||||
		c.JSON(http.StatusOK, resp)
 | 
			
		||||
	}
 | 
			
		||||
	log.InfoByArgs("api search_friend success return,get args=%s,return=%s", req.String(), RpcResp.String())
 | 
			
		||||
}
 | 
			
		||||
@ -1,47 +0,0 @@
 | 
			
		||||
package friend
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	pbFriend "Open_IM/pkg/proto/friend"
 | 
			
		||||
	"Open_IM/pkg/common/config"
 | 
			
		||||
	"Open_IM/pkg/common/log"
 | 
			
		||||
	"Open_IM/pkg/grpc-etcdv3/getcdv3"
 | 
			
		||||
	"context"
 | 
			
		||||
	"github.com/gin-gonic/gin"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"strings"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type paramsIsFriend struct {
 | 
			
		||||
	OperationID string `json:"operationID" binding:"required"`
 | 
			
		||||
	ReceiveUid  string `json:"receive_uid"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func IsFriend(c *gin.Context) {
 | 
			
		||||
	log.Info("", "", "api is friend init....")
 | 
			
		||||
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImFriendName)
 | 
			
		||||
	client := pbFriend.NewFriendClient(etcdConn)
 | 
			
		||||
	//defer etcdConn.Close()
 | 
			
		||||
 | 
			
		||||
	params := paramsIsFriend{}
 | 
			
		||||
	if err := c.BindJSON(¶ms); err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	req := &pbFriend.IsFriendReq{
 | 
			
		||||
		OperationID: params.OperationID,
 | 
			
		||||
		ReceiveUid:  params.OperationID,
 | 
			
		||||
		Token:       c.Request.Header.Get("token"),
 | 
			
		||||
	}
 | 
			
		||||
	log.Info(req.Token, req.OperationID, "api is friend is server")
 | 
			
		||||
	RpcResp, err := client.IsFriend(context.Background(), req)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Error(req.Token, req.OperationID, "err=%s,call add friend rpc server failed", err)
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "call add friend rpc server failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	log.InfoByArgs("call is friend rpc server success,args=%s", RpcResp.String())
 | 
			
		||||
	resp := gin.H{"errCode": RpcResp.ErrorCode, "errMsg": RpcResp.ErrorMsg, "isFriend": RpcResp.ShipType}
 | 
			
		||||
	c.JSON(http.StatusOK, resp)
 | 
			
		||||
	log.InfoByArgs("api is friend success return,get args=%s,return args=%s", req.String(), RpcResp.String())
 | 
			
		||||
}
 | 
			
		||||
@ -1,47 +0,0 @@
 | 
			
		||||
package friend
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	pbFriend "Open_IM/pkg/proto/friend"
 | 
			
		||||
	"Open_IM/pkg/common/config"
 | 
			
		||||
	"Open_IM/pkg/common/log"
 | 
			
		||||
	"Open_IM/pkg/grpc-etcdv3/getcdv3"
 | 
			
		||||
	"context"
 | 
			
		||||
	"github.com/gin-gonic/gin"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"strings"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type paramsRemoveBlackList struct {
 | 
			
		||||
	OperationID string `json:"operationID" binding:"required"`
 | 
			
		||||
	UID         string `json:"uid" binding:"required"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func RemoveBlacklist(c *gin.Context) {
 | 
			
		||||
	log.Info("", "", "api remove_blacklist init ....")
 | 
			
		||||
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImFriendName)
 | 
			
		||||
	client := pbFriend.NewFriendClient(etcdConn)
 | 
			
		||||
	//defer etcdConn.Close()
 | 
			
		||||
 | 
			
		||||
	params := paramsRemoveBlackList{}
 | 
			
		||||
	if err := c.BindJSON(¶ms); err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	req := &pbFriend.RemoveBlacklistReq{
 | 
			
		||||
		Uid:         params.UID,
 | 
			
		||||
		OperationID: params.OperationID,
 | 
			
		||||
		Token:       c.Request.Header.Get("token"),
 | 
			
		||||
	}
 | 
			
		||||
	log.Info(req.Token, req.OperationID, "api remove blacklist is server:userID=%s", req.Uid)
 | 
			
		||||
	RpcResp, err := client.RemoveBlacklist(context.Background(), req)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Error(req.Token, req.OperationID, "err=%s,call remove blacklist rpc server failed", err)
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "call remove blacklist rpc server failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	log.InfoByArgs("call remove blacklist rpc server success,args=%s", RpcResp.String())
 | 
			
		||||
	resp := gin.H{"errCode": RpcResp.ErrorCode, "errMsg": RpcResp.ErrorMsg}
 | 
			
		||||
	c.JSON(http.StatusOK, resp)
 | 
			
		||||
	log.InfoByArgs("api remove blacklist success return,get args=%s,return args=%s", req.String(), RpcResp.String())
 | 
			
		||||
}
 | 
			
		||||
@ -1,48 +0,0 @@
 | 
			
		||||
package friend
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	pbFriend "Open_IM/pkg/proto/friend"
 | 
			
		||||
	"Open_IM/pkg/common/config"
 | 
			
		||||
	"Open_IM/pkg/common/log"
 | 
			
		||||
	"Open_IM/pkg/grpc-etcdv3/getcdv3"
 | 
			
		||||
	"context"
 | 
			
		||||
	"github.com/gin-gonic/gin"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"strings"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type paramsSetFriendComment struct {
 | 
			
		||||
	OperationID string `json:"operationID" binding:"required"`
 | 
			
		||||
	UID         string `json:"uid" binding:"required"`
 | 
			
		||||
	Comment     string `json:"comment"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SetFriendComment(c *gin.Context) {
 | 
			
		||||
	log.Info("", "", "api set friend comment init ....")
 | 
			
		||||
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImFriendName)
 | 
			
		||||
	client := pbFriend.NewFriendClient(etcdConn)
 | 
			
		||||
	//defer etcdConn.Close()
 | 
			
		||||
 | 
			
		||||
	params := paramsSetFriendComment{}
 | 
			
		||||
	if err := c.BindJSON(¶ms); err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	req := &pbFriend.SetFriendCommentReq{
 | 
			
		||||
		Uid:         params.UID,
 | 
			
		||||
		OperationID: params.OperationID,
 | 
			
		||||
		Comment:     params.Comment,
 | 
			
		||||
		Token:       c.Request.Header.Get("token"),
 | 
			
		||||
	}
 | 
			
		||||
	log.Info(req.Token, req.OperationID, "api set friend comment is server")
 | 
			
		||||
	RpcResp, err := client.SetFriendComment(context.Background(), req)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Error(req.Token, req.OperationID, "err=%s,call set friend comment rpc server failed", err)
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "call set friend comment rpc server failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	log.Info("", "", "call set friend comment rpc server success,args=%s", RpcResp.String())
 | 
			
		||||
	c.JSON(http.StatusOK, gin.H{"errCode": RpcResp.ErrorCode, "errMsg": RpcResp.ErrorMsg})
 | 
			
		||||
	log.Info("", "", "api set friend comment success return,get args=%s,return args=%s", req.String(), RpcResp.String())
 | 
			
		||||
}
 | 
			
		||||
@ -1,61 +0,0 @@
 | 
			
		||||
package group
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	pb "Open_IM/pkg/proto/group"
 | 
			
		||||
	"Open_IM/pkg/common/config"
 | 
			
		||||
	"Open_IM/pkg/common/log"
 | 
			
		||||
	"Open_IM/pkg/grpc-etcdv3/getcdv3"
 | 
			
		||||
	"context"
 | 
			
		||||
	"github.com/gin-gonic/gin"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"strings"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type paramsCreateGroupStruct struct {
 | 
			
		||||
	MemberList   []*pb.GroupAddMemberInfo `json:"memberList"`
 | 
			
		||||
	GroupName    string                   `json:"groupName"`
 | 
			
		||||
	Introduction string                   `json:"introduction"`
 | 
			
		||||
	Notification string                   `json:"notification"`
 | 
			
		||||
	FaceUrl      string                   `json:"faceUrl"`
 | 
			
		||||
	OperationID  string                   `json:"operationID" binding:"required"`
 | 
			
		||||
	Ex           string                   `json:"ex"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func CreateGroup(c *gin.Context) {
 | 
			
		||||
	log.Info("", "", "api create group init ....")
 | 
			
		||||
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImGroupName)
 | 
			
		||||
	client := pb.NewGroupClient(etcdConn)
 | 
			
		||||
	//defer etcdConn.Close()
 | 
			
		||||
 | 
			
		||||
	params := paramsCreateGroupStruct{}
 | 
			
		||||
	if err := c.BindJSON(¶ms); err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	req := &pb.CreateGroupReq{
 | 
			
		||||
		MemberList:   params.MemberList,
 | 
			
		||||
		GroupName:    params.GroupName,
 | 
			
		||||
		Introduction: params.Introduction,
 | 
			
		||||
		Notification: params.Notification,
 | 
			
		||||
		FaceUrl:      params.FaceUrl,
 | 
			
		||||
		OperationID:  params.OperationID,
 | 
			
		||||
		Ex:           params.Ex,
 | 
			
		||||
		Token:        c.Request.Header.Get("token"),
 | 
			
		||||
	}
 | 
			
		||||
	log.Info(req.Token, req.OperationID, "api create group is server,params=%s", req.String())
 | 
			
		||||
	RpcResp, err := client.CreateGroup(context.Background(), req)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Error(req.Token, req.OperationID, "err=%s,call create group  rpc server failed", err.Error())
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "call  rpc server failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	log.InfoByArgs("call create group  rpc server success,args=%s", RpcResp.String())
 | 
			
		||||
	if RpcResp.ErrorCode == 0 {
 | 
			
		||||
		resp := gin.H{"errCode": RpcResp.ErrorCode, "errMsg": RpcResp.ErrorMsg, "data": gin.H{"groupID": RpcResp.GroupID}}
 | 
			
		||||
		c.JSON(http.StatusOK, resp)
 | 
			
		||||
	} else {
 | 
			
		||||
		c.JSON(http.StatusOK, gin.H{"errCode": RpcResp.ErrorCode, "errMsg": RpcResp.ErrorMsg})
 | 
			
		||||
	}
 | 
			
		||||
	log.InfoByArgs("api create group success return,get args=%s,return args=%s", req.String(), RpcResp.String())
 | 
			
		||||
}
 | 
			
		||||
@ -1,113 +0,0 @@
 | 
			
		||||
package group
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"Open_IM/pkg/common/config"
 | 
			
		||||
	"Open_IM/pkg/common/log"
 | 
			
		||||
	"Open_IM/pkg/grpc-etcdv3/getcdv3"
 | 
			
		||||
	"Open_IM/pkg/proto/group"
 | 
			
		||||
	"Open_IM/pkg/utils"
 | 
			
		||||
	"context"
 | 
			
		||||
	"github.com/gin-gonic/gin"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"strings"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type paramsGroupApplicationList struct {
 | 
			
		||||
	OperationID string `json:"operationID" binding:"required"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func newUserRegisterReq(params *paramsGroupApplicationList) *group.GetGroupApplicationListReq {
 | 
			
		||||
	pbData := group.GetGroupApplicationListReq{
 | 
			
		||||
		OperationID: params.OperationID,
 | 
			
		||||
	}
 | 
			
		||||
	return &pbData
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type paramsGroupApplicationListRet struct {
 | 
			
		||||
	ID               string `json:"id"`
 | 
			
		||||
	GroupID          string `json:"groupID"`
 | 
			
		||||
	FromUserID       string `json:"fromUserID"`
 | 
			
		||||
	ToUserID         string `json:"toUserID"`
 | 
			
		||||
	Flag             int32  `json:"flag"`
 | 
			
		||||
	RequestMsg       string `json:"reqMsg"`
 | 
			
		||||
	HandledMsg       string `json:"handledMsg"`
 | 
			
		||||
	AddTime          int64  `json:"createTime"`
 | 
			
		||||
	FromUserNickname string `json:"fromUserNickName"`
 | 
			
		||||
	ToUserNickname   string `json:"toUserNickName"`
 | 
			
		||||
	FromUserFaceUrl  string `json:"fromUserFaceURL"`
 | 
			
		||||
	ToUserFaceUrl    string `json:"toUserFaceURL"`
 | 
			
		||||
	HandledUser      string `json:"handledUser"`
 | 
			
		||||
	Type             int32  `json:"type"`
 | 
			
		||||
	HandleStatus     int32  `json:"handleStatus"`
 | 
			
		||||
	HandleResult     int32  `json:"handleResult"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func GetGroupApplicationList(c *gin.Context) {
 | 
			
		||||
	log.Info("", "", "api GetGroupApplicationList init ....")
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImGroupName)
 | 
			
		||||
	client := group.NewGroupClient(etcdConn)
 | 
			
		||||
	//defer etcdConn.Close()
 | 
			
		||||
 | 
			
		||||
	params := paramsGroupApplicationList{}
 | 
			
		||||
	if err := c.BindJSON(¶ms); err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	pbData := newUserRegisterReq(¶ms)
 | 
			
		||||
 | 
			
		||||
	token := c.Request.Header.Get("token")
 | 
			
		||||
	if claims, err := utils.ParseToken(token); err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": "token validate err"})
 | 
			
		||||
		return
 | 
			
		||||
	} else {
 | 
			
		||||
		pbData.UID = claims.UID
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	log.Info("", "", "api GetGroupApplicationList is server, [data: %s]", pbData.String())
 | 
			
		||||
	reply, err := client.GetGroupApplicationList(context.Background(), pbData)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Error("", "", "api GetGroupApplicationList call rpc fail, [data: %s] [err: %s]", pbData.String(), err.Error())
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	log.Info("", "", "api GetGroupApplicationList call rpc success, [data: %s] [reply: %s]", pbData.String(), reply.String())
 | 
			
		||||
 | 
			
		||||
	unProcessCount := 0
 | 
			
		||||
	userReq := make([]paramsGroupApplicationListRet, 0)
 | 
			
		||||
	if reply != nil && reply.Data != nil && reply.Data.User != nil {
 | 
			
		||||
		for i := 0; i < len(reply.Data.User); i++ {
 | 
			
		||||
			req := paramsGroupApplicationListRet{}
 | 
			
		||||
			req.ID = reply.Data.User[i].ID
 | 
			
		||||
			req.GroupID = reply.Data.User[i].GroupID
 | 
			
		||||
			req.FromUserID = reply.Data.User[i].FromUserID
 | 
			
		||||
			req.ToUserID = reply.Data.User[i].ToUserID
 | 
			
		||||
			req.Flag = reply.Data.User[i].Flag
 | 
			
		||||
			req.RequestMsg = reply.Data.User[i].RequestMsg
 | 
			
		||||
			req.HandledMsg = reply.Data.User[i].HandledMsg
 | 
			
		||||
			req.AddTime = reply.Data.User[i].AddTime
 | 
			
		||||
			req.FromUserNickname = reply.Data.User[i].FromUserNickname
 | 
			
		||||
			req.ToUserNickname = reply.Data.User[i].ToUserNickname
 | 
			
		||||
			req.FromUserFaceUrl = reply.Data.User[i].FromUserFaceUrl
 | 
			
		||||
			req.ToUserFaceUrl = reply.Data.User[i].ToUserFaceUrl
 | 
			
		||||
			req.HandledUser = reply.Data.User[i].HandledUser
 | 
			
		||||
			req.Type = reply.Data.User[i].Type
 | 
			
		||||
			req.HandleStatus = reply.Data.User[i].HandleStatus
 | 
			
		||||
			req.HandleResult = reply.Data.User[i].HandleResult
 | 
			
		||||
			userReq = append(userReq, req)
 | 
			
		||||
 | 
			
		||||
			if req.Flag == 0 {
 | 
			
		||||
				unProcessCount++
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	c.JSON(http.StatusOK, gin.H{
 | 
			
		||||
		"errCode": reply.ErrCode,
 | 
			
		||||
		"errMsg":  reply.ErrMsg,
 | 
			
		||||
		"data": gin.H{
 | 
			
		||||
			"count": unProcessCount,
 | 
			
		||||
			"user":  userReq,
 | 
			
		||||
		},
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@ -1,67 +0,0 @@
 | 
			
		||||
package group
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	pb "Open_IM/pkg/proto/group"
 | 
			
		||||
	"Open_IM/pkg/common/config"
 | 
			
		||||
	"Open_IM/pkg/common/log"
 | 
			
		||||
	"Open_IM/pkg/grpc-etcdv3/getcdv3"
 | 
			
		||||
	"context"
 | 
			
		||||
	"github.com/gin-gonic/gin"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"strings"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type paramsGetGroupInfo struct {
 | 
			
		||||
	GroupIDList []string `json:"groupIDList" binding:"required"`
 | 
			
		||||
	OperationID string   `json:"operationID" binding:"required"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func GetGroupsInfo(c *gin.Context) {
 | 
			
		||||
	log.Info("", "", "api get groups info init ....")
 | 
			
		||||
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImGroupName)
 | 
			
		||||
	client := pb.NewGroupClient(etcdConn)
 | 
			
		||||
	//defer etcdConn.Close()
 | 
			
		||||
 | 
			
		||||
	params := paramsGetGroupInfo{}
 | 
			
		||||
	if err := c.BindJSON(¶ms); err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	req := &pb.GetGroupsInfoReq{
 | 
			
		||||
		GroupIDList: params.GroupIDList,
 | 
			
		||||
		Token:       c.Request.Header.Get("token"),
 | 
			
		||||
		OperationID: params.OperationID,
 | 
			
		||||
	}
 | 
			
		||||
	log.Info(req.Token, req.OperationID, "get groups info is server,params=%s", req.String())
 | 
			
		||||
	RpcResp, err := client.GetGroupsInfo(context.Background(), req)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Error(req.Token, req.OperationID, "call get groups info rpc server failed,err=%s", err.Error())
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "call  rpc server failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	log.InfoByArgs("call get groups info rpc server success", RpcResp.String())
 | 
			
		||||
	if RpcResp.ErrorCode == 0 {
 | 
			
		||||
		groupsInfo := make([]pb.GroupInfo, 0)
 | 
			
		||||
		for _, v := range RpcResp.Data {
 | 
			
		||||
			var groupInfo pb.GroupInfo
 | 
			
		||||
			groupInfo.GroupId = v.GroupId
 | 
			
		||||
			groupInfo.GroupName = v.GroupName
 | 
			
		||||
			groupInfo.Notification = v.Notification
 | 
			
		||||
			groupInfo.Introduction = v.Introduction
 | 
			
		||||
			groupInfo.FaceUrl = v.FaceUrl
 | 
			
		||||
			groupInfo.CreateTime = v.CreateTime
 | 
			
		||||
			groupInfo.OwnerId = v.OwnerId
 | 
			
		||||
			groupInfo.MemberCount = v.MemberCount
 | 
			
		||||
 | 
			
		||||
			groupsInfo = append(groupsInfo, groupInfo)
 | 
			
		||||
		}
 | 
			
		||||
		c.JSON(http.StatusOK, gin.H{
 | 
			
		||||
			"errCode": RpcResp.ErrorCode,
 | 
			
		||||
			"errMsg":  RpcResp.ErrorMsg,
 | 
			
		||||
			"data":    groupsInfo,
 | 
			
		||||
		})
 | 
			
		||||
	} else {
 | 
			
		||||
		c.JSON(http.StatusOK, gin.H{"errCode": RpcResp.ErrorCode, "errMsg": RpcResp.ErrorMsg})
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
@ -1,351 +1,538 @@
 | 
			
		||||
package group
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	pb "Open_IM/pkg/proto/group"
 | 
			
		||||
	api "Open_IM/pkg/base_info"
 | 
			
		||||
	"Open_IM/pkg/common/config"
 | 
			
		||||
	"Open_IM/pkg/common/log"
 | 
			
		||||
	"Open_IM/pkg/common/token_verify"
 | 
			
		||||
	"Open_IM/pkg/grpc-etcdv3/getcdv3"
 | 
			
		||||
	rpc "Open_IM/pkg/proto/group"
 | 
			
		||||
	open_im_sdk "Open_IM/pkg/proto/sdk_ws"
 | 
			
		||||
	"Open_IM/pkg/utils"
 | 
			
		||||
	"context"
 | 
			
		||||
	"fmt"
 | 
			
		||||
 | 
			
		||||
	"github.com/gin-gonic/gin"
 | 
			
		||||
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	jsonData "Open_IM/internal/utils"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type InviteUserToGroupReq struct {
 | 
			
		||||
	GroupID     string   `json:"groupID" binding:"required"`
 | 
			
		||||
	UidList     []string `json:"uidList" binding:"required"`
 | 
			
		||||
	Reason      string   `json:"reason"`
 | 
			
		||||
	OperationID string   `json:"operationID" binding:"required"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type GetJoinedGroupListReq struct {
 | 
			
		||||
	OperationID string `json:"operationID" binding:"required"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type KickGroupMemberReq struct {
 | 
			
		||||
	GroupID     string                    `json:"groupID"`
 | 
			
		||||
	UidListInfo []*pb.GroupMemberFullInfo `json:"uidListInfo" binding:"required"`
 | 
			
		||||
	Reason      string                    `json:"reason"`
 | 
			
		||||
	OperationID string                    `json:"operationID" binding:"required"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func KickGroupMember(c *gin.Context) {
 | 
			
		||||
	log.Info("", "", "KickGroupMember start....")
 | 
			
		||||
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImGroupName)
 | 
			
		||||
	client := pb.NewGroupClient(etcdConn)
 | 
			
		||||
 | 
			
		||||
	params := KickGroupMemberReq{}
 | 
			
		||||
	params := api.KickGroupMemberReq{}
 | 
			
		||||
	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 := &pb.KickGroupMemberReq{
 | 
			
		||||
		OperationID: params.OperationID,
 | 
			
		||||
		GroupID:     params.GroupID,
 | 
			
		||||
		Token:       c.Request.Header.Get("token"),
 | 
			
		||||
 | 
			
		||||
		UidListInfo: params.UidListInfo,
 | 
			
		||||
	req := &rpc.KickGroupMemberReq{}
 | 
			
		||||
	utils.CopyStructFields(req, ¶ms)
 | 
			
		||||
	var ok bool
 | 
			
		||||
	ok, req.OpUserID = token_verify.GetUserIDFromToken(c.Request.Header.Get("token"))
 | 
			
		||||
	if !ok {
 | 
			
		||||
		log.NewError(req.OperationID, "GetUserIDFromToken false ", c.Request.Header.Get("token"))
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "GetUserIDFromToken failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	log.Info(req.Token, req.OperationID, "recv req: ", req.String())
 | 
			
		||||
 | 
			
		||||
	log.NewInfo(req.OperationID, "KickGroupMember args ", req.String())
 | 
			
		||||
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImGroupName)
 | 
			
		||||
	client := rpc.NewGroupClient(etcdConn)
 | 
			
		||||
	RpcResp, err := client.KickGroupMember(context.Background(), req)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Error(req.Token, req.OperationID, "GetGroupMemberList failed, err: ", err.Error())
 | 
			
		||||
		log.NewError(req.OperationID, "GetGroupMemberList failed ", err.Error(), req.String())
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	type KickGroupMemberResp struct {
 | 
			
		||||
		ErrorCode int32       `json:"errCode"`
 | 
			
		||||
		ErrorMsg  string      `json:"errMsg"`
 | 
			
		||||
		Data      []Id2Result `json:"data"`
 | 
			
		||||
	var memberListResp api.KickGroupMemberResp
 | 
			
		||||
	memberListResp.ErrMsg = RpcResp.ErrMsg
 | 
			
		||||
	memberListResp.ErrCode = RpcResp.ErrCode
 | 
			
		||||
	for _, v := range RpcResp.Id2ResultList {
 | 
			
		||||
		memberListResp.UserIDResultList = append(memberListResp.UserIDResultList, &api.UserIDResult{UserID: v.UserID, Result: v.Result})
 | 
			
		||||
	}
 | 
			
		||||
	if len(memberListResp.UserIDResultList) == 0 {
 | 
			
		||||
		memberListResp.UserIDResultList = []*api.UserIDResult{}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var memberListResp KickGroupMemberResp
 | 
			
		||||
	memberListResp.ErrorMsg = RpcResp.ErrorMsg
 | 
			
		||||
	memberListResp.ErrorCode = RpcResp.ErrorCode
 | 
			
		||||
	for _, v := range RpcResp.Id2Result {
 | 
			
		||||
		memberListResp.Data = append(memberListResp.Data,
 | 
			
		||||
			Id2Result{UId: v.UId,
 | 
			
		||||
				Result: v.Result})
 | 
			
		||||
	}
 | 
			
		||||
	log.NewInfo(req.OperationID, "KickGroupMember api return ", memberListResp)
 | 
			
		||||
	c.JSON(http.StatusOK, memberListResp)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type GetGroupMembersInfoReq struct {
 | 
			
		||||
	GroupID     string   `json:"groupID"`
 | 
			
		||||
	MemberList  []string `json:"memberList"`
 | 
			
		||||
	OperationID string   `json:"operationID"`
 | 
			
		||||
}
 | 
			
		||||
type GetGroupMembersInfoResp struct {
 | 
			
		||||
	ErrorCode int32          `json:"errCode"`
 | 
			
		||||
	ErrorMsg  string         `json:"errMsg"`
 | 
			
		||||
	Data      []MemberResult `json:"data"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func GetGroupMembersInfo(c *gin.Context) {
 | 
			
		||||
	log.Info("", "", "GetGroupMembersInfo start....")
 | 
			
		||||
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImGroupName)
 | 
			
		||||
	client := pb.NewGroupClient(etcdConn)
 | 
			
		||||
 | 
			
		||||
	params := GetGroupMembersInfoReq{}
 | 
			
		||||
	params := api.GetGroupMembersInfoReq{}
 | 
			
		||||
	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 := &pb.GetGroupMembersInfoReq{
 | 
			
		||||
		OperationID: params.OperationID,
 | 
			
		||||
		GroupID:     params.GroupID,
 | 
			
		||||
		MemberList:  params.MemberList,
 | 
			
		||||
		Token:       c.Request.Header.Get("token"),
 | 
			
		||||
	req := &rpc.GetGroupMembersInfoReq{}
 | 
			
		||||
	utils.CopyStructFields(req, params)
 | 
			
		||||
	var ok bool
 | 
			
		||||
	ok, req.OpUserID = token_verify.GetUserIDFromToken(c.Request.Header.Get("token"))
 | 
			
		||||
	if !ok {
 | 
			
		||||
		log.NewError(req.OperationID, "GetUserIDFromToken false ", c.Request.Header.Get("token"))
 | 
			
		||||
		//c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "GetUserIDFromToken failed"})
 | 
			
		||||
		api.SetErrCodeMsg(c, http.StatusInternalServerError)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	log.Info(req.Token, req.OperationID, "recv req: ", len(params.MemberList))
 | 
			
		||||
	log.NewInfo(req.OperationID, "GetGroupMembersInfo args ", req.String())
 | 
			
		||||
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImGroupName)
 | 
			
		||||
	client := rpc.NewGroupClient(etcdConn)
 | 
			
		||||
 | 
			
		||||
	RpcResp, err := client.GetGroupMembersInfo(context.Background(), req)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Error(req.Token, req.OperationID, "GetGroupMemberList failed, err: ", err.Error())
 | 
			
		||||
		log.NewError(req.OperationID, "GetGroupMemberList failed ", err.Error(), req.String())
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var memberListResp GetGroupMembersInfoResp
 | 
			
		||||
	memberListResp.ErrorMsg = RpcResp.ErrorMsg
 | 
			
		||||
	memberListResp.ErrorCode = RpcResp.ErrorCode
 | 
			
		||||
	for _, v := range RpcResp.MemberList {
 | 
			
		||||
		memberListResp.Data = append(memberListResp.Data,
 | 
			
		||||
			MemberResult{GroupId: req.GroupID,
 | 
			
		||||
				UserId:   v.UserId,
 | 
			
		||||
				Role:     v.Role,
 | 
			
		||||
				JoinTime: uint64(v.JoinTime),
 | 
			
		||||
				Nickname: v.NickName,
 | 
			
		||||
				FaceUrl:  v.FaceUrl})
 | 
			
		||||
	}
 | 
			
		||||
	memberListResp := api.GetGroupMembersInfoResp{CommResp: api.CommResp{ErrCode: RpcResp.ErrCode, ErrMsg: RpcResp.ErrMsg}, MemberList: RpcResp.MemberList}
 | 
			
		||||
	memberListResp.Data = jsonData.JsonDataList(RpcResp.MemberList)
 | 
			
		||||
	log.NewInfo(req.OperationID, "GetGroupMembersInfo api return ", memberListResp)
 | 
			
		||||
	c.JSON(http.StatusOK, memberListResp)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type GetGroupMemberListReq struct {
 | 
			
		||||
	GroupID     string `json:"groupID"`
 | 
			
		||||
	Filter      int32  `json:"filter"`
 | 
			
		||||
	NextSeq     int32  `json:"nextSeq"`
 | 
			
		||||
	OperationID string `json:"operationID"`
 | 
			
		||||
}
 | 
			
		||||
type getGroupAllMemberReq struct {
 | 
			
		||||
	GroupID     string `json:"groupID"`
 | 
			
		||||
	OperationID string `json:"operationID"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type MemberResult struct {
 | 
			
		||||
	GroupId  string `json:"groupID"`
 | 
			
		||||
	UserId   string `json:"userId"`
 | 
			
		||||
	Role     int32  `json:"role"`
 | 
			
		||||
	JoinTime uint64 `json:"joinTime"`
 | 
			
		||||
	Nickname string `json:"nickName"`
 | 
			
		||||
	FaceUrl  string `json:"faceUrl"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func GetGroupMemberList(c *gin.Context) {
 | 
			
		||||
	log.Info("", "", "GetGroupMemberList start....")
 | 
			
		||||
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImGroupName)
 | 
			
		||||
	client := pb.NewGroupClient(etcdConn)
 | 
			
		||||
 | 
			
		||||
	params := GetGroupMemberListReq{}
 | 
			
		||||
	params := api.GetGroupMemberListReq{}
 | 
			
		||||
	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 := &pb.GetGroupMemberListReq{
 | 
			
		||||
		OperationID: params.OperationID,
 | 
			
		||||
		Filter:      params.Filter,
 | 
			
		||||
		NextSeq:     params.NextSeq,
 | 
			
		||||
		GroupID:     params.GroupID,
 | 
			
		||||
		Token:       c.Request.Header.Get("token"),
 | 
			
		||||
	req := &rpc.GetGroupMemberListReq{}
 | 
			
		||||
	utils.CopyStructFields(req, params)
 | 
			
		||||
	var ok bool
 | 
			
		||||
	ok, req.OpUserID = token_verify.GetUserIDFromToken(c.Request.Header.Get("token"))
 | 
			
		||||
	if !ok {
 | 
			
		||||
		log.NewError(req.OperationID, "GetUserIDFromToken false ", c.Request.Header.Get("token"))
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "GetUserIDFromToken failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	log.Info(req.Token, req.OperationID, "recv req: ", req.String())
 | 
			
		||||
	log.NewInfo(req.OperationID, "GetGroupMemberList args ", req.String())
 | 
			
		||||
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImGroupName)
 | 
			
		||||
	client := rpc.NewGroupClient(etcdConn)
 | 
			
		||||
 | 
			
		||||
	RpcResp, err := client.GetGroupMemberList(context.Background(), req)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Error(req.Token, req.OperationID, "GetGroupMemberList failed, err: ", err.Error())
 | 
			
		||||
		log.NewError(req.OperationID, "GetGroupMemberList failed, ", err.Error(), req.String())
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	type GetGroupMemberListResp struct {
 | 
			
		||||
		ErrorCode int32          `json:"errCode"`
 | 
			
		||||
		ErrorMsg  string         `json:"errMsg"`
 | 
			
		||||
		NextSeq   int32          `json:"nextSeq"`
 | 
			
		||||
		Data      []MemberResult `json:"data"`
 | 
			
		||||
	}
 | 
			
		||||
	memberListResp := api.GetGroupMemberListResp{CommResp: api.CommResp{ErrCode: RpcResp.ErrCode, ErrMsg: RpcResp.ErrMsg}, MemberList: RpcResp.MemberList, NextSeq: RpcResp.NextSeq}
 | 
			
		||||
	memberListResp.Data = jsonData.JsonDataList(memberListResp.MemberList)
 | 
			
		||||
 | 
			
		||||
	var memberListResp GetGroupMemberListResp
 | 
			
		||||
	memberListResp.ErrorMsg = RpcResp.ErrorMsg
 | 
			
		||||
	memberListResp.ErrorCode = RpcResp.ErrorCode
 | 
			
		||||
	memberListResp.NextSeq = RpcResp.NextSeq
 | 
			
		||||
	for _, v := range RpcResp.MemberList {
 | 
			
		||||
		memberListResp.Data = append(memberListResp.Data,
 | 
			
		||||
			MemberResult{GroupId: req.GroupID,
 | 
			
		||||
				UserId:   v.UserId,
 | 
			
		||||
				Role:     v.Role,
 | 
			
		||||
				JoinTime: uint64(v.JoinTime),
 | 
			
		||||
				Nickname: v.NickName,
 | 
			
		||||
				FaceUrl:  v.FaceUrl})
 | 
			
		||||
	}
 | 
			
		||||
	log.NewInfo(req.OperationID, "GetGroupMemberList api return ", memberListResp)
 | 
			
		||||
	c.JSON(http.StatusOK, memberListResp)
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func GetGroupAllMember(c *gin.Context) {
 | 
			
		||||
	log.Info("", "", "GetGroupAllMember start....")
 | 
			
		||||
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImGroupName)
 | 
			
		||||
	client := pb.NewGroupClient(etcdConn)
 | 
			
		||||
 | 
			
		||||
	params := getGroupAllMemberReq{}
 | 
			
		||||
func GetGroupAllMemberList(c *gin.Context) {
 | 
			
		||||
	params := api.GetGroupAllMemberReq{}
 | 
			
		||||
	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 := &pb.GetGroupAllMemberReq{
 | 
			
		||||
		GroupID:     params.GroupID,
 | 
			
		||||
		OperationID: params.OperationID,
 | 
			
		||||
		Token:       c.Request.Header.Get("token"),
 | 
			
		||||
	req := &rpc.GetGroupAllMemberReq{}
 | 
			
		||||
	utils.CopyStructFields(req, ¶ms)
 | 
			
		||||
	var ok bool
 | 
			
		||||
	ok, req.OpUserID = token_verify.GetUserIDFromToken(c.Request.Header.Get("token"))
 | 
			
		||||
	if !ok {
 | 
			
		||||
		log.NewError(req.OperationID, "GetUserIDFromToken false ", c.Request.Header.Get("token"))
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "GetUserIDFromToken failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	log.Info(req.Token, req.OperationID, "recv req: ", req.String())
 | 
			
		||||
	log.NewInfo(req.OperationID, "GetGroupAllMember args ", req.String())
 | 
			
		||||
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImGroupName)
 | 
			
		||||
	client := rpc.NewGroupClient(etcdConn)
 | 
			
		||||
	RpcResp, err := client.GetGroupAllMember(context.Background(), req)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Error(req.Token, req.OperationID, "GetGroupAllMember failed, err: ", err.Error())
 | 
			
		||||
		log.NewError(req.OperationID, "GetGroupAllMember failed ", err.Error(), req.String())
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	type GetGroupMemberListResp struct {
 | 
			
		||||
		ErrorCode int32          `json:"errCode"`
 | 
			
		||||
		ErrorMsg  string         `json:"errMsg"`
 | 
			
		||||
		Data      []MemberResult `json:"data"`
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var memberListResp GetGroupMemberListResp
 | 
			
		||||
	memberListResp.ErrorMsg = RpcResp.ErrorMsg
 | 
			
		||||
	memberListResp.ErrorCode = RpcResp.ErrorCode
 | 
			
		||||
	for _, v := range RpcResp.MemberList {
 | 
			
		||||
		memberListResp.Data = append(memberListResp.Data,
 | 
			
		||||
			MemberResult{GroupId: req.GroupID,
 | 
			
		||||
				UserId:   v.UserId,
 | 
			
		||||
				Role:     v.Role,
 | 
			
		||||
				JoinTime: uint64(v.JoinTime),
 | 
			
		||||
				Nickname: v.NickName,
 | 
			
		||||
				FaceUrl:  v.FaceUrl})
 | 
			
		||||
	}
 | 
			
		||||
	memberListResp := api.GetGroupAllMemberResp{CommResp: api.CommResp{ErrCode: RpcResp.ErrCode, ErrMsg: RpcResp.ErrMsg}, MemberList: RpcResp.MemberList}
 | 
			
		||||
	memberListResp.Data = jsonData.JsonDataList(memberListResp.MemberList)
 | 
			
		||||
	log.NewInfo(req.OperationID, "GetGroupAllMember api return ", memberListResp)
 | 
			
		||||
	c.JSON(http.StatusOK, memberListResp)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type groupResult struct {
 | 
			
		||||
	GroupId      string `json:"groupId"`
 | 
			
		||||
	GroupName    string `json:"groupName"`
 | 
			
		||||
	Notification string `json:"notification"`
 | 
			
		||||
	Introduction string `json:"introduction"`
 | 
			
		||||
	FaceUrl      string `json:"faceUrl"`
 | 
			
		||||
	OwnerId      string `json:"ownerId"`
 | 
			
		||||
	CreateTime   uint64 `json:"createTime"`
 | 
			
		||||
	MemberCount  uint32 `json:"memberCount"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func GetJoinedGroupList(c *gin.Context) {
 | 
			
		||||
	log.Info("", "", "GetJoinedGroupList start....")
 | 
			
		||||
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImGroupName)
 | 
			
		||||
	fmt.Println("config:    ", etcdConn, config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImGroupName)
 | 
			
		||||
	client := pb.NewGroupClient(etcdConn)
 | 
			
		||||
 | 
			
		||||
	params := GetJoinedGroupListReq{}
 | 
			
		||||
	params := api.GetJoinedGroupListReq{}
 | 
			
		||||
	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 := &pb.GetJoinedGroupListReq{
 | 
			
		||||
		OperationID: params.OperationID,
 | 
			
		||||
		Token:       c.Request.Header.Get("token"),
 | 
			
		||||
	req := &rpc.GetJoinedGroupListReq{}
 | 
			
		||||
	utils.CopyStructFields(req, params)
 | 
			
		||||
	var ok bool
 | 
			
		||||
	ok, req.OpUserID = token_verify.GetUserIDFromToken(c.Request.Header.Get("token"))
 | 
			
		||||
	if !ok {
 | 
			
		||||
		log.NewError(req.OperationID, "GetUserIDFromToken false ", c.Request.Header.Get("token"))
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "GetUserIDFromToken failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	log.Info(req.Token, req.OperationID, "recv req: ", req.String())
 | 
			
		||||
	log.NewInfo(req.OperationID, "GetJoinedGroupList args ", req.String())
 | 
			
		||||
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImGroupName)
 | 
			
		||||
	client := rpc.NewGroupClient(etcdConn)
 | 
			
		||||
	RpcResp, err := client.GetJoinedGroupList(context.Background(), req)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Error(req.Token, req.OperationID, "GetJoinedGroupList failed, err: ", err.Error())
 | 
			
		||||
		log.NewError(req.OperationID, "GetJoinedGroupList failed  ", err.Error(), req.String())
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	log.Info(req.Token, req.OperationID, "GetJoinedGroupList: ", RpcResp)
 | 
			
		||||
 | 
			
		||||
	type GetJoinedGroupListResp struct {
 | 
			
		||||
		ErrorCode int32         `json:"errCode"`
 | 
			
		||||
		ErrorMsg  string        `json:"errMsg"`
 | 
			
		||||
		Data      []groupResult `json:"data"`
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var GroupListResp GetJoinedGroupListResp
 | 
			
		||||
	GroupListResp.ErrorCode = RpcResp.ErrorCode
 | 
			
		||||
	GroupListResp.ErrorMsg = RpcResp.ErrorMsg
 | 
			
		||||
	for _, v := range RpcResp.GroupList {
 | 
			
		||||
		GroupListResp.Data = append(GroupListResp.Data,
 | 
			
		||||
			groupResult{GroupId: v.GroupId, GroupName: v.GroupName,
 | 
			
		||||
				Notification: v.Notification,
 | 
			
		||||
				Introduction: v.Introduction,
 | 
			
		||||
				FaceUrl:      v.FaceUrl,
 | 
			
		||||
				OwnerId:      v.OwnerId,
 | 
			
		||||
				CreateTime:   v.CreateTime,
 | 
			
		||||
				MemberCount:  v.MemberCount})
 | 
			
		||||
	}
 | 
			
		||||
	GroupListResp := api.GetJoinedGroupListResp{CommResp: api.CommResp{ErrCode: RpcResp.ErrCode, ErrMsg: RpcResp.ErrMsg}, GroupInfoList: RpcResp.GroupList}
 | 
			
		||||
	GroupListResp.Data = jsonData.JsonDataList(GroupListResp.GroupInfoList)
 | 
			
		||||
	log.NewInfo(req.OperationID, "GetJoinedGroupList api return ", GroupListResp)
 | 
			
		||||
	c.JSON(http.StatusOK, GroupListResp)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type Id2Result struct {
 | 
			
		||||
	UId    string `json:"uid"`
 | 
			
		||||
	Result int32  `json:"result"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func InviteUserToGroup(c *gin.Context) {
 | 
			
		||||
	log.Info("", "", "InviteUserToGroup start....")
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImGroupName)
 | 
			
		||||
	client := pb.NewGroupClient(etcdConn)
 | 
			
		||||
 | 
			
		||||
	params := InviteUserToGroupReq{}
 | 
			
		||||
	params := api.InviteUserToGroupReq{}
 | 
			
		||||
	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 := &pb.InviteUserToGroupReq{
 | 
			
		||||
		OperationID: params.OperationID,
 | 
			
		||||
		GroupID:     params.GroupID,
 | 
			
		||||
		Reason:      params.Reason,
 | 
			
		||||
		UidList:     params.UidList,
 | 
			
		||||
		Token:       c.Request.Header.Get("token"),
 | 
			
		||||
	req := &rpc.InviteUserToGroupReq{}
 | 
			
		||||
	utils.CopyStructFields(req, ¶ms)
 | 
			
		||||
	var ok bool
 | 
			
		||||
	ok, req.OpUserID = token_verify.GetUserIDFromToken(c.Request.Header.Get("token"))
 | 
			
		||||
	if !ok {
 | 
			
		||||
		log.NewError(req.OperationID, "GetUserIDFromToken false ", c.Request.Header.Get("token"))
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "GetUserIDFromToken failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	log.Info(req.Token, req.OperationID, "recv req: ", req.String())
 | 
			
		||||
	log.NewInfo(req.OperationID, "InviteUserToGroup args ", req.String())
 | 
			
		||||
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImGroupName)
 | 
			
		||||
	client := rpc.NewGroupClient(etcdConn)
 | 
			
		||||
	RpcResp, err := client.InviteUserToGroup(context.Background(), req)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Error(req.Token, req.OperationID, "InviteUserToGroup failed, err: ", err.Error())
 | 
			
		||||
		log.NewError(req.OperationID, "InviteUserToGroup failed ", err.Error(), req.String())
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	type InviteUserToGroupResp struct {
 | 
			
		||||
		ErrorCode int32       `json:"errCode"`
 | 
			
		||||
		ErrorMsg  string      `json:"errMsg"`
 | 
			
		||||
		I2R       []Id2Result `json:"data"`
 | 
			
		||||
	resp := api.InviteUserToGroupResp{CommResp: api.CommResp{ErrCode: RpcResp.ErrCode, ErrMsg: RpcResp.ErrMsg}}
 | 
			
		||||
	for _, v := range RpcResp.Id2ResultList {
 | 
			
		||||
		resp.UserIDResultList = append(resp.UserIDResultList, &api.UserIDResult{UserID: v.UserID, Result: v.Result})
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var iResp InviteUserToGroupResp
 | 
			
		||||
	iResp.ErrorMsg = RpcResp.ErrorMsg
 | 
			
		||||
	iResp.ErrorCode = RpcResp.ErrorCode
 | 
			
		||||
	for _, v := range RpcResp.Id2Result {
 | 
			
		||||
		iResp.I2R = append(iResp.I2R, Id2Result{UId: v.UId, Result: v.Result})
 | 
			
		||||
	if len(resp.UserIDResultList) == 0 {
 | 
			
		||||
		resp.UserIDResultList = *new([]*api.UserIDResult)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	//resp := gin.H{"errCode": RpcResp.ErrorCode, "errMsg": RpcResp.ErrorMsg, "data": RpcResp.Id2Result}
 | 
			
		||||
	c.JSON(http.StatusOK, iResp)
 | 
			
		||||
	log.NewInfo(req.OperationID, "InviteUserToGroup api return ", resp)
 | 
			
		||||
	c.JSON(http.StatusOK, resp)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func CreateGroup(c *gin.Context) {
 | 
			
		||||
	params := api.CreateGroupReq{}
 | 
			
		||||
	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.CreateGroupReq{GroupInfo: &open_im_sdk.GroupInfo{}}
 | 
			
		||||
	utils.CopyStructFields(req.GroupInfo, ¶ms)
 | 
			
		||||
 | 
			
		||||
	for _, v := range params.MemberList {
 | 
			
		||||
		req.InitMemberList = append(req.InitMemberList, &rpc.GroupAddMemberInfo{UserID: v.UserID, RoleLevel: v.RoleLevel})
 | 
			
		||||
	}
 | 
			
		||||
	var ok bool
 | 
			
		||||
	ok, req.OpUserID = token_verify.GetUserIDFromToken(c.Request.Header.Get("token"))
 | 
			
		||||
	if !ok {
 | 
			
		||||
		log.NewError(req.OperationID, "GetUserIDFromToken false ", c.Request.Header.Get("token"))
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "GetUserIDFromToken failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	req.OwnerUserID = req.OpUserID
 | 
			
		||||
	req.OperationID = params.OperationID
 | 
			
		||||
	log.NewInfo(req.OperationID, "CreateGroup args ", req.String())
 | 
			
		||||
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImGroupName)
 | 
			
		||||
	client := rpc.NewGroupClient(etcdConn)
 | 
			
		||||
	RpcResp, err := client.CreateGroup(context.Background(), req)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(req.OperationID, "CreateGroup failed ", err.Error(), req.String())
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "call  rpc server failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	resp := api.CreateGroupResp{CommResp: api.CommResp{ErrCode: RpcResp.ErrCode, ErrMsg: RpcResp.ErrMsg}}
 | 
			
		||||
	if RpcResp.ErrCode == 0 {
 | 
			
		||||
		utils.CopyStructFields(&resp.GroupInfo, RpcResp.GroupInfo)
 | 
			
		||||
		resp.Data = jsonData.JsonDataOne(&resp.GroupInfo)
 | 
			
		||||
	}
 | 
			
		||||
	log.NewInfo(req.OperationID, "CreateGroup api return ", resp)
 | 
			
		||||
	c.JSON(http.StatusOK, resp)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//  群主或管理员收到的
 | 
			
		||||
func GetRecvGroupApplicationList(c *gin.Context) {
 | 
			
		||||
	params := api.GetGroupApplicationListReq{}
 | 
			
		||||
	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.GetGroupApplicationListReq{}
 | 
			
		||||
	utils.CopyStructFields(req, params)
 | 
			
		||||
	//var ok bool
 | 
			
		||||
	//ok, req.OpUserID = token_verify.GetUserIDFromToken(c.Request.Header.Get("token"))
 | 
			
		||||
	//if !ok {
 | 
			
		||||
	//	log.NewError(req.OperationID, "GetUserIDFromToken false ", c.Request.Header.Get("token"))
 | 
			
		||||
	//	c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "GetUserIDFromToken failed"})
 | 
			
		||||
	//	return
 | 
			
		||||
	//}
 | 
			
		||||
	log.NewInfo(req.OperationID, "GetGroupApplicationList args ", req.String())
 | 
			
		||||
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImGroupName)
 | 
			
		||||
	client := rpc.NewGroupClient(etcdConn)
 | 
			
		||||
	reply, err := client.GetGroupApplicationList(context.Background(), req)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(req.OperationID, "GetGroupApplicationList failed ", err.Error(), req.String())
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	resp := api.GetGroupApplicationListResp{CommResp: api.CommResp{ErrCode: reply.ErrCode, ErrMsg: reply.ErrMsg}, GroupRequestList: reply.GroupRequestList}
 | 
			
		||||
	resp.Data = jsonData.JsonDataList(resp.GroupRequestList)
 | 
			
		||||
	log.NewInfo(req.OperationID, "GetGroupApplicationList api return ", resp)
 | 
			
		||||
	c.JSON(http.StatusOK, resp)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func GetUserReqGroupApplicationList(c *gin.Context) {
 | 
			
		||||
	var params api.GetUserReqGroupApplicationListReq
 | 
			
		||||
	if err := c.BindJSON(¶ms); err != nil {
 | 
			
		||||
		log.NewError("0", utils.GetSelfFuncName(), err.Error())
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	req := &rpc.GetUserReqApplicationListReq{}
 | 
			
		||||
	utils.CopyStructFields(req, params)
 | 
			
		||||
	//ok, req.OpUserID := token_verify.GetUserIDFromToken(c.Request.Header.Get("token"))
 | 
			
		||||
	//if !ok {
 | 
			
		||||
	//	log.NewError(req.OperationID, "GetUserIDFromToken false ", c.Request.Header.Get("token"))
 | 
			
		||||
	//	c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "GetUserIDFromToken failed"})
 | 
			
		||||
	//	return
 | 
			
		||||
	//}
 | 
			
		||||
	log.NewInfo(req.OperationID, "GetGroupsInfo args ", req.String())
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImGroupName)
 | 
			
		||||
	client := rpc.NewGroupClient(etcdConn)
 | 
			
		||||
	RpcResp, err := client.GetUserReqApplicationList(context.Background(), req)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(req.OperationID, "GetGroupsInfo failed ", err.Error(), req.String())
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "call  rpc server failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	log.NewInfo(req.OperationID, RpcResp)
 | 
			
		||||
	resp := api.GetGroupApplicationListResp{CommResp: api.CommResp{ErrCode: RpcResp.CommonResp.ErrCode, ErrMsg: RpcResp.CommonResp.ErrMsg}, GroupRequestList: RpcResp.GroupRequestList}
 | 
			
		||||
	log.NewInfo(req.OperationID, "GetGroupApplicationList api return ", resp)
 | 
			
		||||
	resp.Data = jsonData.JsonDataList(resp.GroupRequestList)
 | 
			
		||||
	c.JSON(http.StatusOK, resp)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func GetGroupsInfo(c *gin.Context) {
 | 
			
		||||
	params := api.GetGroupInfoReq{}
 | 
			
		||||
	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.GetGroupsInfoReq{}
 | 
			
		||||
	utils.CopyStructFields(req, ¶ms)
 | 
			
		||||
	var ok bool
 | 
			
		||||
	ok, req.OpUserID = token_verify.GetUserIDFromToken(c.Request.Header.Get("token"))
 | 
			
		||||
	if !ok {
 | 
			
		||||
		log.NewError(req.OperationID, "GetUserIDFromToken false ", c.Request.Header.Get("token"))
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "GetUserIDFromToken failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	log.NewInfo(req.OperationID, "GetGroupsInfo args ", req.String())
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImGroupName)
 | 
			
		||||
	client := rpc.NewGroupClient(etcdConn)
 | 
			
		||||
	RpcResp, err := client.GetGroupsInfo(context.Background(), req)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(req.OperationID, "GetGroupsInfo failed ", err.Error(), req.String())
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "call  rpc server failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	resp := api.GetGroupInfoResp{CommResp: api.CommResp{ErrCode: RpcResp.ErrCode, ErrMsg: RpcResp.ErrMsg}, GroupInfoList: RpcResp.GroupInfoList}
 | 
			
		||||
	resp.Data = jsonData.JsonDataList(resp.GroupInfoList)
 | 
			
		||||
	log.NewInfo(req.OperationID, "GetGroupsInfo api return ", resp)
 | 
			
		||||
	c.JSON(http.StatusOK, resp)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//process application
 | 
			
		||||
func ApplicationGroupResponse(c *gin.Context) {
 | 
			
		||||
	params := api.ApplicationGroupResponseReq{}
 | 
			
		||||
	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.GroupApplicationResponseReq{}
 | 
			
		||||
	utils.CopyStructFields(req, ¶ms)
 | 
			
		||||
	var ok bool
 | 
			
		||||
	ok, req.OpUserID = token_verify.GetUserIDFromToken(c.Request.Header.Get("token"))
 | 
			
		||||
	if !ok {
 | 
			
		||||
		log.NewError(req.OperationID, "GetUserIDFromToken false ", c.Request.Header.Get("token"))
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "GetUserIDFromToken failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	log.NewInfo(req.OperationID, "ApplicationGroupResponse args ", req.String())
 | 
			
		||||
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImGroupName)
 | 
			
		||||
	client := rpc.NewGroupClient(etcdConn)
 | 
			
		||||
	reply, err := client.GroupApplicationResponse(context.Background(), req)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(req.OperationID, "GroupApplicationResponse failed ", req.String())
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	resp := api.ApplicationGroupResponseResp{CommResp: api.CommResp{ErrCode: reply.CommonResp.ErrCode, ErrMsg: reply.CommonResp.ErrMsg}}
 | 
			
		||||
	log.NewInfo(req.OperationID, "ApplicationGroupResponse api return ", resp)
 | 
			
		||||
	c.JSON(http.StatusOK, resp)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func JoinGroup(c *gin.Context) {
 | 
			
		||||
	params := api.JoinGroupReq{}
 | 
			
		||||
	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.JoinGroupReq{}
 | 
			
		||||
	utils.CopyStructFields(req, params)
 | 
			
		||||
	var ok bool
 | 
			
		||||
	ok, req.OpUserID = token_verify.GetUserIDFromToken(c.Request.Header.Get("token"))
 | 
			
		||||
	if !ok {
 | 
			
		||||
		log.NewError(req.OperationID, "GetUserIDFromToken false ", c.Request.Header.Get("token"))
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "GetUserIDFromToken failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	log.NewInfo(req.OperationID, "JoinGroup args ", req.String())
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImGroupName)
 | 
			
		||||
	client := rpc.NewGroupClient(etcdConn)
 | 
			
		||||
 | 
			
		||||
	RpcResp, err := client.JoinGroup(context.Background(), req)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(req.OperationID, "JoinGroup failed ", err.Error(), req.String())
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "call  rpc server failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	resp := api.CommResp{ErrCode: RpcResp.CommonResp.ErrCode, ErrMsg: RpcResp.CommonResp.ErrMsg}
 | 
			
		||||
	log.NewInfo(req.OperationID, "JoinGroup api return", RpcResp.String())
 | 
			
		||||
	c.JSON(http.StatusOK, resp)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func QuitGroup(c *gin.Context) {
 | 
			
		||||
	params := api.QuitGroupReq{}
 | 
			
		||||
	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.QuitGroupReq{}
 | 
			
		||||
	utils.CopyStructFields(req, ¶ms)
 | 
			
		||||
	var ok bool
 | 
			
		||||
	ok, req.OpUserID = token_verify.GetUserIDFromToken(c.Request.Header.Get("token"))
 | 
			
		||||
	if !ok {
 | 
			
		||||
		log.NewError(req.OperationID, "GetUserIDFromToken false ", c.Request.Header.Get("token"))
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "GetUserIDFromToken failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	log.NewInfo(req.OperationID, "QuitGroup args ", req.String())
 | 
			
		||||
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImGroupName)
 | 
			
		||||
	client := rpc.NewGroupClient(etcdConn)
 | 
			
		||||
	RpcResp, err := client.QuitGroup(context.Background(), req)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(req.OperationID, "call quit group rpc server failed,err=%s", err.Error())
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "call  rpc server failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	resp := api.CommResp{ErrCode: RpcResp.CommonResp.ErrCode, ErrMsg: RpcResp.CommonResp.ErrMsg}
 | 
			
		||||
	log.NewInfo(req.OperationID, "QuitGroup api return", RpcResp.String())
 | 
			
		||||
	c.JSON(http.StatusOK, resp)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SetGroupInfo(c *gin.Context) {
 | 
			
		||||
	params := api.SetGroupInfoReq{}
 | 
			
		||||
	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.SetGroupInfoReq{GroupInfo: &open_im_sdk.GroupInfo{}}
 | 
			
		||||
	utils.CopyStructFields(req.GroupInfo, ¶ms)
 | 
			
		||||
	req.OperationID = params.OperationID
 | 
			
		||||
	var ok bool
 | 
			
		||||
	ok, req.OpUserID = token_verify.GetUserIDFromToken(c.Request.Header.Get("token"))
 | 
			
		||||
	if !ok {
 | 
			
		||||
		log.NewError(req.OperationID, "GetUserIDFromToken false ", c.Request.Header.Get("token"))
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "GetUserIDFromToken failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	log.NewInfo(req.OperationID, "SetGroupInfo args ", req.String())
 | 
			
		||||
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImGroupName)
 | 
			
		||||
	client := rpc.NewGroupClient(etcdConn)
 | 
			
		||||
	RpcResp, err := client.SetGroupInfo(context.Background(), req)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(req.OperationID, "SetGroupInfo failed ", err.Error(), req.String())
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "call  rpc server failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	resp := api.SetGroupInfoResp{CommResp: api.CommResp{ErrCode: RpcResp.CommonResp.ErrCode, ErrMsg: RpcResp.CommonResp.ErrMsg}}
 | 
			
		||||
	c.JSON(http.StatusOK, resp)
 | 
			
		||||
	log.NewInfo(req.OperationID, "SetGroupInfo api return ", resp)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TransferGroupOwner(c *gin.Context) {
 | 
			
		||||
	params := api.TransferGroupOwnerReq{}
 | 
			
		||||
	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.TransferGroupOwnerReq{}
 | 
			
		||||
	utils.CopyStructFields(req, ¶ms)
 | 
			
		||||
	var ok bool
 | 
			
		||||
	ok, req.OpUserID = token_verify.GetUserIDFromToken(c.Request.Header.Get("token"))
 | 
			
		||||
	if !ok {
 | 
			
		||||
		log.NewError(req.OperationID, "GetUserIDFromToken false ", c.Request.Header.Get("token"))
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "GetUserIDFromToken failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	log.NewInfo(req.OperationID, "TransferGroupOwner args ", req.String())
 | 
			
		||||
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImGroupName)
 | 
			
		||||
	client := rpc.NewGroupClient(etcdConn)
 | 
			
		||||
	reply, err := client.TransferGroupOwner(context.Background(), req)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(req.OperationID, "TransferGroupOwner failed ", req.String())
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	resp := api.TransferGroupOwnerResp{CommResp: api.CommResp{ErrCode: reply.CommonResp.ErrCode, ErrMsg: reply.CommonResp.ErrMsg}}
 | 
			
		||||
	log.NewInfo(req.OperationID, "TransferGroupOwner api return ", resp)
 | 
			
		||||
	c.JSON(http.StatusOK, resp)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1,87 +0,0 @@
 | 
			
		||||
package group
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"Open_IM/pkg/common/config"
 | 
			
		||||
	"Open_IM/pkg/common/log"
 | 
			
		||||
	"Open_IM/pkg/grpc-etcdv3/getcdv3"
 | 
			
		||||
	"Open_IM/pkg/proto/group"
 | 
			
		||||
	"Open_IM/pkg/utils"
 | 
			
		||||
	"context"
 | 
			
		||||
	"github.com/gin-gonic/gin"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"strings"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type paramsGroupApplicationResponse struct {
 | 
			
		||||
	OperationID      string `json:"operationID" binding:"required"`
 | 
			
		||||
	GroupID          string `json:"groupID" binding:"required"`
 | 
			
		||||
	FromUserID       string `json:"fromUserID" binding:"required"`
 | 
			
		||||
	FromUserNickName string `json:"fromUserNickName"`
 | 
			
		||||
	FromUserFaceUrl  string `json:"fromUserFaceUrl"`
 | 
			
		||||
	ToUserID         string `json:"toUserID" binding:"required"`
 | 
			
		||||
	ToUserNickName   string `json:"toUserNickName"`
 | 
			
		||||
	ToUserFaceUrl    string `json:"toUserFaceUrl"`
 | 
			
		||||
	AddTime          int64  `json:"addTime"`
 | 
			
		||||
	RequestMsg       string `json:"requestMsg"`
 | 
			
		||||
	HandledMsg       string `json:"handledMsg"`
 | 
			
		||||
	Type             int32  `json:"type"`
 | 
			
		||||
	HandleStatus     int32  `json:"handleStatus"`
 | 
			
		||||
	HandleResult     int32  `json:"handleResult"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func newGroupApplicationResponse(params *paramsGroupApplicationResponse) *group.GroupApplicationResponseReq {
 | 
			
		||||
	pbData := group.GroupApplicationResponseReq{
 | 
			
		||||
		OperationID:      params.OperationID,
 | 
			
		||||
		GroupID:          params.GroupID,
 | 
			
		||||
		FromUserID:       params.FromUserID,
 | 
			
		||||
		FromUserNickName: params.FromUserNickName,
 | 
			
		||||
		FromUserFaceUrl:  params.FromUserFaceUrl,
 | 
			
		||||
		ToUserID:         params.ToUserID,
 | 
			
		||||
		ToUserNickName:   params.ToUserNickName,
 | 
			
		||||
		ToUserFaceUrl:    params.ToUserFaceUrl,
 | 
			
		||||
		AddTime:          params.AddTime,
 | 
			
		||||
		RequestMsg:       params.RequestMsg,
 | 
			
		||||
		HandledMsg:       params.HandledMsg,
 | 
			
		||||
		Type:             params.Type,
 | 
			
		||||
		HandleStatus:     params.HandleStatus,
 | 
			
		||||
		HandleResult:     params.HandleResult,
 | 
			
		||||
	}
 | 
			
		||||
	return &pbData
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func ApplicationGroupResponse(c *gin.Context) {
 | 
			
		||||
	log.Info("", "", "api GroupApplicationResponse init ....")
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImGroupName)
 | 
			
		||||
	client := group.NewGroupClient(etcdConn)
 | 
			
		||||
	//defer etcdConn.Close()
 | 
			
		||||
 | 
			
		||||
	params := paramsGroupApplicationResponse{}
 | 
			
		||||
	if err := c.BindJSON(¶ms); err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	pbData := newGroupApplicationResponse(¶ms)
 | 
			
		||||
 | 
			
		||||
	token := c.Request.Header.Get("token")
 | 
			
		||||
	if claims, err := utils.ParseToken(token); err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": "token validate err"})
 | 
			
		||||
		return
 | 
			
		||||
	} else {
 | 
			
		||||
		pbData.OwnerID = claims.UID
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	log.Info("", "", "api GroupApplicationResponse is server, [data: %s]", pbData.String())
 | 
			
		||||
	reply, err := client.GroupApplicationResponse(context.Background(), pbData)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Error("", "", "api GroupApplicationResponse call rpc fail, [data: %s] [err: %s]", pbData.String(), err.Error())
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	log.Info("", "", "api GroupApplicationResponse call rpc success, [data: %s] [reply: %s]", pbData.String(), reply.String())
 | 
			
		||||
 | 
			
		||||
	c.JSON(http.StatusOK, gin.H{
 | 
			
		||||
		"errCode": reply.ErrCode,
 | 
			
		||||
		"errMsg":  reply.ErrMsg,
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@ -1,47 +0,0 @@
 | 
			
		||||
package group
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	pb "Open_IM/pkg/proto/group"
 | 
			
		||||
	"Open_IM/pkg/common/config"
 | 
			
		||||
	"Open_IM/pkg/common/log"
 | 
			
		||||
	"Open_IM/pkg/grpc-etcdv3/getcdv3"
 | 
			
		||||
	"context"
 | 
			
		||||
	"github.com/gin-gonic/gin"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"strings"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type paramsJoinGroup struct {
 | 
			
		||||
	GroupID     string `json:"groupID" binding:"required"`
 | 
			
		||||
	Message     string `json:"message"`
 | 
			
		||||
	OperationID string `json:"operationID" binding:"required"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func JoinGroup(c *gin.Context) {
 | 
			
		||||
	log.Info("", "", "api join group init....")
 | 
			
		||||
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImGroupName)
 | 
			
		||||
	client := pb.NewGroupClient(etcdConn)
 | 
			
		||||
	//defer etcdConn.Close()
 | 
			
		||||
 | 
			
		||||
	params := paramsJoinGroup{}
 | 
			
		||||
	if err := c.BindJSON(¶ms); err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	req := &pb.JoinGroupReq{
 | 
			
		||||
		GroupID:     params.GroupID,
 | 
			
		||||
		Message:     params.Message,
 | 
			
		||||
		Token:       c.Request.Header.Get("token"),
 | 
			
		||||
		OperationID: params.OperationID,
 | 
			
		||||
	}
 | 
			
		||||
	log.Info(req.Token, req.OperationID, "api join group is server,params=%s", req.String())
 | 
			
		||||
	RpcResp, err := client.JoinGroup(context.Background(), req)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Error(req.Token, req.OperationID, "call join group  rpc server failed,err=%s", err.Error())
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "call  rpc server failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	log.InfoByArgs("call join group rpc server success,args=%s", RpcResp.String())
 | 
			
		||||
	c.JSON(http.StatusOK, gin.H{"errCode": RpcResp.ErrorCode, "errMsg": RpcResp.ErrorMsg})
 | 
			
		||||
}
 | 
			
		||||
@ -1,46 +0,0 @@
 | 
			
		||||
package group
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	pb "Open_IM/pkg/proto/group"
 | 
			
		||||
	"Open_IM/pkg/common/config"
 | 
			
		||||
	"Open_IM/pkg/common/log"
 | 
			
		||||
	"Open_IM/pkg/grpc-etcdv3/getcdv3"
 | 
			
		||||
	"context"
 | 
			
		||||
	"github.com/gin-gonic/gin"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"strings"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type paramsQuitGroup struct {
 | 
			
		||||
	GroupID     string `json:"groupID" binding:"required"`
 | 
			
		||||
	OperationID string `json:"operationID" binding:"required"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func QuitGroup(c *gin.Context) {
 | 
			
		||||
	log.Info("", "", "api quit group init ....")
 | 
			
		||||
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImGroupName)
 | 
			
		||||
	client := pb.NewGroupClient(etcdConn)
 | 
			
		||||
	//defer etcdConn.Close()
 | 
			
		||||
 | 
			
		||||
	params := paramsQuitGroup{}
 | 
			
		||||
	if err := c.BindJSON(¶ms); err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	req := &pb.QuitGroupReq{
 | 
			
		||||
		GroupID:     params.GroupID,
 | 
			
		||||
		OperationID: params.OperationID,
 | 
			
		||||
		Token:       c.Request.Header.Get("token"),
 | 
			
		||||
	}
 | 
			
		||||
	log.Info(req.Token, req.OperationID, "api quit group is server,params=%s", req.String())
 | 
			
		||||
	RpcResp, err := client.QuitGroup(context.Background(), req)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Error(req.Token, req.OperationID, "call quit group rpc server failed,err=%s", err.Error())
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "call  rpc server failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	log.InfoByArgs("call quit group rpc server success,args=%s", RpcResp.String())
 | 
			
		||||
	c.JSON(http.StatusOK, gin.H{"errCode": RpcResp.ErrorCode, "errMsg": RpcResp.ErrorMsg})
 | 
			
		||||
	log.InfoByArgs("api quit group success return,get args=%s,return args=%s", req.String(), RpcResp.String())
 | 
			
		||||
}
 | 
			
		||||
@ -1,53 +0,0 @@
 | 
			
		||||
package group
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	pb "Open_IM/pkg/proto/group"
 | 
			
		||||
	"Open_IM/pkg/common/config"
 | 
			
		||||
	"Open_IM/pkg/common/log"
 | 
			
		||||
	"Open_IM/pkg/grpc-etcdv3/getcdv3"
 | 
			
		||||
	"context"
 | 
			
		||||
	"github.com/gin-gonic/gin"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"strings"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type paramsSetGroupInfo struct {
 | 
			
		||||
	GroupID      string `json:"groupId"  binding:"required"`
 | 
			
		||||
	GroupName    string `json:"groupName"`
 | 
			
		||||
	Notification string `json:"notification"`
 | 
			
		||||
	Introduction string `json:"introduction"`
 | 
			
		||||
	FaceUrl      string `json:"faceUrl"`
 | 
			
		||||
	OperationID  string `json:"operationID"  binding:"required"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SetGroupInfo(c *gin.Context) {
 | 
			
		||||
	log.Info("", "", "api set group info init...")
 | 
			
		||||
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImGroupName)
 | 
			
		||||
	client := pb.NewGroupClient(etcdConn)
 | 
			
		||||
	//defer etcdConn.Close()
 | 
			
		||||
 | 
			
		||||
	params := paramsSetGroupInfo{}
 | 
			
		||||
	if err := c.BindJSON(¶ms); err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	req := &pb.SetGroupInfoReq{
 | 
			
		||||
		GroupID:      params.GroupID,
 | 
			
		||||
		GroupName:    params.GroupName,
 | 
			
		||||
		Notification: params.Notification,
 | 
			
		||||
		Introduction: params.Introduction,
 | 
			
		||||
		FaceUrl:      params.FaceUrl,
 | 
			
		||||
		Token:        c.Request.Header.Get("token"),
 | 
			
		||||
		OperationID:  params.OperationID,
 | 
			
		||||
	}
 | 
			
		||||
	log.Info(req.Token, req.OperationID, "api set group info is server,params=%s", req.String())
 | 
			
		||||
	RpcResp, err := client.SetGroupInfo(context.Background(), req)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Error(req.Token, req.OperationID, "call set group info rpc server failed,err=%s", err.Error())
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "call  rpc server failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	log.InfoByArgs("call set group info rpc server success,args=%s", RpcResp.String())
 | 
			
		||||
	c.JSON(http.StatusOK, gin.H{"errCode": RpcResp.ErrorCode, "errMsg": RpcResp.ErrorMsg})
 | 
			
		||||
}
 | 
			
		||||
@ -1,65 +0,0 @@
 | 
			
		||||
package group
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"Open_IM/pkg/common/config"
 | 
			
		||||
	"Open_IM/pkg/common/log"
 | 
			
		||||
	"Open_IM/pkg/grpc-etcdv3/getcdv3"
 | 
			
		||||
	"Open_IM/pkg/proto/group"
 | 
			
		||||
	"Open_IM/pkg/utils"
 | 
			
		||||
	"context"
 | 
			
		||||
	"github.com/gin-gonic/gin"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"strings"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type paramsTransferGroupOwner struct {
 | 
			
		||||
	OperationID string `json:"operationID" binding:"required"`
 | 
			
		||||
	GroupID     string `json:"groupID" binding:"required"`
 | 
			
		||||
	UID         string `json:"uid" binding:"required"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func newTransferGroupOwnerReq(params *paramsTransferGroupOwner) *group.TransferGroupOwnerReq {
 | 
			
		||||
	pbData := group.TransferGroupOwnerReq{
 | 
			
		||||
		OperationID: params.OperationID,
 | 
			
		||||
		GroupID:     params.GroupID,
 | 
			
		||||
		NewOwner:    params.UID,
 | 
			
		||||
	}
 | 
			
		||||
	return &pbData
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TransferGroupOwner(c *gin.Context) {
 | 
			
		||||
	log.Info("", "", "api TransferGroupOwner init ....")
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImGroupName)
 | 
			
		||||
	client := group.NewGroupClient(etcdConn)
 | 
			
		||||
	//defer etcdConn.Close()
 | 
			
		||||
 | 
			
		||||
	params := paramsTransferGroupOwner{}
 | 
			
		||||
	if err := c.BindJSON(¶ms); err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	pbData := newTransferGroupOwnerReq(¶ms)
 | 
			
		||||
 | 
			
		||||
	token := c.Request.Header.Get("token")
 | 
			
		||||
	if claims, err := utils.ParseToken(token); err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": "token validate err"})
 | 
			
		||||
		return
 | 
			
		||||
	} else {
 | 
			
		||||
		pbData.OldOwner = claims.UID
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	log.Info("", "", "api TransferGroupOwner is server, [data: %s]", pbData.String())
 | 
			
		||||
	reply, err := client.TransferGroupOwner(context.Background(), pbData)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Error("", "", "api TransferGroupOwner call rpc fail, [data: %s] [err: %s]", pbData.String(), err.Error())
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	log.Info("", "", "api TransferGroupOwner call rpc success, [data: %s] [reply: %s]", pbData.String(), reply.String())
 | 
			
		||||
 | 
			
		||||
	c.JSON(http.StatusOK, gin.H{
 | 
			
		||||
		"errCode": reply.ErrCode,
 | 
			
		||||
		"errMsg":  reply.ErrMsg,
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@ -7,11 +7,15 @@
 | 
			
		||||
package manage
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	api "Open_IM/pkg/base_info"
 | 
			
		||||
	"Open_IM/pkg/common/config"
 | 
			
		||||
	"Open_IM/pkg/common/constant"
 | 
			
		||||
	"Open_IM/pkg/common/log"
 | 
			
		||||
	"Open_IM/pkg/common/token_verify"
 | 
			
		||||
	"Open_IM/pkg/grpc-etcdv3/getcdv3"
 | 
			
		||||
	pbChat "Open_IM/pkg/proto/chat"
 | 
			
		||||
	"Open_IM/pkg/proto/sdk_ws"
 | 
			
		||||
	open_im_sdk "Open_IM/pkg/proto/sdk_ws"
 | 
			
		||||
	"Open_IM/pkg/utils"
 | 
			
		||||
	"context"
 | 
			
		||||
	"github.com/gin-gonic/gin"
 | 
			
		||||
@ -23,19 +27,7 @@ import (
 | 
			
		||||
 | 
			
		||||
var validate *validator.Validate
 | 
			
		||||
 | 
			
		||||
type paramsManagementSendMsg struct {
 | 
			
		||||
	OperationID    string                 `json:"operationID" binding:"required"`
 | 
			
		||||
	SendID         string                 `json:"sendID" binding:"required"`
 | 
			
		||||
	RecvID         string                 `json:"recvID" binding:"required"`
 | 
			
		||||
	SenderNickName string                 `json:"senderNickName" `
 | 
			
		||||
	SenderFaceURL  string                 `json:"senderFaceURL" `
 | 
			
		||||
	ForceList      []string               `json:"forceList" `
 | 
			
		||||
	Content        map[string]interface{} `json:"content" binding:"required"`
 | 
			
		||||
	ContentType    int32                  `json:"contentType" binding:"required"`
 | 
			
		||||
	SessionType    int32                  `json:"sessionType" binding:"required"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func newUserSendMsgReq(params *paramsManagementSendMsg) *pbChat.UserSendMsgReq {
 | 
			
		||||
func newUserSendMsgReq(params *ManagementSendMsgReq) *pbChat.SendMsgReq {
 | 
			
		||||
	var newContent string
 | 
			
		||||
	switch params.ContentType {
 | 
			
		||||
	case constant.Text:
 | 
			
		||||
@ -49,31 +41,44 @@ func newUserSendMsgReq(params *paramsManagementSendMsg) *pbChat.UserSendMsgReq {
 | 
			
		||||
	case constant.File:
 | 
			
		||||
		newContent = utils.StructToJsonString(params.Content)
 | 
			
		||||
	default:
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
	pbData := pbChat.UserSendMsgReq{
 | 
			
		||||
		ReqIdentifier:  constant.WSSendMsg,
 | 
			
		||||
		SendID:         params.SendID,
 | 
			
		||||
		SenderNickName: params.SenderNickName,
 | 
			
		||||
		SenderFaceURL:  params.SenderFaceURL,
 | 
			
		||||
		OperationID:    params.OperationID,
 | 
			
		||||
		PlatformID:     0,
 | 
			
		||||
		SessionType:    params.SessionType,
 | 
			
		||||
		MsgFrom:        constant.UserMsgType,
 | 
			
		||||
		ContentType:    params.ContentType,
 | 
			
		||||
		RecvID:         params.RecvID,
 | 
			
		||||
		ForceList:      params.ForceList,
 | 
			
		||||
		Content:        newContent,
 | 
			
		||||
		ClientMsgID:    utils.GetMsgID(params.SendID),
 | 
			
		||||
	var options map[string]bool
 | 
			
		||||
	if params.IsOnlineOnly {
 | 
			
		||||
		options = make(map[string]bool, 5)
 | 
			
		||||
		utils.SetSwitchFromOptions(options, constant.IsOfflinePush, false)
 | 
			
		||||
		utils.SetSwitchFromOptions(options, constant.IsHistory, false)
 | 
			
		||||
		utils.SetSwitchFromOptions(options, constant.IsPersistent, false)
 | 
			
		||||
		utils.SetSwitchFromOptions(options, constant.IsSenderSync, false)
 | 
			
		||||
	}
 | 
			
		||||
	pbData := pbChat.SendMsgReq{
 | 
			
		||||
		OperationID: params.OperationID,
 | 
			
		||||
		MsgData: &open_im_sdk.MsgData{
 | 
			
		||||
			SendID:           params.SendID,
 | 
			
		||||
			RecvID:           params.RecvID,
 | 
			
		||||
			GroupID:          params.GroupID,
 | 
			
		||||
			ClientMsgID:      utils.GetMsgID(params.SendID),
 | 
			
		||||
			SenderPlatformID: params.SenderPlatformID,
 | 
			
		||||
			SenderNickname:   params.SenderNickname,
 | 
			
		||||
			SenderFaceURL:    params.SenderFaceURL,
 | 
			
		||||
			SessionType:      params.SessionType,
 | 
			
		||||
			MsgFrom:          constant.SysMsgType,
 | 
			
		||||
			ContentType:      params.ContentType,
 | 
			
		||||
			Content:          []byte(newContent),
 | 
			
		||||
			//	ForceList:        params.ForceList,
 | 
			
		||||
			CreateTime:      utils.GetCurrentTimestampByMill(),
 | 
			
		||||
			Options:         options,
 | 
			
		||||
			OfflinePushInfo: params.OfflinePushInfo,
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
	return &pbData
 | 
			
		||||
}
 | 
			
		||||
func init() {
 | 
			
		||||
	validate = validator.New()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func ManagementSendMsg(c *gin.Context) {
 | 
			
		||||
	var data interface{}
 | 
			
		||||
	params := paramsManagementSendMsg{}
 | 
			
		||||
	params := ManagementSendMsgReq{}
 | 
			
		||||
	if err := c.BindJSON(¶ms); err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()})
 | 
			
		||||
		log.ErrorByKv("json unmarshal err", c.PostForm("operationID"), "err", err.Error(), "content", c.PostForm("content"))
 | 
			
		||||
@ -84,8 +89,24 @@ func ManagementSendMsg(c *gin.Context) {
 | 
			
		||||
		data = TextElem{}
 | 
			
		||||
	case constant.Picture:
 | 
			
		||||
		data = PictureElem{}
 | 
			
		||||
	case constant.Voice:
 | 
			
		||||
		data = SoundElem{}
 | 
			
		||||
	case constant.Video:
 | 
			
		||||
		data = VideoElem{}
 | 
			
		||||
	case constant.File:
 | 
			
		||||
		data = FileElem{}
 | 
			
		||||
	//case constant.AtText:
 | 
			
		||||
	//	data = AtElem{}
 | 
			
		||||
	//case constant.Merger:
 | 
			
		||||
	//	data =
 | 
			
		||||
	//case constant.Card:
 | 
			
		||||
	//case constant.Location:
 | 
			
		||||
	case constant.Custom:
 | 
			
		||||
		data = CustomElem{}
 | 
			
		||||
	//case constant.Revoke:
 | 
			
		||||
	//case constant.HasReadReceipt:
 | 
			
		||||
	//case constant.Typing:
 | 
			
		||||
	//case constant.Quote:
 | 
			
		||||
	default:
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"errCode": 404, "errMsg": "contentType err"})
 | 
			
		||||
		log.ErrorByKv("contentType err", c.PostForm("operationID"), "content", c.PostForm("content"))
 | 
			
		||||
@ -102,7 +123,7 @@ func ManagementSendMsg(c *gin.Context) {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	token := c.Request.Header.Get("token")
 | 
			
		||||
	claims, err := utils.ParseToken(token)
 | 
			
		||||
	claims, err := token_verify.ParseToken(token)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(params.OperationID, "parse token failed", err.Error())
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": "parse token failed", "sendTime": 0, "MsgID": ""})
 | 
			
		||||
@ -111,6 +132,19 @@ func ManagementSendMsg(c *gin.Context) {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": "not authorized", "sendTime": 0, "MsgID": ""})
 | 
			
		||||
		return
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
	switch params.SessionType {
 | 
			
		||||
	case constant.SingleChatType:
 | 
			
		||||
		if len(params.RecvID) == 0 {
 | 
			
		||||
			log.NewError(params.OperationID, "recvID is a null string")
 | 
			
		||||
			c.JSON(http.StatusBadRequest, gin.H{"errCode": 405, "errMsg": "recvID is a null string", "sendTime": 0, "MsgID": ""})
 | 
			
		||||
		}
 | 
			
		||||
	case constant.GroupChatType:
 | 
			
		||||
		if len(params.GroupID) == 0 {
 | 
			
		||||
			log.NewError(params.OperationID, "groupID is a null string")
 | 
			
		||||
			c.JSON(http.StatusBadRequest, gin.H{"errCode": 405, "errMsg": "groupID is a null string", "sendTime": 0, "MsgID": ""})
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
	log.InfoByKv("Ws call success to ManagementSendMsgReq", params.OperationID, "Parameters", params)
 | 
			
		||||
 | 
			
		||||
@ -122,16 +156,44 @@ func ManagementSendMsg(c *gin.Context) {
 | 
			
		||||
 | 
			
		||||
	log.Info("", "", "api ManagementSendMsg call, api call rpc...")
 | 
			
		||||
 | 
			
		||||
	reply, _ := client.UserSendMsg(context.Background(), pbData)
 | 
			
		||||
	log.Info("", "", "api ManagementSendMsg call end..., [data: %s] [reply: %s]", pbData.String(), reply.String())
 | 
			
		||||
	RpcResp, err := client.SendMsg(context.Background(), pbData)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(params.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("", "", "api ManagementSendMsg call end..., [data: %s] [reply: %s]", pbData.String(), RpcResp.String())
 | 
			
		||||
	resp := api.ManagementSendMsgResp{CommResp: api.CommResp{ErrCode: RpcResp.ErrCode, ErrMsg: RpcResp.ErrMsg}, ResultList: server_api_params.UserSendMsgResp{ServerMsgID: RpcResp.ServerMsgID, ClientMsgID: RpcResp.ClientMsgID, SendTime: RpcResp.SendTime}}
 | 
			
		||||
	log.Info(params.OperationID, "ManagementSendMsg return", resp)
 | 
			
		||||
	c.JSON(http.StatusOK, resp)
 | 
			
		||||
 | 
			
		||||
	c.JSON(http.StatusOK, gin.H{
 | 
			
		||||
		"errCode":  reply.ErrCode,
 | 
			
		||||
		"errMsg":   reply.ErrMsg,
 | 
			
		||||
		"sendTime": reply.SendTime,
 | 
			
		||||
		"msgID":    reply.ClientMsgID,
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//type MergeElem struct {
 | 
			
		||||
//	Title        string       `json:"title"`
 | 
			
		||||
//	AbstractList []string     `json:"abstractList"`
 | 
			
		||||
//	MultiMessage []*MsgStruct `json:"multiMessage"`
 | 
			
		||||
//}
 | 
			
		||||
//
 | 
			
		||||
//type QuoteElem struct {
 | 
			
		||||
//	Text         string     `json:"text"`
 | 
			
		||||
//	QuoteMessage *MsgStruct `json:"quoteMessage"`
 | 
			
		||||
//}
 | 
			
		||||
type ManagementSendMsgReq struct {
 | 
			
		||||
	OperationID      string                       `json:"operationID" binding:"required"`
 | 
			
		||||
	SendID           string                       `json:"sendID" binding:"required"`
 | 
			
		||||
	RecvID           string                       `json:"recvID" `
 | 
			
		||||
	GroupID          string                       `json:"groupID" `
 | 
			
		||||
	SenderNickname   string                       `json:"senderNickname" `
 | 
			
		||||
	SenderFaceURL    string                       `json:"senderFaceURL" `
 | 
			
		||||
	SenderPlatformID int32                        `json:"senderPlatformID"`
 | 
			
		||||
	ForceList        []string                     `json:"forceList" `
 | 
			
		||||
	Content          map[string]interface{}       `json:"content" binding:"required"`
 | 
			
		||||
	ContentType      int32                        `json:"contentType" binding:"required"`
 | 
			
		||||
	SessionType      int32                        `json:"sessionType" binding:"required"`
 | 
			
		||||
	IsOnlineOnly     bool                         `json:"isOnlineOnly"`
 | 
			
		||||
	OfflinePushInfo  *open_im_sdk.OfflinePushInfo `json:"offlinePushInfo"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type PictureBaseInfo struct {
 | 
			
		||||
@ -177,12 +239,6 @@ type FileElem struct {
 | 
			
		||||
	FileName  string `mapstructure:"fileName"`
 | 
			
		||||
	FileSize  int64  `mapstructure:"fileSize"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//type MergeElem struct {
 | 
			
		||||
//	Title        string       `json:"title"`
 | 
			
		||||
//	AbstractList []string     `json:"abstractList"`
 | 
			
		||||
//	MultiMessage []*MsgStruct `json:"multiMessage"`
 | 
			
		||||
//}
 | 
			
		||||
type AtElem struct {
 | 
			
		||||
	Text       string   `mapstructure:"text"`
 | 
			
		||||
	AtUserList []string `mapstructure:"atUserList"`
 | 
			
		||||
@ -201,8 +257,3 @@ type CustomElem struct {
 | 
			
		||||
type TextElem struct {
 | 
			
		||||
	Text string `mapstructure:"text" validate:"required"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//type QuoteElem struct {
 | 
			
		||||
//	Text         string     `json:"text"`
 | 
			
		||||
//	QuoteMessage *MsgStruct `json:"quoteMessage"`
 | 
			
		||||
//}
 | 
			
		||||
 | 
			
		||||
@ -7,72 +7,174 @@
 | 
			
		||||
package manage
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	pbUser "Open_IM/pkg/proto/user"
 | 
			
		||||
	api "Open_IM/pkg/base_info"
 | 
			
		||||
	"Open_IM/pkg/common/config"
 | 
			
		||||
	"Open_IM/pkg/common/constant"
 | 
			
		||||
	"Open_IM/pkg/common/log"
 | 
			
		||||
	"Open_IM/pkg/common/token_verify"
 | 
			
		||||
	"Open_IM/pkg/grpc-etcdv3/getcdv3"
 | 
			
		||||
	pbRelay "Open_IM/pkg/proto/relay"
 | 
			
		||||
	rpc "Open_IM/pkg/proto/user"
 | 
			
		||||
	"Open_IM/pkg/utils"
 | 
			
		||||
	"context"
 | 
			
		||||
	"github.com/gin-gonic/gin"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"strings"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type paramsDeleteUsers struct {
 | 
			
		||||
	OperationID   string   `json:"operationID" binding:"required"`
 | 
			
		||||
	DeleteUidList []string `json:"deleteUidList" binding:"required"`
 | 
			
		||||
}
 | 
			
		||||
type paramsGetAllUsersUid struct {
 | 
			
		||||
	OperationID string `json:"operationID" binding:"required"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func DeleteUser(c *gin.Context) {
 | 
			
		||||
	params := paramsDeleteUsers{}
 | 
			
		||||
	params := api.DeleteUsersReq{}
 | 
			
		||||
	if err := c.BindJSON(¶ms); err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	log.InfoByKv("DeleteUser req come here", params.OperationID, "DeleteUidList", params.DeleteUidList)
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImUserName)
 | 
			
		||||
	client := pbUser.NewUserClient(etcdConn)
 | 
			
		||||
	//defer etcdConn.Close()
 | 
			
		||||
 | 
			
		||||
	req := &pbUser.DeleteUsersReq{
 | 
			
		||||
		OperationID:   params.OperationID,
 | 
			
		||||
		DeleteUidList: params.DeleteUidList,
 | 
			
		||||
		Token:         c.Request.Header.Get("token"),
 | 
			
		||||
	req := &rpc.DeleteUsersReq{}
 | 
			
		||||
	utils.CopyStructFields(req, ¶ms)
 | 
			
		||||
	var ok bool
 | 
			
		||||
	ok, req.OpUserID = token_verify.GetUserIDFromToken(c.Request.Header.Get("token"))
 | 
			
		||||
	if !ok {
 | 
			
		||||
		log.NewError(req.OperationID, "GetUserIDFromToken false ", c.Request.Header.Get("token"))
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "GetUserIDFromToken failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	log.NewInfo(params.OperationID, "DeleteUser args ", req.String())
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImUserName)
 | 
			
		||||
	client := rpc.NewUserClient(etcdConn)
 | 
			
		||||
 | 
			
		||||
	RpcResp, err := client.DeleteUsers(context.Background(), req)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
 | 
			
		||||
		log.NewError(req.OperationID, "call delete users rpc server failed", err.Error())
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "call delete users rpc server failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	log.InfoByKv("call delete user rpc server is success", params.OperationID, "resp args", RpcResp.String())
 | 
			
		||||
	resp := gin.H{"errCode": RpcResp.CommonResp.ErrorCode, "errMsg": RpcResp.CommonResp.ErrorMsg, "failedUidList": RpcResp.FailedUidList}
 | 
			
		||||
	resp := api.DeleteUsersResp{CommResp: api.CommResp{ErrCode: RpcResp.CommonResp.ErrCode, ErrMsg: RpcResp.CommonResp.ErrMsg}, FailedUserIDList: RpcResp.FailedUserIDList}
 | 
			
		||||
	if len(RpcResp.FailedUserIDList) == 0 {
 | 
			
		||||
		resp.FailedUserIDList = []string{}
 | 
			
		||||
	}
 | 
			
		||||
	log.NewInfo(req.OperationID, "DeleteUser api return", resp)
 | 
			
		||||
	c.JSON(http.StatusOK, resp)
 | 
			
		||||
}
 | 
			
		||||
func GetAllUsersUid(c *gin.Context) {
 | 
			
		||||
	params := paramsGetAllUsersUid{}
 | 
			
		||||
	params := api.GetAllUsersUidReq{}
 | 
			
		||||
	if err := c.BindJSON(¶ms); err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	log.InfoByKv("GetAllUsersUid req come here", params.OperationID)
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImUserName)
 | 
			
		||||
	client := pbUser.NewUserClient(etcdConn)
 | 
			
		||||
	//defer etcdConn.Close()
 | 
			
		||||
 | 
			
		||||
	req := &pbUser.GetAllUsersUidReq{
 | 
			
		||||
		OperationID: params.OperationID,
 | 
			
		||||
		Token:       c.Request.Header.Get("token"),
 | 
			
		||||
	}
 | 
			
		||||
	RpcResp, err := client.GetAllUsersUid(context.Background(), req)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": err.Error(), "uidList": []string{}})
 | 
			
		||||
	req := &rpc.GetAllUserIDReq{}
 | 
			
		||||
	utils.CopyStructFields(req, ¶ms)
 | 
			
		||||
	var ok bool
 | 
			
		||||
	ok, req.OpUserID = token_verify.GetUserIDFromToken(c.Request.Header.Get("token"))
 | 
			
		||||
	if !ok {
 | 
			
		||||
		log.NewError(req.OperationID, "GetUserIDFromToken false ", c.Request.Header.Get("token"))
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "GetUserIDFromToken failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	log.InfoByKv("call GetAllUsersUid rpc server is success", params.OperationID, "resp args", RpcResp.String())
 | 
			
		||||
	resp := gin.H{"errCode": RpcResp.CommonResp.ErrorCode, "errMsg": RpcResp.CommonResp.ErrorMsg, "uidList": RpcResp.UidList}
 | 
			
		||||
	log.NewInfo(params.OperationID, "GetAllUsersUid args ", req.String())
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImUserName)
 | 
			
		||||
	client := rpc.NewUserClient(etcdConn)
 | 
			
		||||
	RpcResp, err := client.GetAllUserID(context.Background(), req)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(req.OperationID, "call GetAllUsersUid users rpc server failed", err.Error())
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "call GetAllUsersUid users rpc server failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	resp := api.GetAllUsersUidResp{CommResp: api.CommResp{ErrCode: RpcResp.CommonResp.ErrCode, ErrMsg: RpcResp.CommonResp.ErrMsg}, UserIDList: RpcResp.UserIDList}
 | 
			
		||||
	if len(RpcResp.UserIDList) == 0 {
 | 
			
		||||
		resp.UserIDList = []string{}
 | 
			
		||||
	}
 | 
			
		||||
	log.NewInfo(req.OperationID, "GetAllUsersUid api return", resp)
 | 
			
		||||
	c.JSON(http.StatusOK, resp)
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
func AccountCheck(c *gin.Context) {
 | 
			
		||||
	params := api.AccountCheckReq{}
 | 
			
		||||
	if err := c.BindJSON(¶ms); err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	req := &rpc.AccountCheckReq{}
 | 
			
		||||
	utils.CopyStructFields(req, ¶ms)
 | 
			
		||||
	var ok bool
 | 
			
		||||
	ok, req.OpUserID = token_verify.GetUserIDFromToken(c.Request.Header.Get("token"))
 | 
			
		||||
	if !ok {
 | 
			
		||||
		log.NewError(req.OperationID, "GetUserIDFromToken false ", c.Request.Header.Get("token"))
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "GetUserIDFromToken failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	log.NewInfo(params.OperationID, "AccountCheck args ", req.String())
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImUserName)
 | 
			
		||||
	client := rpc.NewUserClient(etcdConn)
 | 
			
		||||
 | 
			
		||||
	RpcResp, err := client.AccountCheck(context.Background(), req)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(req.OperationID, "call AccountCheck users rpc server failed", err.Error())
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "call AccountCheck users rpc server failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	resp := api.AccountCheckResp{CommResp: api.CommResp{ErrCode: RpcResp.CommonResp.ErrCode, ErrMsg: RpcResp.CommonResp.ErrMsg}, ResultList: RpcResp.ResultList}
 | 
			
		||||
	if len(RpcResp.ResultList) == 0 {
 | 
			
		||||
		resp.ResultList = []*rpc.AccountCheckResp_SingleUserStatus{}
 | 
			
		||||
	}
 | 
			
		||||
	log.NewInfo(req.OperationID, "AccountCheck api return", resp)
 | 
			
		||||
	c.JSON(http.StatusOK, resp)
 | 
			
		||||
}
 | 
			
		||||
func GetUsersOnlineStatus(c *gin.Context) {
 | 
			
		||||
	params := api.GetUsersOnlineStatusReq{}
 | 
			
		||||
	if err := c.BindJSON(¶ms); err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	req := &pbRelay.GetUsersOnlineStatusReq{}
 | 
			
		||||
	utils.CopyStructFields(req, ¶ms)
 | 
			
		||||
	var ok bool
 | 
			
		||||
	ok, req.OpUserID = token_verify.GetUserIDFromToken(c.Request.Header.Get("token"))
 | 
			
		||||
	if !ok {
 | 
			
		||||
		log.NewError(req.OperationID, "GetUserIDFromToken false ", c.Request.Header.Get("token"))
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "GetUserIDFromToken failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	log.NewInfo(params.OperationID, "GetUsersOnlineStatus args ", req.String())
 | 
			
		||||
	var wsResult []*pbRelay.GetUsersOnlineStatusResp_SuccessResult
 | 
			
		||||
	var respResult []*pbRelay.GetUsersOnlineStatusResp_SuccessResult
 | 
			
		||||
	flag := false
 | 
			
		||||
	grpcCons := getcdv3.GetConn4Unique(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImOnlineMessageRelayName)
 | 
			
		||||
	for _, v := range grpcCons {
 | 
			
		||||
		client := pbRelay.NewOnlineMessageRelayServiceClient(v)
 | 
			
		||||
		reply, err := client.GetUsersOnlineStatus(context.Background(), req)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			log.NewError(params.OperationID, "GetUsersOnlineStatus rpc  err", req.String(), err.Error())
 | 
			
		||||
			continue
 | 
			
		||||
		} else {
 | 
			
		||||
			if reply.ErrCode == 0 {
 | 
			
		||||
				wsResult = append(wsResult, reply.SuccessResult...)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	log.NewInfo(params.OperationID, "call GetUsersOnlineStatus rpc server is success", wsResult)
 | 
			
		||||
	//Online data merge of each node
 | 
			
		||||
	for _, v1 := range params.UserIDList {
 | 
			
		||||
		flag = false
 | 
			
		||||
		temp := new(pbRelay.GetUsersOnlineStatusResp_SuccessResult)
 | 
			
		||||
		for _, v2 := range wsResult {
 | 
			
		||||
			if v2.UserID == v1 {
 | 
			
		||||
				flag = true
 | 
			
		||||
				temp.UserID = v1
 | 
			
		||||
				temp.Status = constant.OnlineStatus
 | 
			
		||||
				temp.DetailPlatformStatus = append(temp.DetailPlatformStatus, v2.DetailPlatformStatus...)
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
		}
 | 
			
		||||
		if !flag {
 | 
			
		||||
			temp.UserID = v1
 | 
			
		||||
			temp.Status = constant.OfflineStatus
 | 
			
		||||
		}
 | 
			
		||||
		respResult = append(respResult, temp)
 | 
			
		||||
	}
 | 
			
		||||
	resp := api.GetUsersOnlineStatusResp{CommResp: api.CommResp{ErrCode: 0, ErrMsg: ""}, SuccessResult: respResult}
 | 
			
		||||
	if len(respResult) == 0 {
 | 
			
		||||
		resp.SuccessResult = []*pbRelay.GetUsersOnlineStatusResp_SuccessResult{}
 | 
			
		||||
	}
 | 
			
		||||
	log.NewInfo(req.OperationID, "GetUsersOnlineStatus api return", resp)
 | 
			
		||||
	c.JSON(http.StatusOK, resp)
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										95
									
								
								internal/api/third/ali_oss_credential.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										95
									
								
								internal/api/third/ali_oss_credential.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,95 @@
 | 
			
		||||
package apiThird
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	api "Open_IM/pkg/base_info"
 | 
			
		||||
	"Open_IM/pkg/common/config"
 | 
			
		||||
	"Open_IM/pkg/common/constant"
 | 
			
		||||
	"Open_IM/pkg/common/log"
 | 
			
		||||
	"Open_IM/pkg/common/token_verify"
 | 
			
		||||
	"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
 | 
			
		||||
	}
 | 
			
		||||
	ok, userID := token_verify.GetUserIDFromToken(c.Request.Header.Get("token"))
 | 
			
		||||
	if !ok {
 | 
			
		||||
		log.NewError(req.OperationID, "GetUserIDFromToken false ", c.Request.Header.Get("token"))
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "GetUserIDFromToken failed"})
 | 
			
		||||
		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)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										52
									
								
								internal/api/third/minio_init.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								internal/api/third/minio_init.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,52 @@
 | 
			
		||||
package apiThird
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"Open_IM/pkg/common/config"
 | 
			
		||||
	"Open_IM/pkg/common/log"
 | 
			
		||||
	"Open_IM/pkg/utils"
 | 
			
		||||
	"context"
 | 
			
		||||
	"github.com/minio/minio-go/v7"
 | 
			
		||||
	"github.com/minio/minio-go/v7/pkg/credentials"
 | 
			
		||||
	url2 "net/url"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func MinioInit() {
 | 
			
		||||
	minioUrl, err := url2.Parse(config.Config.Credential.Minio.Endpoint)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError("", utils.GetSelfFuncName(), "parse failed, please check config/config.yaml", err.Error())
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	minioClient, err := minio.New(minioUrl.Host, &minio.Options{
 | 
			
		||||
		Creds:  credentials.NewStaticV4(config.Config.Credential.Minio.AccessKeyID, config.Config.Credential.Minio.SecretAccessKey, ""),
 | 
			
		||||
		Secure: false,
 | 
			
		||||
	})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError("", utils.GetSelfFuncName(), "init minio client failed", err.Error())
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	opt := minio.MakeBucketOptions{
 | 
			
		||||
		Region:        config.Config.Credential.Minio.Location,
 | 
			
		||||
		ObjectLocking: false,
 | 
			
		||||
	}
 | 
			
		||||
	err = minioClient.MakeBucket(context.Background(), config.Config.Credential.Minio.Bucket, opt)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewInfo("", utils.GetSelfFuncName(), err.Error())
 | 
			
		||||
		exists, err := minioClient.BucketExists(context.Background(), config.Config.Credential.Minio.Bucket)
 | 
			
		||||
		if err == nil && exists {
 | 
			
		||||
			log.NewInfo("", utils.GetSelfFuncName(), "We already own %s\n", config.Config.Credential.Minio.Bucket)
 | 
			
		||||
		} else {
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				log.NewError("", utils.GetSelfFuncName(), err.Error())
 | 
			
		||||
			}
 | 
			
		||||
			log.NewError("", utils.GetSelfFuncName(), "create bucket failed and bucket not exists")
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	// 自动化桶public的代码
 | 
			
		||||
	//err = minioClient.SetBucketPolicy(context.Background(), config.Config.Credential.Minio.Bucket, policy.BucketPolicyReadWrite)
 | 
			
		||||
	//if err != nil {
 | 
			
		||||
	//	log.NewError("", utils.GetSelfFuncName(), "SetBucketPolicy failed please set in 	", err.Error())
 | 
			
		||||
	//	return`z
 | 
			
		||||
	//}
 | 
			
		||||
	log.NewInfo("", utils.GetSelfFuncName(), "minio create and set policy success")
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										55
									
								
								internal/api/third/minio_storage_credential.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								internal/api/third/minio_storage_credential.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,55 @@
 | 
			
		||||
package apiThird
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	apiStruct "Open_IM/pkg/base_info"
 | 
			
		||||
	"Open_IM/pkg/common/config"
 | 
			
		||||
	"Open_IM/pkg/common/constant"
 | 
			
		||||
	"Open_IM/pkg/common/log"
 | 
			
		||||
	"Open_IM/pkg/common/token_verify"
 | 
			
		||||
	_ "Open_IM/pkg/common/token_verify"
 | 
			
		||||
	"Open_IM/pkg/utils"
 | 
			
		||||
	"github.com/gin-gonic/gin"
 | 
			
		||||
	_ "github.com/minio/minio-go/v7"
 | 
			
		||||
	cr "github.com/minio/minio-go/v7/pkg/credentials"
 | 
			
		||||
	"net/http"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func MinioStorageCredential(c *gin.Context) {
 | 
			
		||||
	var (
 | 
			
		||||
		req apiStruct.MinioStorageCredentialReq
 | 
			
		||||
		resp apiStruct.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
 | 
			
		||||
	}
 | 
			
		||||
	ok, _ := token_verify.GetUserIDFromToken(c.Request.Header.Get("token"))
 | 
			
		||||
	if !ok {
 | 
			
		||||
		log.NewError("", utils.GetSelfFuncName(), "GetUserIDFromToken false ", c.Request.Header.Get("token"))
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "GetUserIDFromToken failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	var stsOpts cr.STSAssumeRoleOptions
 | 
			
		||||
	stsOpts.AccessKey = config.Config.Credential.Minio.AccessKeyID
 | 
			
		||||
	stsOpts.SecretKey = config.Config.Credential.Minio.SecretAccessKey
 | 
			
		||||
	stsOpts.DurationSeconds = constant.MinioDurationTimes
 | 
			
		||||
	li, err := cr.NewSTSAssumeRole(config.Config.Credential.Minio.Endpoint, stsOpts)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError("", 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("0", 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
 | 
			
		||||
	c.JSON(http.StatusOK, gin.H{"errCode": 0, "errMsg": "", "data":resp})
 | 
			
		||||
}
 | 
			
		||||
@ -1,50 +1,40 @@
 | 
			
		||||
package apiThird
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	api "Open_IM/pkg/base_info"
 | 
			
		||||
	"Open_IM/pkg/common/config"
 | 
			
		||||
	log2 "Open_IM/pkg/common/log"
 | 
			
		||||
	"Open_IM/pkg/common/constant"
 | 
			
		||||
	"Open_IM/pkg/common/log"
 | 
			
		||||
	"Open_IM/pkg/common/token_verify"
 | 
			
		||||
	"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"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type paramsTencentCloudStorageCredential struct {
 | 
			
		||||
	Token       string `json:"token"`
 | 
			
		||||
	OperationID string `json:"operationID"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var lastTime int64
 | 
			
		||||
var lastRes *sts.CredentialResult
 | 
			
		||||
 | 
			
		||||
func TencentCloudStorageCredential(c *gin.Context) {
 | 
			
		||||
	params := paramsTencentCloudStorageCredential{}
 | 
			
		||||
	if err := c.BindJSON(¶ms); err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": "Parameter parsing error,please check the parameters and request service again"})
 | 
			
		||||
	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
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	log2.Info(params.Token, params.OperationID, "api TencentUpLoadCredential call start...")
 | 
			
		||||
 | 
			
		||||
	if time.Now().Unix()-lastTime < 10 && lastRes != nil {
 | 
			
		||||
		c.JSON(http.StatusOK, gin.H{
 | 
			
		||||
			"errCode": 0,
 | 
			
		||||
			"errMsg":  "",
 | 
			
		||||
			"region":  config.Config.Credential.Tencent.Region,
 | 
			
		||||
			"bucket":  config.Config.Credential.Tencent.Bucket,
 | 
			
		||||
			"data":    lastRes,
 | 
			
		||||
		})
 | 
			
		||||
	ok, userID := token_verify.GetUserIDFromToken(c.Request.Header.Get("token"))
 | 
			
		||||
	if !ok {
 | 
			
		||||
		log.NewError(req.OperationID, "GetUserIDFromToken false ", c.Request.Header.Get("token"))
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "GetUserIDFromToken failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	lastTime = time.Now().Unix()
 | 
			
		||||
	log.NewInfo(req.OperationID, "TencentCloudStorageCredential args ", userID)
 | 
			
		||||
 | 
			
		||||
	cli := sts.NewClient(
 | 
			
		||||
		config.Config.Credential.Tencent.SecretID,
 | 
			
		||||
		config.Config.Credential.Tencent.SecretKey,
 | 
			
		||||
		nil,
 | 
			
		||||
	)
 | 
			
		||||
	log2.Info(c.Request.Header.Get("token"), c.PostForm("optionID"), "api TencentUpLoadCredential sts.NewClient cli = %v", cli)
 | 
			
		||||
 | 
			
		||||
	opt := &sts.CredentialOptions{
 | 
			
		||||
		DurationSeconds: int64(time.Hour.Seconds()),
 | 
			
		||||
@ -64,29 +54,19 @@ func TencentCloudStorageCredential(c *gin.Context) {
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
	log2.Info(c.Request.Header.Get("token"), c.PostForm("optionID"), "api TencentUpLoadCredential sts.CredentialOptions opt = %v", opt)
 | 
			
		||||
 | 
			
		||||
	res, err := cli.GetCredential(opt)
 | 
			
		||||
	resp := api.TencentCloudStorageCredentialResp{}
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log2.Error(c.Request.Header.Get("token"), c.PostForm("optionID"), "api TencentUpLoadCredential cli.GetCredential err = %s", err.Error())
 | 
			
		||||
		c.JSON(http.StatusOK, gin.H{
 | 
			
		||||
			"errCode": config.ErrTencentCredential.ErrCode,
 | 
			
		||||
			"errMsg":  err.Error(),
 | 
			
		||||
			"bucket":  "",
 | 
			
		||||
			"region":  "",
 | 
			
		||||
			"data":    res,
 | 
			
		||||
		})
 | 
			
		||||
		return
 | 
			
		||||
		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
 | 
			
		||||
	}
 | 
			
		||||
	log2.Info(c.Request.Header.Get("token"), c.PostForm("optionID"), "api TencentUpLoadCredential cli.GetCredential success res = %v, res.Credentials = %v", res, res.Credentials)
 | 
			
		||||
 | 
			
		||||
	lastRes = res
 | 
			
		||||
	resp.Data = structs.Map(&resp.CosData)
 | 
			
		||||
	log.NewInfo(req.OperationID, "TencentCloudStorageCredential return ", resp)
 | 
			
		||||
 | 
			
		||||
	c.JSON(http.StatusOK, gin.H{
 | 
			
		||||
		"errCode": 0,
 | 
			
		||||
		"errMsg":  "",
 | 
			
		||||
		"region":  config.Config.Credential.Tencent.Region,
 | 
			
		||||
		"bucket":  config.Config.Credential.Tencent.Bucket,
 | 
			
		||||
		"data":    res,
 | 
			
		||||
	})
 | 
			
		||||
	c.JSON(http.StatusOK, resp)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1,74 +0,0 @@
 | 
			
		||||
package user
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	pbUser "Open_IM/pkg/proto/user"
 | 
			
		||||
	"Open_IM/pkg/common/config"
 | 
			
		||||
	"Open_IM/pkg/common/log"
 | 
			
		||||
	"Open_IM/pkg/grpc-etcdv3/getcdv3"
 | 
			
		||||
	"context"
 | 
			
		||||
	"github.com/gin-gonic/gin"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"strings"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type userInfo struct {
 | 
			
		||||
	UID    string `json:"uid"`
 | 
			
		||||
	Name   string `json:"name"`
 | 
			
		||||
	Icon   string `json:"icon"`
 | 
			
		||||
	Gender int32  `json:"gender"`
 | 
			
		||||
	Mobile string `json:"mobile"`
 | 
			
		||||
	Birth  string `json:"birth"`
 | 
			
		||||
	Email  string `json:"email"`
 | 
			
		||||
	Ex     string `json:"ex"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func GetUserInfo(c *gin.Context) {
 | 
			
		||||
	log.InfoByKv("api get userinfo init...", "")
 | 
			
		||||
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImUserName)
 | 
			
		||||
	client := pbUser.NewUserClient(etcdConn)
 | 
			
		||||
	//defer etcdConn.Close()
 | 
			
		||||
 | 
			
		||||
	params := paramsStruct{}
 | 
			
		||||
	if err := c.BindJSON(¶ms); err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	req := &pbUser.GetUserInfoReq{
 | 
			
		||||
		UserIDList:  params.UIDList,
 | 
			
		||||
		OperationID: params.OperationID,
 | 
			
		||||
		Token:       c.Request.Header.Get("token"),
 | 
			
		||||
	}
 | 
			
		||||
	log.InfoByKv("api get user info is server", c.PostForm("OperationID"), c.Request.Header.Get("token"))
 | 
			
		||||
	RpcResp, err := client.GetUserInfo(context.Background(), req)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Error(req.Token, req.OperationID, "err=%s,call get user info rpc server failed", err)
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{
 | 
			
		||||
			"errorCode": 500,
 | 
			
		||||
			"errorMsg":  "call  rpc server failed",
 | 
			
		||||
		})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	log.InfoByKv("call get user info rpc server success", params.OperationID)
 | 
			
		||||
	if RpcResp.ErrorCode == 0 {
 | 
			
		||||
		userInfoList := make([]userInfo, 0)
 | 
			
		||||
		for _, user := range RpcResp.Data {
 | 
			
		||||
			var ui userInfo
 | 
			
		||||
			ui.UID = user.Uid
 | 
			
		||||
			ui.Name = user.Name
 | 
			
		||||
			ui.Icon = user.Icon
 | 
			
		||||
			ui.Gender = user.Gender
 | 
			
		||||
			ui.Mobile = user.Mobile
 | 
			
		||||
			ui.Birth = user.Birth
 | 
			
		||||
			ui.Email = user.Email
 | 
			
		||||
			ui.Ex = user.Ex
 | 
			
		||||
			userInfoList = append(userInfoList, ui)
 | 
			
		||||
		}
 | 
			
		||||
		resp := gin.H{"errCode": RpcResp.ErrorCode, "errMsg": RpcResp.ErrorMsg, "data": userInfoList}
 | 
			
		||||
		c.JSON(http.StatusOK, resp)
 | 
			
		||||
	} else {
 | 
			
		||||
		resp := gin.H{"errCode": RpcResp.ErrorCode, "errMsg": RpcResp.ErrorMsg}
 | 
			
		||||
		c.JSON(http.StatusOK, resp)
 | 
			
		||||
	}
 | 
			
		||||
	log.InfoByKv("api get user info return success", params.OperationID, "args=%s", RpcResp.String())
 | 
			
		||||
}
 | 
			
		||||
@ -1,62 +0,0 @@
 | 
			
		||||
package user
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	pbUser "Open_IM/pkg/proto/user"
 | 
			
		||||
	"Open_IM/pkg/common/config"
 | 
			
		||||
	"Open_IM/pkg/common/log"
 | 
			
		||||
	"Open_IM/pkg/grpc-etcdv3/getcdv3"
 | 
			
		||||
	"context"
 | 
			
		||||
	"github.com/gin-gonic/gin"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"strings"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type paramsStruct struct {
 | 
			
		||||
	OperationID string   `json:"operationID" binding:"required"`
 | 
			
		||||
	UIDList     []string `json:"uidList"`
 | 
			
		||||
	Platform    int32    `json:"platform"`
 | 
			
		||||
	Name        string   `json:"name"`
 | 
			
		||||
	Icon        string   `json:"icon"`
 | 
			
		||||
	Gender      int32    `json:"gender"`
 | 
			
		||||
	Mobile      string   `json:"mobile"`
 | 
			
		||||
	Birth       string   `json:"birth"`
 | 
			
		||||
	Email       string   `json:"email"`
 | 
			
		||||
	Ex          string   `json:"ex"`
 | 
			
		||||
	Uid         string   `json:"uid"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func UpdateUserInfo(c *gin.Context) {
 | 
			
		||||
	log.InfoByKv("api update userinfo init...", "")
 | 
			
		||||
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImUserName)
 | 
			
		||||
	client := pbUser.NewUserClient(etcdConn)
 | 
			
		||||
	//defer etcdConn.Close()
 | 
			
		||||
 | 
			
		||||
	params := paramsStruct{}
 | 
			
		||||
	if err := c.BindJSON(¶ms); err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	req := &pbUser.UpdateUserInfoReq{
 | 
			
		||||
		OperationID: params.OperationID,
 | 
			
		||||
		Token:       c.Request.Header.Get("token"),
 | 
			
		||||
		Name:        params.Name,
 | 
			
		||||
		Icon:        params.Icon,
 | 
			
		||||
		Gender:      params.Gender,
 | 
			
		||||
		Mobile:      params.Mobile,
 | 
			
		||||
		Birth:       params.Birth,
 | 
			
		||||
		Email:       params.Email,
 | 
			
		||||
		Ex:          params.Ex,
 | 
			
		||||
		Uid:         params.Uid,
 | 
			
		||||
	}
 | 
			
		||||
	log.InfoByKv("api update user info is server", req.OperationID, req.Token)
 | 
			
		||||
	RpcResp, err := client.UpdateUserInfo(context.Background(), req)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Error(req.Token, req.OperationID, "err=%s,call get user info rpc server failed", err)
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "call  rpc server failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	log.InfoByKv("call update user info rpc server success", params.OperationID)
 | 
			
		||||
	c.JSON(http.StatusOK, gin.H{"errCode": RpcResp.ErrorCode, "errMsg": RpcResp.ErrorMsg})
 | 
			
		||||
	log.InfoByKv("api update user info return success", params.OperationID, "args=%s", RpcResp.String())
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										129
									
								
								internal/api/user/user.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										129
									
								
								internal/api/user/user.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,129 @@
 | 
			
		||||
package user
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	jsonData "Open_IM/internal/utils"
 | 
			
		||||
	api "Open_IM/pkg/base_info"
 | 
			
		||||
	"Open_IM/pkg/common/config"
 | 
			
		||||
	"Open_IM/pkg/common/log"
 | 
			
		||||
	"Open_IM/pkg/common/token_verify"
 | 
			
		||||
	"Open_IM/pkg/grpc-etcdv3/getcdv3"
 | 
			
		||||
	open_im_sdk "Open_IM/pkg/proto/sdk_ws"
 | 
			
		||||
	rpc "Open_IM/pkg/proto/user"
 | 
			
		||||
	"Open_IM/pkg/utils"
 | 
			
		||||
	"context"
 | 
			
		||||
	"github.com/gin-gonic/gin"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"strings"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func GetUsersInfo(c *gin.Context) {
 | 
			
		||||
	params := api.GetUsersInfoReq{}
 | 
			
		||||
	if err := c.BindJSON(¶ms); err != nil {
 | 
			
		||||
		log.NewError("0", "BindJSON failed ", err.Error())
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"errCode": http.StatusBadRequest, "errMsg": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	req := &rpc.GetUserInfoReq{}
 | 
			
		||||
	utils.CopyStructFields(req, ¶ms)
 | 
			
		||||
	var ok bool
 | 
			
		||||
	ok, req.OpUserID = token_verify.GetUserIDFromToken(c.Request.Header.Get("token"))
 | 
			
		||||
	if !ok {
 | 
			
		||||
		log.NewError(req.OperationID, "GetUserIDFromToken false ", c.Request.Header.Get("token"))
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "GetUserIDFromToken failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	log.NewInfo(params.OperationID, "GetUserInfo args ", req.String())
 | 
			
		||||
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImUserName)
 | 
			
		||||
	client := rpc.NewUserClient(etcdConn)
 | 
			
		||||
	RpcResp, err := client.GetUserInfo(context.Background(), req)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(req.OperationID, "GetUserInfo failed ", err.Error(), req.String())
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "call  rpc server failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	var publicUserInfoList []*open_im_sdk.PublicUserInfo
 | 
			
		||||
	for _, v := range RpcResp.UserInfoList {
 | 
			
		||||
		publicUserInfoList = append(publicUserInfoList,
 | 
			
		||||
			&open_im_sdk.PublicUserInfo{UserID: v.UserID, Nickname: v.Nickname, FaceURL: v.FaceURL, Gender: v.Gender, Ex: v.Ex})
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	resp := api.GetUsersInfoResp{CommResp: api.CommResp{ErrCode: RpcResp.CommonResp.ErrCode, ErrMsg: RpcResp.CommonResp.ErrMsg}, UserInfoList: publicUserInfoList}
 | 
			
		||||
	resp.Data = jsonData.JsonDataList(resp.UserInfoList)
 | 
			
		||||
	log.NewInfo(req.OperationID, "GetUserInfo api return ", resp)
 | 
			
		||||
	c.JSON(http.StatusOK, resp)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func UpdateUserInfo(c *gin.Context) {
 | 
			
		||||
	params := api.UpdateSelfUserInfoReq{}
 | 
			
		||||
	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.UpdateUserInfoReq{UserInfo: &open_im_sdk.UserInfo{}}
 | 
			
		||||
	utils.CopyStructFields(req.UserInfo, ¶ms)
 | 
			
		||||
 | 
			
		||||
	req.OperationID = params.OperationID
 | 
			
		||||
	var ok bool
 | 
			
		||||
	ok, req.OpUserID = token_verify.GetUserIDFromToken(c.Request.Header.Get("token"))
 | 
			
		||||
	if !ok {
 | 
			
		||||
		log.NewError(req.OperationID, "GetUserIDFromToken false ", c.Request.Header.Get("token"))
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "GetUserIDFromToken failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	log.NewInfo(params.OperationID, "UpdateUserInfo args ", req.String())
 | 
			
		||||
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImUserName)
 | 
			
		||||
	client := rpc.NewUserClient(etcdConn)
 | 
			
		||||
	RpcResp, err := client.UpdateUserInfo(context.Background(), req)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(req.OperationID, "UpdateUserInfo failed ", err.Error(), req.String())
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "call  rpc server failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	resp := api.UpdateUserInfoResp{CommResp: api.CommResp{ErrCode: RpcResp.CommonResp.ErrCode, ErrMsg: RpcResp.CommonResp.ErrMsg}}
 | 
			
		||||
	log.NewInfo(req.OperationID, "UpdateUserInfo api return ", resp)
 | 
			
		||||
	c.JSON(http.StatusOK, resp)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func GetSelfUserInfo(c *gin.Context) {
 | 
			
		||||
	params := api.GetSelfUserInfoReq{}
 | 
			
		||||
	if err := c.BindJSON(¶ms); err != nil {
 | 
			
		||||
		log.NewError("0", "BindJSON failed ", err.Error())
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"errCode": http.StatusBadRequest, "errMsg": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	req := &rpc.GetUserInfoReq{}
 | 
			
		||||
 | 
			
		||||
	utils.CopyStructFields(req, ¶ms)
 | 
			
		||||
	var ok bool
 | 
			
		||||
	ok, req.OpUserID = token_verify.GetUserIDFromToken(c.Request.Header.Get("token"))
 | 
			
		||||
	if !ok {
 | 
			
		||||
		log.NewError(req.OperationID, "GetUserIDFromToken false ", c.Request.Header.Get("token"))
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "GetUserIDFromToken failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	req.UserIDList = append(req.UserIDList, req.OpUserID)
 | 
			
		||||
	log.NewInfo(params.OperationID, "GetUserInfo args ", req.String())
 | 
			
		||||
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImUserName)
 | 
			
		||||
	client := rpc.NewUserClient(etcdConn)
 | 
			
		||||
	RpcResp, err := client.GetUserInfo(context.Background(), req)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(req.OperationID, "GetUserInfo failed ", err.Error(), req.String())
 | 
			
		||||
		c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "call  rpc server failed"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	if len(RpcResp.UserInfoList) == 1 {
 | 
			
		||||
		resp := api.GetSelfUserInfoResp{CommResp: api.CommResp{ErrCode: RpcResp.CommonResp.ErrCode, ErrMsg: RpcResp.CommonResp.ErrMsg}, UserInfo: RpcResp.UserInfoList[0]}
 | 
			
		||||
		resp.Data = jsonData.JsonDataOne(resp.UserInfo)
 | 
			
		||||
		log.NewInfo(req.OperationID, "GetUserInfo api return ", resp)
 | 
			
		||||
		c.JSON(http.StatusOK, resp)
 | 
			
		||||
	} else {
 | 
			
		||||
		resp := api.GetSelfUserInfoResp{CommResp: api.CommResp{ErrCode: RpcResp.CommonResp.ErrCode, ErrMsg: RpcResp.CommonResp.ErrMsg}}
 | 
			
		||||
		log.NewInfo(req.OperationID, "GetUserInfo api return ", resp)
 | 
			
		||||
		c.JSON(http.StatusOK, resp)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										42
									
								
								internal/cms_api/admin/admin.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								internal/cms_api/admin/admin.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,42 @@
 | 
			
		||||
package admin
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"Open_IM/pkg/cms_api_struct"
 | 
			
		||||
	"Open_IM/pkg/common/config"
 | 
			
		||||
	"Open_IM/pkg/common/constant"
 | 
			
		||||
	openIMHttp "Open_IM/pkg/common/http"
 | 
			
		||||
	"Open_IM/pkg/common/log"
 | 
			
		||||
	"Open_IM/pkg/grpc-etcdv3/getcdv3"
 | 
			
		||||
	pbAdmin "Open_IM/pkg/proto/admin_cms"
 | 
			
		||||
	"Open_IM/pkg/utils"
 | 
			
		||||
	"context"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	"github.com/gin-gonic/gin"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// register
 | 
			
		||||
func AdminLogin(c *gin.Context) {
 | 
			
		||||
	var (
 | 
			
		||||
		req cms_api_struct.AdminLoginRequest
 | 
			
		||||
		resp cms_api_struct.AdminLoginResponse
 | 
			
		||||
		reqPb pbAdmin.AdminLoginReq
 | 
			
		||||
	)
 | 
			
		||||
	if err := c.BindJSON(&req); err != nil {
 | 
			
		||||
		log.NewInfo("0", utils.GetSelfFuncName(), err.Error())
 | 
			
		||||
		openIMHttp.RespHttp200(c, constant.ErrArgs, nil)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	reqPb.Secret = req.Secret
 | 
			
		||||
	reqPb.AdminID = req.AdminName
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImAdminCMSName)
 | 
			
		||||
	client := pbAdmin.NewAdminCMSClient(etcdConn)
 | 
			
		||||
	respPb, err := client.AdminLogin(context.Background(), &reqPb)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(reqPb.OperationID, utils.GetSelfFuncName(), "rpc failed", err.Error())
 | 
			
		||||
		openIMHttp.RespHttp200(c, err, nil)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	resp.Token = respPb.Token
 | 
			
		||||
	openIMHttp.RespHttp200(c, constant.OK, resp)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										449
									
								
								internal/cms_api/group/group.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										449
									
								
								internal/cms_api/group/group.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,449 @@
 | 
			
		||||
package group
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"Open_IM/pkg/cms_api_struct"
 | 
			
		||||
	"Open_IM/pkg/common/config"
 | 
			
		||||
	"Open_IM/pkg/common/constant"
 | 
			
		||||
	openIMHttp "Open_IM/pkg/common/http"
 | 
			
		||||
	"Open_IM/pkg/common/log"
 | 
			
		||||
	"Open_IM/pkg/grpc-etcdv3/getcdv3"
 | 
			
		||||
	commonPb "Open_IM/pkg/proto/sdk_ws"
 | 
			
		||||
	"Open_IM/pkg/utils"
 | 
			
		||||
	"context"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	pbGroup "Open_IM/pkg/proto/group"
 | 
			
		||||
 | 
			
		||||
	"github.com/gin-gonic/gin"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func GetGroupById(c *gin.Context) {
 | 
			
		||||
	var (
 | 
			
		||||
		req   cms_api_struct.GetGroupByIdRequest
 | 
			
		||||
		resp  cms_api_struct.GetGroupByIdResponse
 | 
			
		||||
		reqPb pbGroup.GetGroupByIdReq
 | 
			
		||||
	)
 | 
			
		||||
	if err := c.ShouldBindQuery(&req); err != nil {
 | 
			
		||||
		log.NewError(reqPb.OperationID, utils.GetSelfFuncName(), "ShouldBindQuery failed ", err.Error())
 | 
			
		||||
		openIMHttp.RespHttp200(c, constant.ErrArgs, nil)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	reqPb.GroupId = req.GroupId
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImGroupName)
 | 
			
		||||
	client := pbGroup.NewGroupClient(etcdConn)
 | 
			
		||||
	respPb, err := client.GetGroupById(context.Background(), &reqPb)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(reqPb.OperationID, utils.GetSelfFuncName(), "GetGroupById failed ", err.Error())
 | 
			
		||||
		openIMHttp.RespHttp200(c, err, nil)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	resp.GroupName = respPb.CMSGroup.GroupInfo.GroupName
 | 
			
		||||
	resp.GroupID = respPb.CMSGroup.GroupInfo.GroupID
 | 
			
		||||
	resp.CreateTime = (utils.UnixSecondToTime(int64(respPb.CMSGroup.GroupInfo.CreateTime))).String()
 | 
			
		||||
	resp.ProfilePhoto = respPb.CMSGroup.GroupInfo.FaceURL
 | 
			
		||||
	resp.GroupMasterName = respPb.CMSGroup.GroupMasterName
 | 
			
		||||
	resp.GroupMasterId = respPb.CMSGroup.GroupMasterId
 | 
			
		||||
	openIMHttp.RespHttp200(c, constant.OK, resp)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func GetGroups(c *gin.Context) {
 | 
			
		||||
	var (
 | 
			
		||||
		req   cms_api_struct.GetGroupsRequest
 | 
			
		||||
		resp  cms_api_struct.GetGroupsResponse
 | 
			
		||||
		reqPb pbGroup.GetGroupsReq
 | 
			
		||||
	)
 | 
			
		||||
	if err := c.ShouldBindQuery(&req); err != nil {
 | 
			
		||||
		log.NewError(reqPb.OperationID, utils.GetSelfFuncName(), "ShouldBindQuery failed ", err.Error())
 | 
			
		||||
		openIMHttp.RespHttp200(c, constant.ErrArgs, nil)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	reqPb.Pagination = &commonPb.RequestPagination{}
 | 
			
		||||
	utils.CopyStructFields(&reqPb.Pagination, req)
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImGroupName)
 | 
			
		||||
	client := pbGroup.NewGroupClient(etcdConn)
 | 
			
		||||
	respPb, err := client.GetGroups(context.Background(), &reqPb)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(reqPb.OperationID, utils.GetSelfFuncName(), "GetUserInfo failed ", err.Error())
 | 
			
		||||
		openIMHttp.RespHttp200(c, err, nil)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	for _, v := range respPb.CMSGroups {
 | 
			
		||||
		resp.Groups = append(resp.Groups, cms_api_struct.GroupResponse{
 | 
			
		||||
			GroupName:        v.GroupInfo.GroupName,
 | 
			
		||||
			GroupID:          v.GroupInfo.GroupID,
 | 
			
		||||
			GroupMasterName:  v.GroupMasterName,
 | 
			
		||||
			GroupMasterId:    v.GroupMasterId,
 | 
			
		||||
			CreateTime:       (utils.UnixSecondToTime(int64(v.GroupInfo.CreateTime))).String(),
 | 
			
		||||
			IsBanChat:        false,
 | 
			
		||||
			IsBanPrivateChat: false,
 | 
			
		||||
			ProfilePhoto:     v.GroupInfo.FaceURL,
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
	resp.GroupNums = int(respPb.GroupNum)
 | 
			
		||||
	resp.CurrentPage = int(respPb.Pagination.PageNumber)
 | 
			
		||||
	resp.ShowNumber = int(respPb.Pagination.ShowNumber)
 | 
			
		||||
	openIMHttp.RespHttp200(c, constant.OK, resp)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func GetGroupByName(c *gin.Context) {
 | 
			
		||||
	var (
 | 
			
		||||
		req   cms_api_struct.GetGroupRequest
 | 
			
		||||
		resp  cms_api_struct.GetGroupResponse
 | 
			
		||||
		reqPb pbGroup.GetGroupReq
 | 
			
		||||
	)
 | 
			
		||||
	if err := c.ShouldBindQuery(&req); err != nil {
 | 
			
		||||
		log.NewError(reqPb.OperationID, utils.GetSelfFuncName(), "ShouldBindQuery failed ", err.Error())
 | 
			
		||||
		openIMHttp.RespHttp200(c, constant.ErrArgs, nil)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	reqPb.GroupName = req.GroupName
 | 
			
		||||
	reqPb.Pagination = &commonPb.RequestPagination{}
 | 
			
		||||
	utils.CopyStructFields(&reqPb.Pagination, req)
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImGroupName)
 | 
			
		||||
	client := pbGroup.NewGroupClient(etcdConn)
 | 
			
		||||
	respPb, err := client.GetGroup(context.Background(), &reqPb)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(reqPb.OperationID, utils.GetSelfFuncName(), "GetGroup failed", err.Error())
 | 
			
		||||
		openIMHttp.RespHttp200(c, constant.ErrServer, nil)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	for _, v := range respPb.CMSGroups {
 | 
			
		||||
		resp.Groups = append(resp.Groups, cms_api_struct.GroupResponse{
 | 
			
		||||
			GroupName:        v.GroupInfo.GroupName,
 | 
			
		||||
			GroupID:          v.GroupInfo.GroupID,
 | 
			
		||||
			GroupMasterName:  v.GroupMasterName,
 | 
			
		||||
			GroupMasterId:    v.GroupMasterId,
 | 
			
		||||
			CreateTime:       (utils.UnixSecondToTime(int64(v.GroupInfo.CreateTime))).String(),
 | 
			
		||||
			IsBanChat:        false,
 | 
			
		||||
			IsBanPrivateChat: false,
 | 
			
		||||
			ProfilePhoto:     v.GroupInfo.FaceURL,
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
	resp.CurrentPage = int(respPb.Pagination.PageNumber)
 | 
			
		||||
	resp.ShowNumber = int(respPb.Pagination.ShowNumber)
 | 
			
		||||
	resp.GroupNums = int(respPb.GroupNums)
 | 
			
		||||
	openIMHttp.RespHttp200(c, constant.OK, resp)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func CreateGroup(c *gin.Context) {
 | 
			
		||||
	var (
 | 
			
		||||
		req   cms_api_struct.CreateGroupRequest
 | 
			
		||||
		_     cms_api_struct.CreateGroupResponse
 | 
			
		||||
		reqPb pbGroup.CreateGroupReq
 | 
			
		||||
	)
 | 
			
		||||
	if err := c.BindJSON(&req); err != nil {
 | 
			
		||||
		log.NewError(reqPb.OperationID, utils.GetSelfFuncName(), "BindJSON failed ", err.Error())
 | 
			
		||||
		openIMHttp.RespHttp200(c, constant.ErrArgs, nil)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	reqPb.GroupInfo = &commonPb.GroupInfo{}
 | 
			
		||||
	reqPb.GroupInfo.GroupName = req.GroupName
 | 
			
		||||
	reqPb.GroupInfo.CreatorUserID = req.GroupMasterId
 | 
			
		||||
	reqPb.OwnerUserID = req.GroupMasterId
 | 
			
		||||
	reqPb.OpUserID = req.GroupMasterId
 | 
			
		||||
	for _, v := range req.GroupMembers {
 | 
			
		||||
		reqPb.InitMemberList = append(reqPb.InitMemberList, &pbGroup.GroupAddMemberInfo{
 | 
			
		||||
			UserID:    v,
 | 
			
		||||
			RoleLevel: 1,
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImGroupName)
 | 
			
		||||
	client := pbGroup.NewGroupClient(etcdConn)
 | 
			
		||||
	_, err := client.CreateGroup(context.Background(), &reqPb)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(reqPb.OperationID, utils.GetSelfFuncName(), "CreateGroup failed", err.Error())
 | 
			
		||||
		openIMHttp.RespHttp200(c, constant.ErrServer, nil)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	openIMHttp.RespHttp200(c, constant.OK, nil)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func BanGroupChat(c *gin.Context) {
 | 
			
		||||
	var (
 | 
			
		||||
		req   cms_api_struct.BanGroupChatRequest
 | 
			
		||||
		reqPb pbGroup.OperateGroupStatusReq
 | 
			
		||||
	)
 | 
			
		||||
	if err := c.BindJSON(&req); err != nil {
 | 
			
		||||
		log.NewError(reqPb.OperationID, utils.GetSelfFuncName(), "BindJSON failed", err.Error())
 | 
			
		||||
		openIMHttp.RespHttp200(c, constant.ErrArgs, nil)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	reqPb.GroupId = req.GroupId
 | 
			
		||||
	reqPb.Status = constant.GroupBanChat
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImGroupName)
 | 
			
		||||
	client := pbGroup.NewGroupClient(etcdConn)
 | 
			
		||||
	_, err := client.OperateGroupStatus(context.Background(), &reqPb)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(reqPb.OperationID, utils.GetSelfFuncName(), "BanGroupChat failed ", err.Error())
 | 
			
		||||
		openIMHttp.RespHttp200(c, err, nil)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	openIMHttp.RespHttp200(c, constant.OK, nil)
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func BanPrivateChat(c *gin.Context) {
 | 
			
		||||
	var (
 | 
			
		||||
		req   cms_api_struct.BanPrivateChatRequest
 | 
			
		||||
		reqPb pbGroup.OperateGroupStatusReq
 | 
			
		||||
	)
 | 
			
		||||
	if err := c.BindJSON(&req); err != nil {
 | 
			
		||||
		log.NewError(reqPb.OperationID, utils.GetSelfFuncName(), "BindJSON failed ", err.Error())
 | 
			
		||||
		openIMHttp.RespHttp200(c, constant.ErrArgs, nil)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	reqPb.GroupId = req.GroupId
 | 
			
		||||
	reqPb.Status = constant.GroupBanPrivateChat
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImGroupName)
 | 
			
		||||
	client := pbGroup.NewGroupClient(etcdConn)
 | 
			
		||||
	_, err := client.OperateGroupStatus(context.Background(), &reqPb)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(reqPb.OperationID, utils.GetSelfFuncName(), "OperateGroupStatus failed", err.Error())
 | 
			
		||||
		openIMHttp.RespHttp200(c, err, nil)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	openIMHttp.RespHttp200(c, constant.OK, nil)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func OpenGroupChat(c *gin.Context) {
 | 
			
		||||
	var (
 | 
			
		||||
		req   cms_api_struct.BanPrivateChatRequest
 | 
			
		||||
		reqPb pbGroup.OperateGroupStatusReq
 | 
			
		||||
	)
 | 
			
		||||
	if err := c.BindJSON(&req); err != nil {
 | 
			
		||||
		log.NewError(reqPb.OperationID, utils.GetSelfFuncName(), "BindJSON failed ", err.Error())
 | 
			
		||||
		openIMHttp.RespHttp200(c, constant.ErrArgs, nil)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	reqPb.GroupId = req.GroupId
 | 
			
		||||
	reqPb.Status = constant.GroupOk
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImGroupName)
 | 
			
		||||
	client := pbGroup.NewGroupClient(etcdConn)
 | 
			
		||||
	_, err := client.OperateGroupStatus(context.Background(), &reqPb)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(reqPb.OperationID, utils.GetSelfFuncName(), "OperateGroupStatus failed ", err.Error())
 | 
			
		||||
		openIMHttp.RespHttp200(c, err, nil)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	openIMHttp.RespHttp200(c, constant.OK, nil)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func OpenPrivateChat(c *gin.Context) {
 | 
			
		||||
	var (
 | 
			
		||||
		req   cms_api_struct.BanPrivateChatRequest
 | 
			
		||||
		reqPb pbGroup.OperateGroupStatusReq
 | 
			
		||||
	)
 | 
			
		||||
	if err := c.BindJSON(&req); err != nil {
 | 
			
		||||
		log.NewError(reqPb.OperationID, utils.GetSelfFuncName(), "OpenPrivateChat failed ", err.Error())
 | 
			
		||||
		openIMHttp.RespHttp200(c, constant.ErrArgs, nil)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	reqPb.GroupId = req.GroupId
 | 
			
		||||
	reqPb.Status = constant.GroupOk
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImGroupName)
 | 
			
		||||
	client := pbGroup.NewGroupClient(etcdConn)
 | 
			
		||||
	_, err := client.OperateGroupStatus(context.Background(), &reqPb)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(reqPb.OperationID, utils.GetSelfFuncName(), "OperateGroupStatus failed ", err.Error())
 | 
			
		||||
		openIMHttp.RespHttp200(c, err, nil)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	openIMHttp.RespHttp200(c, constant.OK, nil)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func GetGroupMembers(c *gin.Context) {
 | 
			
		||||
	var (
 | 
			
		||||
		req   cms_api_struct.GetGroupMembersRequest
 | 
			
		||||
		reqPb pbGroup.GetGroupMembersCMSReq
 | 
			
		||||
		resp  cms_api_struct.GetGroupMembersResponse
 | 
			
		||||
	)
 | 
			
		||||
	if err := c.ShouldBindQuery(&req); err != nil {
 | 
			
		||||
		log.NewError(reqPb.OperationID, utils.GetSelfFuncName(), "ShouldBindQuery failed ", err.Error())
 | 
			
		||||
		openIMHttp.RespHttp200(c, constant.ErrArgs, nil)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	reqPb.Pagination = &commonPb.RequestPagination{
 | 
			
		||||
		PageNumber: int32(req.PageNumber),
 | 
			
		||||
		ShowNumber: int32(req.ShowNumber),
 | 
			
		||||
	}
 | 
			
		||||
	reqPb.GroupId = req.GroupId
 | 
			
		||||
	reqPb.UserName = req.UserName
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImGroupName)
 | 
			
		||||
	client := pbGroup.NewGroupClient(etcdConn)
 | 
			
		||||
	respPb, err := client.GetGroupMembersCMS(context.Background(), &reqPb)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(reqPb.OperationID, utils.GetSelfFuncName(), "GetGroupMembersCMS failed:", err.Error())
 | 
			
		||||
		openIMHttp.RespHttp200(c, err, nil)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	resp.ResponsePagination = cms_api_struct.ResponsePagination{
 | 
			
		||||
		CurrentPage: int(respPb.Pagination.CurrentPage),
 | 
			
		||||
		ShowNumber:  int(respPb.Pagination.ShowNumber),
 | 
			
		||||
	}
 | 
			
		||||
	resp.MemberNums = int(respPb.MemberNums)
 | 
			
		||||
	for _, groupMembers := range respPb.Members {
 | 
			
		||||
		resp.GroupMembers = append(resp.GroupMembers, cms_api_struct.GroupMemberResponse{
 | 
			
		||||
			MemberPosition: int(groupMembers.RoleLevel),
 | 
			
		||||
			MemberNickName: groupMembers.Nickname,
 | 
			
		||||
			MemberId:       groupMembers.UserID,
 | 
			
		||||
			JoinTime:       utils.UnixSecondToTime(int64(groupMembers.JoinTime)).String(),
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
	openIMHttp.RespHttp200(c, constant.OK, resp)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func AddGroupMembers(c *gin.Context) {
 | 
			
		||||
	var (
 | 
			
		||||
		req   cms_api_struct.RemoveGroupMembersRequest
 | 
			
		||||
		resp  cms_api_struct.RemoveGroupMembersResponse
 | 
			
		||||
		reqPb pbGroup.AddGroupMembersCMSReq
 | 
			
		||||
	)
 | 
			
		||||
	if err := c.BindJSON(&req); err != nil {
 | 
			
		||||
		log.NewError(reqPb.OperationId, utils.GetSelfFuncName(), "BindJSON failed ", err.Error())
 | 
			
		||||
		openIMHttp.RespHttp200(c, constant.ErrArgs, nil)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	reqPb.UserIds = req.Members
 | 
			
		||||
	reqPb.GroupId = req.GroupId
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImGroupName)
 | 
			
		||||
	client := pbGroup.NewGroupClient(etcdConn)
 | 
			
		||||
	respPb, err := client.AddGroupMembersCMS(context.Background(), &reqPb)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(reqPb.OperationId, utils.GetSelfFuncName(), "AddGroupMembersCMS failed", err.Error())
 | 
			
		||||
		openIMHttp.RespHttp200(c, err, nil)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	resp.Success = respPb.Success
 | 
			
		||||
	resp.Failed = respPb.Failed
 | 
			
		||||
	openIMHttp.RespHttp200(c, constant.OK, resp)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func RemoveGroupMembers(c *gin.Context) {
 | 
			
		||||
	var (
 | 
			
		||||
		req   cms_api_struct.RemoveGroupMembersRequest
 | 
			
		||||
		resp  cms_api_struct.RemoveGroupMembersResponse
 | 
			
		||||
		reqPb pbGroup.RemoveGroupMembersCMSReq
 | 
			
		||||
	)
 | 
			
		||||
	if err := c.BindJSON(&req); err != nil {
 | 
			
		||||
		log.NewError(reqPb.OperationID, utils.GetSelfFuncName(), "BindJSON failed ", err.Error())
 | 
			
		||||
		openIMHttp.RespHttp200(c, constant.ErrArgs, nil)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	reqPb.UserIds = req.Members
 | 
			
		||||
	reqPb.GroupId = req.GroupId
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImGroupName)
 | 
			
		||||
	client := pbGroup.NewGroupClient(etcdConn)
 | 
			
		||||
	respPb, err := client.RemoveGroupMembersCMS(context.Background(), &reqPb)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(reqPb.OperationID, utils.GetSelfFuncName(), "RemoveGroupMembersCMS failed", err.Error())
 | 
			
		||||
		openIMHttp.RespHttp200(c, err, nil)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	resp.Success = respPb.Success
 | 
			
		||||
	resp.Failed = respPb.Failed
 | 
			
		||||
	openIMHttp.RespHttp200(c, constant.OK, resp)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func DeleteGroup(c *gin.Context) {
 | 
			
		||||
	var (
 | 
			
		||||
		req   cms_api_struct.DeleteGroupRequest
 | 
			
		||||
		_     cms_api_struct.DeleteGroupResponse
 | 
			
		||||
		reqPb pbGroup.DeleteGroupReq
 | 
			
		||||
	)
 | 
			
		||||
	if err := c.BindJSON(&req); err != nil {
 | 
			
		||||
		log.NewError(reqPb.OperationID, utils.GetSelfFuncName(), "BindJSON failed ", err.Error())
 | 
			
		||||
		openIMHttp.RespHttp200(c, constant.ErrArgs, nil)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	reqPb.GroupId = req.GroupId
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImGroupName)
 | 
			
		||||
	client := pbGroup.NewGroupClient(etcdConn)
 | 
			
		||||
	_, err := client.DeleteGroup(context.Background(), &reqPb)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(reqPb.OperationID, utils.GetSelfFuncName(), "DeleteGroup failed", err.Error())
 | 
			
		||||
		openIMHttp.RespHttp200(c, err, nil)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	openIMHttp.RespHttp200(c, constant.OK, nil)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SetGroupMaster(c *gin.Context) {
 | 
			
		||||
	var (
 | 
			
		||||
		req   cms_api_struct.SetGroupMasterRequest
 | 
			
		||||
		_     cms_api_struct.SetGroupMasterResponse
 | 
			
		||||
		reqPb pbGroup.OperateUserRoleReq
 | 
			
		||||
	)
 | 
			
		||||
	if err := c.BindJSON(&req); err != nil {
 | 
			
		||||
		log.NewError(reqPb.OperationID, utils.GetSelfFuncName(), "BindJSON failed ", err.Error())
 | 
			
		||||
		openIMHttp.RespHttp200(c, constant.ErrArgs, nil)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	reqPb.GroupId = req.GroupId
 | 
			
		||||
	reqPb.UserId = req.UserId
 | 
			
		||||
	reqPb.RoleLevel = constant.GroupOwner
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImGroupName)
 | 
			
		||||
	client := pbGroup.NewGroupClient(etcdConn)
 | 
			
		||||
	_, err := client.OperateUserRole(context.Background(), &reqPb)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(reqPb.OperationID, utils.GetSelfFuncName(), "DeleteGroup failed", err.Error())
 | 
			
		||||
		openIMHttp.RespHttp200(c, constant.ErrServer, nil)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	openIMHttp.RespHttp200(c, constant.OK, nil)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SetGroupOrdinaryUsers(c *gin.Context) {
 | 
			
		||||
	var (
 | 
			
		||||
		req   cms_api_struct.SetGroupMemberRequest
 | 
			
		||||
		_     cms_api_struct.AdminLoginResponse
 | 
			
		||||
		reqPb pbGroup.OperateUserRoleReq
 | 
			
		||||
	)
 | 
			
		||||
	if err := c.BindJSON(&req); err != nil {
 | 
			
		||||
		log.NewError(reqPb.OperationID, utils.GetSelfFuncName(), "BindJSON failed ", err.Error())
 | 
			
		||||
		openIMHttp.RespHttp200(c, constant.ErrArgs, nil)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	reqPb.GroupId = req.GroupId
 | 
			
		||||
	reqPb.UserId = req.UserId
 | 
			
		||||
	reqPb.RoleLevel = constant.GroupOrdinaryUsers
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImGroupName)
 | 
			
		||||
	client := pbGroup.NewGroupClient(etcdConn)
 | 
			
		||||
	_, err := client.OperateUserRole(context.Background(), &reqPb)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(reqPb.OperationID, utils.GetSelfFuncName(), "DeleteGroup failed", err.Error())
 | 
			
		||||
		openIMHttp.RespHttp200(c, err, nil)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	openIMHttp.RespHttp200(c, constant.OK, nil)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func AlterGroupInfo(c *gin.Context) {
 | 
			
		||||
	var (
 | 
			
		||||
		req   cms_api_struct.AlterGroupInfoRequest
 | 
			
		||||
		_     cms_api_struct.SetGroupMasterResponse
 | 
			
		||||
		reqPb pbGroup.SetGroupInfoReq
 | 
			
		||||
	)
 | 
			
		||||
	if err := c.BindJSON(&req); err != nil {
 | 
			
		||||
		log.NewError(reqPb.OperationID, utils.GetSelfFuncName(), "BindJSON failed ", err.Error())
 | 
			
		||||
		openIMHttp.RespHttp200(c, constant.ErrArgs, nil)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	reqPb.OpUserID = c.MustGet("userID").(string)
 | 
			
		||||
	reqPb.GroupInfo = &commonPb.GroupInfo{
 | 
			
		||||
		GroupID:      req.GroupID,
 | 
			
		||||
		GroupName:    req.GroupName,
 | 
			
		||||
		Introduction: req.Introduction,
 | 
			
		||||
		Notification: req.Notification,
 | 
			
		||||
		FaceURL:      req.ProfilePhoto,
 | 
			
		||||
		GroupType:    int32(req.GroupType),
 | 
			
		||||
	}
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImGroupName)
 | 
			
		||||
	client := pbGroup.NewGroupClient(etcdConn)
 | 
			
		||||
	_, err := client.SetGroupInfo(context.Background(), &reqPb)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(reqPb.OperationID, utils.GetSelfFuncName(), "DeleteGroup failed", err.Error())
 | 
			
		||||
		openIMHttp.RespHttp200(c, err, nil)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	openIMHttp.RespHttp200(c, constant.OK, nil)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										109
									
								
								internal/cms_api/message_cms/message.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										109
									
								
								internal/cms_api/message_cms/message.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,109 @@
 | 
			
		||||
package messageCMS
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"Open_IM/pkg/cms_api_struct"
 | 
			
		||||
	"Open_IM/pkg/common/config"
 | 
			
		||||
	openIMHttp "Open_IM/pkg/common/http"
 | 
			
		||||
	"Open_IM/pkg/common/log"
 | 
			
		||||
	"Open_IM/pkg/grpc-etcdv3/getcdv3"
 | 
			
		||||
	pbMessage "Open_IM/pkg/proto/message_cms"
 | 
			
		||||
	pbCommon "Open_IM/pkg/proto/sdk_ws"
 | 
			
		||||
	"Open_IM/pkg/utils"
 | 
			
		||||
	"context"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	"Open_IM/pkg/common/constant"
 | 
			
		||||
 | 
			
		||||
	"github.com/gin-gonic/gin"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func BroadcastMessage(c *gin.Context) {
 | 
			
		||||
	var (
 | 
			
		||||
		reqPb pbMessage.BoradcastMessageReq
 | 
			
		||||
	)
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImMessageCMSName)
 | 
			
		||||
	client := pbMessage.NewMessageCMSClient(etcdConn)
 | 
			
		||||
	_, err := client.BoradcastMessage(context.Background(), &reqPb)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(reqPb.OperationID, utils.GetSelfFuncName(), "GetChatLogs rpc failed", err.Error())
 | 
			
		||||
		openIMHttp.RespHttp200(c, err, nil)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	openIMHttp.RespHttp200(c, constant.OK, nil)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func MassSendMassage(c *gin.Context) {
 | 
			
		||||
	var (
 | 
			
		||||
		reqPb pbMessage.MassSendMessageReq
 | 
			
		||||
	)
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImMessageCMSName)
 | 
			
		||||
	client := pbMessage.NewMessageCMSClient(etcdConn)
 | 
			
		||||
	_, err := client.MassSendMessage(context.Background(), &reqPb)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(reqPb.OperationID, utils.GetSelfFuncName(), "GetChatLogs rpc failed", err.Error())
 | 
			
		||||
		openIMHttp.RespHttp200(c, err, nil)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	openIMHttp.RespHttp200(c, constant.OK, nil)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func WithdrawMessage(c *gin.Context) {
 | 
			
		||||
	var (
 | 
			
		||||
		reqPb pbMessage.WithdrawMessageReq
 | 
			
		||||
	)
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImMessageCMSName)
 | 
			
		||||
	client := pbMessage.NewMessageCMSClient(etcdConn)
 | 
			
		||||
	_, err := client.WithdrawMessage(context.Background(), &reqPb)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(reqPb.OperationID, utils.GetSelfFuncName(), "GetChatLogs rpc failed", err.Error())
 | 
			
		||||
		openIMHttp.RespHttp200(c, err, nil)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	openIMHttp.RespHttp200(c, constant.OK, nil)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func GetChatLogs(c *gin.Context) {
 | 
			
		||||
	var (
 | 
			
		||||
		req   cms_api_struct.GetChatLogsRequest
 | 
			
		||||
		resp  cms_api_struct.GetChatLogsResponse
 | 
			
		||||
		reqPb pbMessage.GetChatLogsReq
 | 
			
		||||
	)
 | 
			
		||||
	if err := c.ShouldBindQuery(&req); err != nil {
 | 
			
		||||
		log.NewError(reqPb.OperationID, utils.GetSelfFuncName(), "ShouldBindQuery failed ", err.Error())
 | 
			
		||||
		openIMHttp.RespHttp200(c, constant.ErrArgs, resp)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	reqPb.Pagination = &pbCommon.RequestPagination{
 | 
			
		||||
		PageNumber: int32(req.PageNumber),
 | 
			
		||||
		ShowNumber: int32(req.ShowNumber),
 | 
			
		||||
	}
 | 
			
		||||
	utils.CopyStructFields(&reqPb, &req)
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImMessageCMSName)
 | 
			
		||||
	client := pbMessage.NewMessageCMSClient(etcdConn)
 | 
			
		||||
	respPb, err := client.GetChatLogs(context.Background(), &reqPb)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(reqPb.OperationID, utils.GetSelfFuncName(), "GetChatLogs rpc failed", err.Error())
 | 
			
		||||
		openIMHttp.RespHttp200(c, err, resp)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	//utils.CopyStructFields(&resp, &respPb)
 | 
			
		||||
	for _, chatLog := range respPb.ChatLogs {
 | 
			
		||||
		resp.ChatLogs = append(resp.ChatLogs, cms_api_struct.ChatLog{
 | 
			
		||||
			SessionType:      int(chatLog.SessionType),
 | 
			
		||||
			ContentType:      int(chatLog.ContentType),
 | 
			
		||||
			SenderNickName:   chatLog.SenderNickName,
 | 
			
		||||
			SenderId:         chatLog.SenderId,
 | 
			
		||||
			SearchContent:    chatLog.SearchContent,
 | 
			
		||||
			WholeContent:     chatLog.WholeContent,
 | 
			
		||||
			ReceiverNickName: chatLog.ReciverNickName,
 | 
			
		||||
			ReceiverID:       chatLog.ReciverId,
 | 
			
		||||
			GroupName:        chatLog.GroupName,
 | 
			
		||||
			GroupId:          chatLog.GroupId,
 | 
			
		||||
			Date:             chatLog.Date,
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
	resp.ShowNumber = int(respPb.Pagination.ShowNumber)
 | 
			
		||||
	resp.CurrentPage = int(respPb.Pagination.CurrentPage)
 | 
			
		||||
	resp.ChatLogsNum = int(respPb.ChatLogsNum)
 | 
			
		||||
	openIMHttp.RespHttp200(c, constant.OK, resp)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										23
									
								
								internal/cms_api/middleware/cors.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								internal/cms_api/middleware/cors.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,23 @@
 | 
			
		||||
package middleware
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/gin-gonic/gin"
 | 
			
		||||
	"net/http"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func CorsHandler() gin.HandlerFunc {
 | 
			
		||||
	return func(context *gin.Context) {
 | 
			
		||||
		context.Writer.Header().Set("Access-Control-Allow-Origin", "*")
 | 
			
		||||
		context.Header("Access-Control-Allow-Methods", "*")
 | 
			
		||||
		context.Header("Access-Control-Allow-Headers", "*")
 | 
			
		||||
		context.Header("Access-Control-Expose-Headers", "Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers,Cache-Control,Content-Language,Content-Type,Expires,Last-Modified,Pragma,FooBar") // 跨域关键设置 让浏览器可以解析
 | 
			
		||||
		context.Header("Access-Control-Max-Age", "172800")                                                                                                                                                           // 缓存请求信息 单位为秒
 | 
			
		||||
		context.Header("Access-Control-Allow-Credentials", "false")                                                                                                                                                  //  跨域请求是否需要带cookie信息 默认设置为true
 | 
			
		||||
		context.Header("content-type", "application/json")                                                                                                                                                           // 设置返回格式是json
 | 
			
		||||
		//Release all option pre-requests
 | 
			
		||||
		if context.Request.Method == http.MethodOptions {
 | 
			
		||||
			context.JSON(http.StatusOK, "Options Request!")
 | 
			
		||||
		}
 | 
			
		||||
		context.Next()
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										24
									
								
								internal/cms_api/middleware/jwt_auth.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								internal/cms_api/middleware/jwt_auth.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,24 @@
 | 
			
		||||
package middleware
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"Open_IM/pkg/common/constant"
 | 
			
		||||
	"Open_IM/pkg/common/http"
 | 
			
		||||
	"Open_IM/pkg/common/log"
 | 
			
		||||
	"Open_IM/pkg/common/token_verify"
 | 
			
		||||
	"Open_IM/pkg/utils"
 | 
			
		||||
	"github.com/gin-gonic/gin"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func JWTAuth() gin.HandlerFunc {
 | 
			
		||||
	return func(c *gin.Context) {
 | 
			
		||||
		ok, userID := token_verify.GetUserIDFromToken(c.Request.Header.Get("token"))
 | 
			
		||||
		log.NewInfo("0", utils.GetSelfFuncName(), "userID: ", userID)
 | 
			
		||||
		c.Set("userID", userID)
 | 
			
		||||
		if !ok {
 | 
			
		||||
			log.NewError("","GetUserIDFromToken false ", c.Request.Header.Get("token"))
 | 
			
		||||
			c.Abort()
 | 
			
		||||
			http.RespHttp200(c, constant.ErrParseToken, nil)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										49
									
								
								internal/cms_api/organization/organization.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								internal/cms_api/organization/organization.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,49 @@
 | 
			
		||||
package organization
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/gin-gonic/gin"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func GetStaffs(c *gin.Context) {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func GetOrganizations(c *gin.Context) {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func GetSquads(c *gin.Context) {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func AlterStaff(c *gin.Context) {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func AddOrganization(c *gin.Context) {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func InquireOrganization(g *gin.Context) {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func AlterOrganization(c *gin.Context) {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func DeleteOrganization(g *gin.Context) {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func GetOrganizationSquads(c *gin.Context) {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func AlterStaffsInfo(c *gin.Context) {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func AddChildOrganization(c *gin.Context) {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										95
									
								
								internal/cms_api/router.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										95
									
								
								internal/cms_api/router.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,95 @@
 | 
			
		||||
package cms_api
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"Open_IM/internal/cms_api/admin"
 | 
			
		||||
	"Open_IM/internal/cms_api/group"
 | 
			
		||||
	messageCMS "Open_IM/internal/cms_api/message_cms"
 | 
			
		||||
	"Open_IM/internal/cms_api/middleware"
 | 
			
		||||
	"Open_IM/internal/cms_api/organization"
 | 
			
		||||
	"Open_IM/internal/cms_api/statistics"
 | 
			
		||||
	"Open_IM/internal/cms_api/user"
 | 
			
		||||
 | 
			
		||||
	"github.com/gin-gonic/gin"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func NewGinRouter() *gin.Engine {
 | 
			
		||||
	gin.SetMode(gin.ReleaseMode)
 | 
			
		||||
	baseRouter := gin.Default()
 | 
			
		||||
	router := baseRouter.Group("/api")
 | 
			
		||||
	router.Use(middleware.CorsHandler())
 | 
			
		||||
	adminRouterGroup := router.Group("/admin")
 | 
			
		||||
	{
 | 
			
		||||
		adminRouterGroup.POST("/login", admin.AdminLogin)
 | 
			
		||||
	}
 | 
			
		||||
	r2 := router.Group("")
 | 
			
		||||
	r2.Use(middleware.JWTAuth())
 | 
			
		||||
	statisticsRouterGroup := r2.Group("/statistics")
 | 
			
		||||
	{
 | 
			
		||||
		statisticsRouterGroup.GET("/get_messages_statistics", statistics.GetMessagesStatistics)
 | 
			
		||||
		statisticsRouterGroup.GET("/get_user_statistics", statistics.GetUserStatistics)
 | 
			
		||||
		statisticsRouterGroup.GET("/get_group_statistics", statistics.GetGroupStatistics)
 | 
			
		||||
		statisticsRouterGroup.GET("/get_active_user", statistics.GetActiveUser)
 | 
			
		||||
		statisticsRouterGroup.GET("/get_active_group", statistics.GetActiveGroup)
 | 
			
		||||
	}
 | 
			
		||||
	organizationRouterGroup := r2.Group("/organization")
 | 
			
		||||
	{
 | 
			
		||||
		organizationRouterGroup.GET("/get_staffs", organization.GetStaffs)
 | 
			
		||||
		organizationRouterGroup.GET("/get_organizations", organization.GetOrganizations)
 | 
			
		||||
		organizationRouterGroup.GET("/get_squad", organization.GetSquads)
 | 
			
		||||
		organizationRouterGroup.POST("/add_organization", organization.AddOrganization)
 | 
			
		||||
		organizationRouterGroup.POST("/alter_staff", organization.AlterStaff)
 | 
			
		||||
		organizationRouterGroup.GET("/inquire_organization", organization.InquireOrganization)
 | 
			
		||||
		organizationRouterGroup.POST("/alter_organization", organization.AlterOrganization)
 | 
			
		||||
		organizationRouterGroup.POST("/delete_organization", organization.DeleteOrganization)
 | 
			
		||||
		organizationRouterGroup.POST("/get_organization_squad", organization.GetOrganizationSquads)
 | 
			
		||||
		organizationRouterGroup.PATCH("/alter_corps_info", organization.AlterStaffsInfo)
 | 
			
		||||
		organizationRouterGroup.POST("/add_child_org", organization.AddChildOrganization)
 | 
			
		||||
	}
 | 
			
		||||
	groupRouterGroup := r2.Group("/group")
 | 
			
		||||
	{
 | 
			
		||||
		groupRouterGroup.GET("/get_group_by_id", group.GetGroupById)
 | 
			
		||||
		groupRouterGroup.GET("/get_groups", group.GetGroups)
 | 
			
		||||
		groupRouterGroup.GET("/get_group_by_name", group.GetGroupByName)
 | 
			
		||||
		groupRouterGroup.GET("/get_group_members", group.GetGroupMembers)
 | 
			
		||||
		groupRouterGroup.POST("/create_group", group.CreateGroup)
 | 
			
		||||
		groupRouterGroup.POST("/add_members", group.AddGroupMembers)
 | 
			
		||||
		groupRouterGroup.POST("/remove_members", group.RemoveGroupMembers)
 | 
			
		||||
		groupRouterGroup.POST("/ban_group_private_chat", group.BanPrivateChat)
 | 
			
		||||
		groupRouterGroup.POST("/open_group_private_chat", group.OpenPrivateChat)
 | 
			
		||||
		groupRouterGroup.POST("/ban_group_chat", group.BanGroupChat)
 | 
			
		||||
		groupRouterGroup.POST("/open_group_chat", group.OpenGroupChat)
 | 
			
		||||
		groupRouterGroup.POST("/delete_group", group.DeleteGroup)
 | 
			
		||||
		groupRouterGroup.POST("/get_members_in_group", group.GetGroupMembers)
 | 
			
		||||
		groupRouterGroup.POST("/set_group_master", group.SetGroupMaster)
 | 
			
		||||
		groupRouterGroup.POST("/set_group_ordinary_user", group.SetGroupOrdinaryUsers)
 | 
			
		||||
		groupRouterGroup.POST("/alter_group_info", group.AlterGroupInfo)
 | 
			
		||||
	}
 | 
			
		||||
	userRouterGroup := r2.Group("/user")
 | 
			
		||||
	{
 | 
			
		||||
		userRouterGroup.POST("/resign", user.ResignUser)
 | 
			
		||||
		userRouterGroup.GET("/get_user", user.GetUserById)
 | 
			
		||||
		userRouterGroup.POST("/alter_user", user.AlterUser)
 | 
			
		||||
		userRouterGroup.GET("/get_users", user.GetUsers)
 | 
			
		||||
		userRouterGroup.POST("/add_user", user.AddUser)
 | 
			
		||||
		userRouterGroup.POST("/unblock_user", user.UnblockUser)
 | 
			
		||||
		userRouterGroup.POST("/block_user", user.BlockUser)
 | 
			
		||||
		userRouterGroup.GET("/get_block_users", user.GetBlockUsers)
 | 
			
		||||
		userRouterGroup.GET("/get_block_user", user.GetBlockUserById)
 | 
			
		||||
		userRouterGroup.POST("/delete_user", user.DeleteUser)
 | 
			
		||||
		userRouterGroup.GET("/get_users_by_name", user.GetUsersByName)
 | 
			
		||||
	}
 | 
			
		||||
	friendRouterGroup := r2.Group("/friend")
 | 
			
		||||
	{
 | 
			
		||||
		friendRouterGroup.POST("/get_friends_by_id")
 | 
			
		||||
		friendRouterGroup.POST("/set_friend")
 | 
			
		||||
		friendRouterGroup.POST("/remove_friend")
 | 
			
		||||
	}
 | 
			
		||||
	messageCMSRouterGroup := r2.Group("/message")
 | 
			
		||||
	{
 | 
			
		||||
		messageCMSRouterGroup.GET("/get_chat_logs", messageCMS.GetChatLogs)
 | 
			
		||||
		messageCMSRouterGroup.POST("/broadcast_message", messageCMS.BroadcastMessage)
 | 
			
		||||
		messageCMSRouterGroup.POST("/mass_send_message", messageCMS.MassSendMassage)
 | 
			
		||||
		messageCMSRouterGroup.POST("/withdraw_message", messageCMS.WithdrawMessage)
 | 
			
		||||
	}
 | 
			
		||||
	return baseRouter
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										224
									
								
								internal/cms_api/statistics/statistics.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										224
									
								
								internal/cms_api/statistics/statistics.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,224 @@
 | 
			
		||||
package statistics
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"Open_IM/pkg/cms_api_struct"
 | 
			
		||||
	"Open_IM/pkg/common/config"
 | 
			
		||||
	"Open_IM/pkg/common/constant"
 | 
			
		||||
	openIMHttp "Open_IM/pkg/common/http"
 | 
			
		||||
	"Open_IM/pkg/common/log"
 | 
			
		||||
	"Open_IM/pkg/grpc-etcdv3/getcdv3"
 | 
			
		||||
	pb "Open_IM/pkg/proto/statistics"
 | 
			
		||||
	"Open_IM/pkg/utils"
 | 
			
		||||
	"context"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	"github.com/gin-gonic/gin"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func GetMessagesStatistics(c *gin.Context) {
 | 
			
		||||
	var (
 | 
			
		||||
		req   cms_api_struct.GetMessageStatisticsRequest
 | 
			
		||||
		resp  cms_api_struct.GetMessageStatisticsResponse
 | 
			
		||||
		reqPb pb.GetMessageStatisticsReq
 | 
			
		||||
	)
 | 
			
		||||
	reqPb.StatisticsReq = &pb.StatisticsReq{}
 | 
			
		||||
	if err := c.ShouldBindQuery(&req); err != nil {
 | 
			
		||||
		log.NewError("0", utils.GetSelfFuncName(), "BindJSON failed ", err.Error())
 | 
			
		||||
		openIMHttp.RespHttp200(c, constant.ErrArgs, nil)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	utils.CopyStructFields(&reqPb.StatisticsReq, &req)
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImStatisticsName)
 | 
			
		||||
	client := pb.NewUserClient(etcdConn)
 | 
			
		||||
	respPb, err := client.GetMessageStatistics(context.Background(), &reqPb)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(reqPb.OperationID, utils.GetSelfFuncName(), "GetMessageStatistics failed", err.Error())
 | 
			
		||||
		openIMHttp.RespHttp200(c, err, resp)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	// utils.CopyStructFields(&resp, respPb)
 | 
			
		||||
	resp.GroupMessageNum = int(respPb.GroupMessageNum)
 | 
			
		||||
	resp.PrivateMessageNum = int(respPb.PrivateMessageNum)
 | 
			
		||||
	for _, v := range respPb.PrivateMessageNumList {
 | 
			
		||||
		resp.PrivateMessageNumList = append(resp.PrivateMessageNumList, struct {
 | 
			
		||||
			Date       string "json:\"date\""
 | 
			
		||||
			MessageNum int    "json:\"message_num\""
 | 
			
		||||
		}{
 | 
			
		||||
			Date:       v.Date,
 | 
			
		||||
			MessageNum: int(v.Num),
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
	for _, v := range respPb.GroupMessageNumList {
 | 
			
		||||
		resp.GroupMessageNumList = append(resp.GroupMessageNumList, struct {
 | 
			
		||||
			Date       string "json:\"date\""
 | 
			
		||||
			MessageNum int    "json:\"message_num\""
 | 
			
		||||
		}{
 | 
			
		||||
			Date:       v.Date,
 | 
			
		||||
			MessageNum: int(v.Num),
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
	openIMHttp.RespHttp200(c, constant.OK, resp)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func GetUserStatistics(c *gin.Context) {
 | 
			
		||||
	var (
 | 
			
		||||
		req   cms_api_struct.GetUserStatisticsRequest
 | 
			
		||||
		resp  cms_api_struct.GetUserStatisticsResponse
 | 
			
		||||
		reqPb pb.GetUserStatisticsReq
 | 
			
		||||
	)
 | 
			
		||||
	reqPb.StatisticsReq = &pb.StatisticsReq{}
 | 
			
		||||
	if err := c.ShouldBindQuery(&req); err != nil {
 | 
			
		||||
		log.NewError("0", utils.GetSelfFuncName(), "BindJSON failed ", err.Error())
 | 
			
		||||
		openIMHttp.RespHttp200(c, constant.ErrArgs, nil)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	utils.CopyStructFields(&reqPb.StatisticsReq, &req)
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImStatisticsName)
 | 
			
		||||
	client := pb.NewUserClient(etcdConn)
 | 
			
		||||
	respPb, err := client.GetUserStatistics(context.Background(), &reqPb)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError("0", utils.GetSelfFuncName(), "GetUserStatistics failed", err.Error())
 | 
			
		||||
		openIMHttp.RespHttp200(c, err, nil)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	// utils.CopyStructFields(&resp, respPb)
 | 
			
		||||
	resp.ActiveUserNum = int(respPb.ActiveUserNum)
 | 
			
		||||
	resp.IncreaseUserNum = int(respPb.IncreaseUserNum)
 | 
			
		||||
	resp.TotalUserNum = int(respPb.TotalUserNum)
 | 
			
		||||
	for _, v := range respPb.ActiveUserNumList {
 | 
			
		||||
		resp.ActiveUserNumList = append(resp.ActiveUserNumList, struct {
 | 
			
		||||
			Date          string "json:\"date\""
 | 
			
		||||
			ActiveUserNum int    "json:\"active_user_num\""
 | 
			
		||||
		}{
 | 
			
		||||
			Date:          v.Date,
 | 
			
		||||
			ActiveUserNum: int(v.Num),
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
	for _, v := range respPb.IncreaseUserNumList {
 | 
			
		||||
		resp.IncreaseUserNumList = append(resp.IncreaseUserNumList, struct {
 | 
			
		||||
			Date            string "json:\"date\""
 | 
			
		||||
			IncreaseUserNum int    "json:\"increase_user_num\""
 | 
			
		||||
		}{
 | 
			
		||||
			Date:            v.Date,
 | 
			
		||||
			IncreaseUserNum: int(v.Num),
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
	for _, v := range respPb.TotalUserNumList {
 | 
			
		||||
		resp.TotalUserNumList = append(resp.TotalUserNumList, struct {
 | 
			
		||||
			Date         string "json:\"date\""
 | 
			
		||||
			TotalUserNum int    "json:\"total_user_num\""
 | 
			
		||||
		}{
 | 
			
		||||
			Date:         v.Date,
 | 
			
		||||
			TotalUserNum: int(v.Num),
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
	openIMHttp.RespHttp200(c, constant.OK, resp)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func GetGroupStatistics(c *gin.Context) {
 | 
			
		||||
	var (
 | 
			
		||||
		req   cms_api_struct.GetGroupStatisticsRequest
 | 
			
		||||
		resp  cms_api_struct.GetGroupStatisticsResponse
 | 
			
		||||
		reqPb pb.GetGroupStatisticsReq
 | 
			
		||||
	)
 | 
			
		||||
	reqPb.StatisticsReq = &pb.StatisticsReq{}
 | 
			
		||||
	if err := c.ShouldBindQuery(&req); err != nil {
 | 
			
		||||
		log.NewError("0", "BindJSON failed ", err.Error())
 | 
			
		||||
		openIMHttp.RespHttp200(c, constant.ErrArgs, nil)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	utils.CopyStructFields(&reqPb.StatisticsReq, &req)
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImStatisticsName)
 | 
			
		||||
	client := pb.NewUserClient(etcdConn)
 | 
			
		||||
	respPb, err := client.GetGroupStatistics(context.Background(), &reqPb)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(reqPb.OperationID, utils.GetSelfFuncName(), "GetGroupStatistics failed", err.Error())
 | 
			
		||||
		openIMHttp.RespHttp200(c, err, nil)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	// utils.CopyStructFields(&resp, respPb)
 | 
			
		||||
	resp.IncreaseGroupNum = int(respPb.GetIncreaseGroupNum())
 | 
			
		||||
	resp.TotalGroupNum = int(respPb.GetTotalGroupNum())
 | 
			
		||||
	for _, v := range respPb.IncreaseGroupNumList {
 | 
			
		||||
		resp.IncreaseGroupNumList = append(resp.IncreaseGroupNumList,
 | 
			
		||||
			struct {
 | 
			
		||||
				Date             string "json:\"date\""
 | 
			
		||||
				IncreaseGroupNum int    "json:\"increase_group_num\""
 | 
			
		||||
			}{
 | 
			
		||||
				Date:             v.Date,
 | 
			
		||||
				IncreaseGroupNum: int(v.Num),
 | 
			
		||||
			})
 | 
			
		||||
	}
 | 
			
		||||
	for _, v := range respPb.TotalGroupNumList {
 | 
			
		||||
		resp.TotalGroupNumList = append(resp.TotalGroupNumList,
 | 
			
		||||
			struct {
 | 
			
		||||
				Date          string "json:\"date\""
 | 
			
		||||
				TotalGroupNum int    "json:\"total_group_num\""
 | 
			
		||||
			}{
 | 
			
		||||
				Date:          v.Date,
 | 
			
		||||
				TotalGroupNum: int(v.Num),
 | 
			
		||||
			})
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
	openIMHttp.RespHttp200(c, constant.OK, resp)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func GetActiveUser(c *gin.Context) {
 | 
			
		||||
	var (
 | 
			
		||||
		req   cms_api_struct.GetActiveUserRequest
 | 
			
		||||
		resp  cms_api_struct.GetActiveUserResponse
 | 
			
		||||
		reqPb pb.GetActiveUserReq
 | 
			
		||||
	)
 | 
			
		||||
	reqPb.StatisticsReq = &pb.StatisticsReq{}
 | 
			
		||||
	if err := c.ShouldBindQuery(&req); err != nil {
 | 
			
		||||
		log.NewError("0", "BindJSON failed ", err.Error())
 | 
			
		||||
		openIMHttp.RespHttp200(c, constant.ErrArgs, nil)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	utils.CopyStructFields(&reqPb.StatisticsReq, req)
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImStatisticsName)
 | 
			
		||||
	client := pb.NewUserClient(etcdConn)
 | 
			
		||||
	respPb, err := client.GetActiveUser(context.Background(), &reqPb)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(reqPb.OperationID, utils.GetSelfFuncName(), "GetActiveUser failed ", err.Error())
 | 
			
		||||
		openIMHttp.RespHttp200(c, err, nil)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	utils.CopyStructFields(&resp.ActiveUserList, respPb.Users)
 | 
			
		||||
	openIMHttp.RespHttp200(c, constant.OK, resp)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func GetActiveGroup(c *gin.Context) {
 | 
			
		||||
	var (
 | 
			
		||||
		req   cms_api_struct.GetActiveGroupRequest
 | 
			
		||||
		resp  cms_api_struct.GetActiveGroupResponse
 | 
			
		||||
		reqPb pb.GetActiveGroupReq
 | 
			
		||||
	)
 | 
			
		||||
	reqPb.StatisticsReq = &pb.StatisticsReq{}
 | 
			
		||||
	if err := c.ShouldBindQuery(&req); err != nil {
 | 
			
		||||
		log.NewError("0", utils.GetSelfFuncName(), "BindJSON failed ", err.Error())
 | 
			
		||||
		openIMHttp.RespHttp200(c, constant.ErrArgs, nil)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	utils.CopyStructFields(&reqPb.StatisticsReq, req)
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImStatisticsName)
 | 
			
		||||
	client := pb.NewUserClient(etcdConn)
 | 
			
		||||
	respPb, err := client.GetActiveGroup(context.Background(), &reqPb)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError("0", utils.GetSelfFuncName(), "GetActiveGroup failed ", err.Error())
 | 
			
		||||
		openIMHttp.RespHttp200(c, err, nil)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	for _, group := range respPb.Groups {
 | 
			
		||||
		resp.ActiveGroupList = append(resp.ActiveGroupList, struct {
 | 
			
		||||
			GroupName  string "json:\"group_name\""
 | 
			
		||||
			GroupId    string "json:\"group_id\""
 | 
			
		||||
			MessageNum int    "json:\"message_num\""
 | 
			
		||||
		}{
 | 
			
		||||
			GroupName:  group.GroupName,
 | 
			
		||||
			GroupId:    group.GroupId,
 | 
			
		||||
			MessageNum: int(group.MessageNum),
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
	openIMHttp.RespHttp200(c, constant.OK, resp)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										307
									
								
								internal/cms_api/user/user.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										307
									
								
								internal/cms_api/user/user.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,307 @@
 | 
			
		||||
package user
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"Open_IM/pkg/cms_api_struct"
 | 
			
		||||
	"Open_IM/pkg/common/config"
 | 
			
		||||
	"Open_IM/pkg/common/constant"
 | 
			
		||||
	openIMHttp "Open_IM/pkg/common/http"
 | 
			
		||||
	"Open_IM/pkg/common/log"
 | 
			
		||||
	"Open_IM/pkg/grpc-etcdv3/getcdv3"
 | 
			
		||||
	commonPb "Open_IM/pkg/proto/sdk_ws"
 | 
			
		||||
	pb "Open_IM/pkg/proto/user"
 | 
			
		||||
	"Open_IM/pkg/utils"
 | 
			
		||||
	"context"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	"github.com/gin-gonic/gin"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func GetUserById(c *gin.Context) {
 | 
			
		||||
	var (
 | 
			
		||||
		req   cms_api_struct.GetUserRequest
 | 
			
		||||
		resp  cms_api_struct.GetUserResponse
 | 
			
		||||
		reqPb pb.GetUserByIdReq
 | 
			
		||||
	)
 | 
			
		||||
	if err := c.ShouldBindQuery(&req); err != nil {
 | 
			
		||||
		log.NewError(reqPb.OperationID, utils.GetSelfFuncName(), "ShouldBindQuery failed ", err.Error())
 | 
			
		||||
		openIMHttp.RespHttp200(c, constant.ErrArgs, nil)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	utils.CopyStructFields(&reqPb, &req)
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImUserName)
 | 
			
		||||
	client := pb.NewUserClient(etcdConn)
 | 
			
		||||
	respPb, err := client.GetUserById(context.Background(), &reqPb)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(reqPb.OperationID, utils.GetSelfFuncName(), err.Error())
 | 
			
		||||
		openIMHttp.RespHttp200(c, err, nil)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	if respPb.User.UserId == "" {
 | 
			
		||||
		openIMHttp.RespHttp200(c, constant.OK, nil)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	utils.CopyStructFields(&resp, respPb.User)
 | 
			
		||||
	openIMHttp.RespHttp200(c, constant.OK, resp)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func GetUsersByName(c *gin.Context) {
 | 
			
		||||
	var (
 | 
			
		||||
		req cms_api_struct.GetUsersByNameRequest
 | 
			
		||||
		resp cms_api_struct.GetUsersByNameResponse
 | 
			
		||||
		reqPb pb.GetUsersByNameReq
 | 
			
		||||
	)
 | 
			
		||||
	if err := c.ShouldBindQuery(&req); err != nil {
 | 
			
		||||
		log.NewError(reqPb.OperationID, utils.GetSelfFuncName(), "ShouldBindQuery failed", err.Error())
 | 
			
		||||
		openIMHttp.RespHttp200(c, constant.ErrArgs, nil)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	reqPb.UserName = req.UserName
 | 
			
		||||
	reqPb.Pagination = &commonPb.RequestPagination{
 | 
			
		||||
		PageNumber: int32(req.PageNumber),
 | 
			
		||||
		ShowNumber: int32(req.ShowNumber),
 | 
			
		||||
	}
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImUserName)
 | 
			
		||||
	client := pb.NewUserClient(etcdConn)
 | 
			
		||||
	respPb, err := client.GetUsersByName(context.Background(), &reqPb)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(reqPb.OperationID, utils.GetSelfFuncName(), "rpc", err.Error())
 | 
			
		||||
		openIMHttp.RespHttp200(c, err, nil)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	utils.CopyStructFields(&resp.Users, respPb.Users)
 | 
			
		||||
	resp.ShowNumber = int(respPb.Pagination.ShowNumber)
 | 
			
		||||
	resp.CurrentPage = int(respPb.Pagination.CurrentPage)
 | 
			
		||||
	resp.UserNums = respPb.UserNums
 | 
			
		||||
	openIMHttp.RespHttp200(c, constant.OK, resp)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func GetUsers(c *gin.Context) {
 | 
			
		||||
	var (
 | 
			
		||||
		req   cms_api_struct.GetUsersRequest
 | 
			
		||||
		resp  cms_api_struct.GetUsersResponse
 | 
			
		||||
		reqPb pb.GetUsersReq
 | 
			
		||||
	)
 | 
			
		||||
	reqPb.Pagination = &commonPb.RequestPagination{}
 | 
			
		||||
	if err := c.ShouldBindQuery(&req); err != nil {
 | 
			
		||||
		log.NewError("0", "ShouldBindQuery failed ", err.Error())
 | 
			
		||||
		openIMHttp.RespHttp200(c, constant.ErrArgs, nil)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	utils.CopyStructFields(&reqPb.Pagination, &req)
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImUserName)
 | 
			
		||||
	client := pb.NewUserClient(etcdConn)
 | 
			
		||||
	respPb, err := client.GetUsers(context.Background(), &reqPb)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		openIMHttp.RespHttp200(c, err, resp)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	utils.CopyStructFields(&resp.Users, respPb.User)
 | 
			
		||||
	resp.ShowNumber = int(respPb.Pagination.ShowNumber)
 | 
			
		||||
	resp.CurrentPage = int(respPb.Pagination.CurrentPage)
 | 
			
		||||
	resp.UserNums = respPb.UserNums
 | 
			
		||||
	openIMHttp.RespHttp200(c, constant.OK, resp)
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func ResignUser(c *gin.Context) {
 | 
			
		||||
	var (
 | 
			
		||||
		req   cms_api_struct.ResignUserRequest
 | 
			
		||||
		resp  cms_api_struct.ResignUserResponse
 | 
			
		||||
		reqPb pb.ResignUserReq
 | 
			
		||||
	)
 | 
			
		||||
	if err := c.ShouldBind(&req); err != nil {
 | 
			
		||||
		log.NewError("0", "BindJSON failed ", err.Error())
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"errCode": http.StatusBadRequest, "errMsg": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	utils.CopyStructFields(&reqPb, &req)
 | 
			
		||||
	fmt.Println(reqPb.UserId)
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImUserName)
 | 
			
		||||
	client := pb.NewUserClient(etcdConn)
 | 
			
		||||
	_, err := client.ResignUser(context.Background(), &reqPb)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		openIMHttp.RespHttp200(c, err, resp)
 | 
			
		||||
	}
 | 
			
		||||
	openIMHttp.RespHttp200(c, constant.OK, resp)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func AlterUser(c *gin.Context) {
 | 
			
		||||
	var (
 | 
			
		||||
		req   cms_api_struct.AlterUserRequest
 | 
			
		||||
		resp  cms_api_struct.AlterUserResponse
 | 
			
		||||
		reqPb pb.AlterUserReq
 | 
			
		||||
	)
 | 
			
		||||
	if err := c.BindJSON(&req); err != nil {
 | 
			
		||||
		log.NewError("0", "BindJSON failed ", err.Error())
 | 
			
		||||
		openIMHttp.RespHttp200(c, constant.ErrArgs, resp)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	utils.CopyStructFields(&reqPb, &req)
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImUserName)
 | 
			
		||||
	client := pb.NewUserClient(etcdConn)
 | 
			
		||||
	_, err := client.AlterUser(context.Background(), &reqPb)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError("0", "microserver failed ", err.Error())
 | 
			
		||||
		openIMHttp.RespHttp200(c, err, nil)
 | 
			
		||||
	}
 | 
			
		||||
	openIMHttp.RespHttp200(c, constant.OK, nil)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func AddUser(c *gin.Context) {
 | 
			
		||||
	var (
 | 
			
		||||
		req   cms_api_struct.AddUserRequest
 | 
			
		||||
		reqPb pb.AddUserReq
 | 
			
		||||
	)
 | 
			
		||||
	if err := c.BindJSON(&req); err != nil {
 | 
			
		||||
		log.NewError(reqPb.OperationID, utils.GetSelfFuncName(), "BindJSON failed ", err.Error())
 | 
			
		||||
		openIMHttp.RespHttp200(c, constant.ErrArgs, nil)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	utils.CopyStructFields(&reqPb, &req)
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImUserName)
 | 
			
		||||
	client := pb.NewUserClient(etcdConn)
 | 
			
		||||
	_, err := client.AddUser(context.Background(), &reqPb)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		openIMHttp.RespHttp200(c, err, nil)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	openIMHttp.RespHttp200(c, constant.OK, nil)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func BlockUser(c *gin.Context) {
 | 
			
		||||
	var (
 | 
			
		||||
		req   cms_api_struct.BlockUserRequest
 | 
			
		||||
		resp  cms_api_struct.BlockUserResponse
 | 
			
		||||
		reqPb pb.BlockUserReq
 | 
			
		||||
	)
 | 
			
		||||
	if err := c.BindJSON(&req); err != nil {
 | 
			
		||||
		fmt.Println(err)
 | 
			
		||||
		log.NewError("0", "BindJSON failed ", err.Error())
 | 
			
		||||
		openIMHttp.RespHttp200(c, constant.ErrArgs, resp)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	utils.CopyStructFields(&reqPb, &req)
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImUserName)
 | 
			
		||||
	client := pb.NewUserClient(etcdConn)
 | 
			
		||||
	fmt.Println(reqPb)
 | 
			
		||||
	_, err := client.BlockUser(context.Background(), &reqPb)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		openIMHttp.RespHttp200(c, err, resp)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	openIMHttp.RespHttp200(c, constant.OK, resp)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func UnblockUser(c *gin.Context) {
 | 
			
		||||
	var (
 | 
			
		||||
		req   cms_api_struct.UnblockUserRequest
 | 
			
		||||
		resp  cms_api_struct.UnBlockUserResponse
 | 
			
		||||
		reqPb pb.UnBlockUserReq
 | 
			
		||||
	)
 | 
			
		||||
	if err := c.ShouldBind(&req); err != nil {
 | 
			
		||||
		log.NewError("0", "BindJSON failed ", err.Error())
 | 
			
		||||
		openIMHttp.RespHttp200(c, constant.ErrArgs, resp)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	utils.CopyStructFields(&reqPb, &req)
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImUserName)
 | 
			
		||||
	client := pb.NewUserClient(etcdConn)
 | 
			
		||||
	_, err := client.UnBlockUser(context.Background(), &reqPb)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		openIMHttp.RespHttp200(c, err, resp)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	openIMHttp.RespHttp200(c, constant.OK, resp)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func GetBlockUsers(c *gin.Context) {
 | 
			
		||||
	var (
 | 
			
		||||
		req    cms_api_struct.GetBlockUsersRequest
 | 
			
		||||
		resp   cms_api_struct.GetBlockUsersResponse
 | 
			
		||||
		reqPb  pb.GetBlockUsersReq
 | 
			
		||||
		respPb *pb.GetBlockUsersResp
 | 
			
		||||
	)
 | 
			
		||||
	reqPb.Pagination = &commonPb.RequestPagination{}
 | 
			
		||||
	if err := c.ShouldBindQuery(&req); err != nil {
 | 
			
		||||
		log.NewError(reqPb.OperationID, utils.GetSelfFuncName(), "ShouldBindQuery failed ", err.Error())
 | 
			
		||||
		openIMHttp.RespHttp200(c, constant.ErrArgs, resp)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	utils.CopyStructFields(&reqPb.Pagination, &req)
 | 
			
		||||
	log.NewInfo(reqPb.OperationID, utils.GetSelfFuncName(), "blockUsers", reqPb.Pagination, req)
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImUserName)
 | 
			
		||||
	client := pb.NewUserClient(etcdConn)
 | 
			
		||||
	respPb, err := client.GetBlockUsers(context.Background(), &reqPb)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(reqPb.OperationID, utils.GetSelfFuncName(), "GetBlockUsers rpc", err.Error())
 | 
			
		||||
		openIMHttp.RespHttp200(c, err, resp)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	for _, v := range respPb.BlockUsers {
 | 
			
		||||
		resp.BlockUsers = append(resp.BlockUsers, cms_api_struct.BlockUser{
 | 
			
		||||
			UserResponse: cms_api_struct.UserResponse{
 | 
			
		||||
				UserId:       v.User.UserId,
 | 
			
		||||
				ProfilePhoto: v.User.ProfilePhoto,
 | 
			
		||||
				Nickname:     v.User.Nickname,
 | 
			
		||||
				IsBlock:      v.User.IsBlock,
 | 
			
		||||
				CreateTime:   v.User.CreateTime,
 | 
			
		||||
			},
 | 
			
		||||
			BeginDisableTime: v.BeginDisableTime,
 | 
			
		||||
			EndDisableTime:   v.EndDisableTime,
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
	resp.ShowNumber = int(respPb.Pagination.ShowNumber)
 | 
			
		||||
	resp.CurrentPage = int(respPb.Pagination.CurrentPage)
 | 
			
		||||
	resp.UserNums = respPb.UserNums
 | 
			
		||||
	openIMHttp.RespHttp200(c, constant.OK, resp)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func GetBlockUserById(c *gin.Context) {
 | 
			
		||||
	var (
 | 
			
		||||
		req   cms_api_struct.GetBlockUserRequest
 | 
			
		||||
		resp  cms_api_struct.GetBlockUserResponse
 | 
			
		||||
		reqPb pb.GetBlockUserByIdReq
 | 
			
		||||
	)
 | 
			
		||||
	if err := c.ShouldBindQuery(&req); err != nil {
 | 
			
		||||
		log.NewError("0", "BindJSON failed ", err.Error())
 | 
			
		||||
		openIMHttp.RespHttp200(c, constant.ErrArgs, nil)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	reqPb.UserId = req.UserId
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImUserName)
 | 
			
		||||
	client := pb.NewUserClient(etcdConn)
 | 
			
		||||
	respPb, err := client.GetBlockUserById(context.Background(), &reqPb)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError("0", "GetBlockUserById rpc failed ", err.Error())
 | 
			
		||||
		openIMHttp.RespHttp200(c, err, nil)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	resp.EndDisableTime = respPb.BlockUser.EndDisableTime
 | 
			
		||||
	resp.BeginDisableTime = respPb.BlockUser.BeginDisableTime
 | 
			
		||||
	utils.CopyStructFields(&resp, respPb.BlockUser.User)
 | 
			
		||||
	openIMHttp.RespHttp200(c, constant.OK, resp)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func DeleteUser(c *gin.Context) {
 | 
			
		||||
	var (
 | 
			
		||||
		req   cms_api_struct.DeleteUserRequest
 | 
			
		||||
		reqPb pb.DeleteUserReq
 | 
			
		||||
	)
 | 
			
		||||
	if err := c.BindJSON(&req); err != nil {
 | 
			
		||||
		log.NewError("0", "BindJSON failed ", err.Error())
 | 
			
		||||
		openIMHttp.RespHttp200(c, constant.ErrArgs, nil)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	reqPb.UserId = req.UserId
 | 
			
		||||
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImUserName)
 | 
			
		||||
	client := pb.NewUserClient(etcdConn)
 | 
			
		||||
	_, err := client.DeleteUser(context.Background(), &reqPb)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError("0", "DeleteUser rpc failed ", err.Error())
 | 
			
		||||
		openIMHttp.RespHttp200(c, err, nil)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	openIMHttp.RespHttp200(c, constant.OK, nil)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										70
									
								
								internal/demo/register/login.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								internal/demo/register/login.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,70 @@
 | 
			
		||||
package register
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	api "Open_IM/pkg/base_info"
 | 
			
		||||
	"Open_IM/pkg/common/config"
 | 
			
		||||
	"Open_IM/pkg/common/constant"
 | 
			
		||||
	"Open_IM/pkg/common/db/mysql_model/im_mysql_model"
 | 
			
		||||
	http2 "Open_IM/pkg/common/http"
 | 
			
		||||
	"Open_IM/pkg/common/log"
 | 
			
		||||
	"Open_IM/pkg/utils"
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"github.com/gin-gonic/gin"
 | 
			
		||||
	"net/http"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type ParamsLogin struct {
 | 
			
		||||
	Email       string `json:"email"`
 | 
			
		||||
	PhoneNumber string `json:"phoneNumber"`
 | 
			
		||||
	Password    string `json:"password"`
 | 
			
		||||
	Platform    int32  `json:"platform"`
 | 
			
		||||
	OperationID string `json:"operationID" binding:"required"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func Login(c *gin.Context) {
 | 
			
		||||
	params := ParamsLogin{}
 | 
			
		||||
	if err := c.BindJSON(¶ms); err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"errCode": constant.FormattingError, "errMsg": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	var account string
 | 
			
		||||
	if params.Email != "" {
 | 
			
		||||
		account = params.Email
 | 
			
		||||
	} else {
 | 
			
		||||
		account = params.PhoneNumber
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	r, err := im_mysql_model.GetRegister(account)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(params.OperationID, "user have not register", params.Password, account, err.Error())
 | 
			
		||||
		c.JSON(http.StatusOK, gin.H{"errCode": constant.NotRegistered, "errMsg": "Mobile phone number is not registered"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	if r.Password != params.Password {
 | 
			
		||||
		log.NewError(params.OperationID, "password err", params.Password, account, r.Password, r.Account)
 | 
			
		||||
		c.JSON(http.StatusOK, gin.H{"errCode": constant.PasswordErr, "errMsg": "password err"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	url := fmt.Sprintf("http://%s:10000/auth/user_token", utils.ServerIP)
 | 
			
		||||
	openIMGetUserToken := api.UserTokenReq{}
 | 
			
		||||
	openIMGetUserToken.OperationID = params.OperationID
 | 
			
		||||
	openIMGetUserToken.Platform = params.Platform
 | 
			
		||||
	openIMGetUserToken.Secret = config.Config.Secret
 | 
			
		||||
	openIMGetUserToken.UserID = account
 | 
			
		||||
	openIMGetUserTokenResp := api.UserTokenResp{}
 | 
			
		||||
	bMsg, err := http2.Post(url, openIMGetUserToken, 2)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(params.OperationID, "request openIM get user token error", account, "err", err.Error())
 | 
			
		||||
		c.JSON(http.StatusOK, gin.H{"errCode": constant.GetIMTokenErr, "errMsg": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	err = json.Unmarshal(bMsg, &openIMGetUserTokenResp)
 | 
			
		||||
	if err != nil || openIMGetUserTokenResp.ErrCode != 0 {
 | 
			
		||||
		log.NewError(params.OperationID, "request get user token", account, "err", "")
 | 
			
		||||
		c.JSON(http.StatusOK, gin.H{"errCode": constant.GetIMTokenErr, "errMsg": ""})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	c.JSON(http.StatusOK, gin.H{"errCode": constant.NoError, "errMsg": "", "data": openIMGetUserTokenResp.UserToken})
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										56
									
								
								internal/demo/register/reset_password.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								internal/demo/register/reset_password.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,56 @@
 | 
			
		||||
package register
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"Open_IM/pkg/common/config"
 | 
			
		||||
	"Open_IM/pkg/common/constant"
 | 
			
		||||
	"Open_IM/pkg/common/db"
 | 
			
		||||
	"Open_IM/pkg/common/db/mysql_model/im_mysql_model"
 | 
			
		||||
	"Open_IM/pkg/common/log"
 | 
			
		||||
	"Open_IM/pkg/utils"
 | 
			
		||||
	"github.com/gin-gonic/gin"
 | 
			
		||||
	"net/http"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type resetPasswordRequest struct {
 | 
			
		||||
	VerificationCode string `json:"verificationCode" binding:"required"`
 | 
			
		||||
	Email            string `json:"email"`
 | 
			
		||||
	PhoneNumber      string `json:"phoneNumber"`
 | 
			
		||||
	NewPassword string `json:"newPassword" binding:"required"`
 | 
			
		||||
	OperationID string `json:"operationID"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func ResetPassword(c *gin.Context) {
 | 
			
		||||
	var (
 | 
			
		||||
		req resetPasswordRequest
 | 
			
		||||
	)
 | 
			
		||||
	if err := c.BindJSON(&req); err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"errCode": constant.FormattingError, "errMsg": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	var account string
 | 
			
		||||
	if req.Email != "" {
 | 
			
		||||
		account = req.Email
 | 
			
		||||
	} else {
 | 
			
		||||
		account = req.PhoneNumber
 | 
			
		||||
	}
 | 
			
		||||
	if req.VerificationCode != config.Config.Demo.SuperCode {
 | 
			
		||||
		accountKey := account + "_" + constant.VerificationCodeForResetSuffix
 | 
			
		||||
		v, err := db.DB.GetAccountCode(accountKey)
 | 
			
		||||
		if err != nil || v != req.VerificationCode {
 | 
			
		||||
			log.NewError(req.OperationID, "password Verification code error", account, req.VerificationCode, v)
 | 
			
		||||
			c.JSON(http.StatusOK, gin.H{"errCode": constant.CodeInvalidOrExpired, "errMsg": "Verification code error!"})
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	user, err := im_mysql_model.GetRegister(account)
 | 
			
		||||
	if err != nil || user.Account == "" {
 | 
			
		||||
		log.NewError(req.OperationID, utils.GetSelfFuncName(), "get register error", err.Error())
 | 
			
		||||
		c.JSON(http.StatusOK, gin.H{"errCode": constant.NotRegistered, "errMsg": "user not register!"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	if err := im_mysql_model.ResetPassword(account, req.NewPassword); err != nil {
 | 
			
		||||
		c.JSON(http.StatusOK, gin.H{"errCode": constant.ResetPasswordFailed, "errMsg": "reset password failed: "+err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	c.JSON(http.StatusOK, gin.H{"errCode": constant.NoError, "errMsg": "reset password success"})
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										130
									
								
								internal/demo/register/send_code.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										130
									
								
								internal/demo/register/send_code.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,130 @@
 | 
			
		||||
package register
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"Open_IM/pkg/common/config"
 | 
			
		||||
	"Open_IM/pkg/common/constant"
 | 
			
		||||
	"Open_IM/pkg/common/db"
 | 
			
		||||
	"Open_IM/pkg/common/db/mysql_model/im_mysql_model"
 | 
			
		||||
	"Open_IM/pkg/common/log"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	openapi "github.com/alibabacloud-go/darabonba-openapi/client"
 | 
			
		||||
	dysmsapi20170525 "github.com/alibabacloud-go/dysmsapi-20170525/v2/client"
 | 
			
		||||
	"github.com/alibabacloud-go/tea/tea"
 | 
			
		||||
	"github.com/gin-gonic/gin"
 | 
			
		||||
	"gopkg.in/gomail.v2"
 | 
			
		||||
	"math/rand"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"time"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type paramsVerificationCode struct {
 | 
			
		||||
	Email       string `json:"email"`
 | 
			
		||||
	PhoneNumber string `json:"phoneNumber"`
 | 
			
		||||
	OperationID string `json:"operationID" binding:"required"`
 | 
			
		||||
	UsedFor     int `json:"usedFor"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SendVerificationCode(c *gin.Context) {
 | 
			
		||||
	params := paramsVerificationCode{}
 | 
			
		||||
	if err := c.BindJSON(¶ms); err != nil {
 | 
			
		||||
		log.NewError("", "BindJSON failed", "err:", err.Error(), "phoneNumber", params.PhoneNumber, "email", params.Email)
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"errCode": constant.FormattingError, "errMsg": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	var account string
 | 
			
		||||
	if params.Email != "" {
 | 
			
		||||
		account = params.Email
 | 
			
		||||
	} else {
 | 
			
		||||
		account = params.PhoneNumber
 | 
			
		||||
	}
 | 
			
		||||
	var accountKey string
 | 
			
		||||
	if params.UsedFor == 0 {
 | 
			
		||||
		params.UsedFor = constant.VerificationCodeForRegister
 | 
			
		||||
	}
 | 
			
		||||
	switch params.UsedFor {
 | 
			
		||||
	case constant.VerificationCodeForRegister:
 | 
			
		||||
		_, err := im_mysql_model.GetRegister(account)
 | 
			
		||||
		if err == nil {
 | 
			
		||||
			log.NewError(params.OperationID, "The phone number has been registered", params)
 | 
			
		||||
			c.JSON(http.StatusOK, gin.H{"errCode": constant.HasRegistered, "errMsg": "The phone number has been registered"})
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		ok, err := db.DB.JudgeAccountEXISTS(account)
 | 
			
		||||
		if ok || err != nil {
 | 
			
		||||
			log.NewError(params.OperationID, "The phone number has been registered", params)
 | 
			
		||||
			c.JSON(http.StatusOK, gin.H{"errCode": constant.RepeatSendCode, "errMsg": "The phone number has been registered"})
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		accountKey = account + "_" + constant.VerificationCodeForRegisterSuffix
 | 
			
		||||
 | 
			
		||||
	case constant.VerificationCodeForReset:
 | 
			
		||||
		accountKey = account + "_" + constant.VerificationCodeForResetSuffix
 | 
			
		||||
	}
 | 
			
		||||
	rand.Seed(time.Now().UnixNano())
 | 
			
		||||
	code := 100000 + rand.Intn(900000)
 | 
			
		||||
	log.NewInfo(params.OperationID, params.UsedFor,"begin store redis", accountKey, code)
 | 
			
		||||
	err := db.DB.SetAccountCode(accountKey, code, config.Config.Demo.CodeTTL)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(params.OperationID, "set redis error", accountKey, "err", err.Error())
 | 
			
		||||
		c.JSON(http.StatusOK, gin.H{"errCode": constant.SmsSendCodeErr, "errMsg": "Enter the superCode directly in the verification code box, SuperCode can be configured in config.xml"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	log.NewDebug("", config.Config.Demo)
 | 
			
		||||
	if params.Email != "" {
 | 
			
		||||
		m := gomail.NewMessage()
 | 
			
		||||
		m.SetHeader(`From`, config.Config.Demo.Mail.SenderMail)
 | 
			
		||||
		m.SetHeader(`To`, []string{account}...)
 | 
			
		||||
		m.SetHeader(`Subject`, config.Config.Demo.Mail.Title)
 | 
			
		||||
		m.SetBody(`text/html`, fmt.Sprintf("%d", code))
 | 
			
		||||
		if err := gomail.NewDialer(config.Config.Demo.Mail.SmtpAddr, config.Config.Demo.Mail.SmtpPort, config.Config.Demo.Mail.SenderMail, config.Config.Demo.Mail.SenderAuthorizationCode).DialAndSend(m); err != nil {
 | 
			
		||||
			log.ErrorByKv("send mail error", account, "err", err.Error())
 | 
			
		||||
			c.JSON(http.StatusOK, gin.H{"errCode": constant.MailSendCodeErr, "errMsg": ""})
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		client, err := CreateClient(tea.String(config.Config.Demo.AliSMSVerify.AccessKeyID), tea.String(config.Config.Demo.AliSMSVerify.AccessKeySecret))
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			log.NewError(params.OperationID, "create sendSms client err", "err", err.Error())
 | 
			
		||||
			c.JSON(http.StatusOK, gin.H{"errCode": constant.SmsSendCodeErr, "errMsg": "Enter the superCode directly in the verification code box, SuperCode can be configured in config.xml"})
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		sendSmsRequest := &dysmsapi20170525.SendSmsRequest{
 | 
			
		||||
			PhoneNumbers:  tea.String(account),
 | 
			
		||||
			SignName:      tea.String(config.Config.Demo.AliSMSVerify.SignName),
 | 
			
		||||
			TemplateCode:  tea.String(config.Config.Demo.AliSMSVerify.VerificationCodeTemplateCode),
 | 
			
		||||
			TemplateParam: tea.String(fmt.Sprintf("{\"code\":\"%d\"}", code)),
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		response, err := client.SendSms(sendSmsRequest)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			log.NewError(params.OperationID, "sendSms error", account, "err", err.Error())
 | 
			
		||||
			c.JSON(http.StatusOK, gin.H{"errCode": constant.SmsSendCodeErr, "errMsg": "Enter the superCode directly in the verification code box, SuperCode can be configured in config.xml"})
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		if *response.Body.Code != "OK" {
 | 
			
		||||
			log.NewError(params.OperationID, "alibabacloud sendSms error", account, "err", response.Body.Code, response.Body.Message)
 | 
			
		||||
			c.JSON(http.StatusOK, gin.H{"errCode": constant.SmsSendCodeErr, "errMsg": "Enter the superCode directly in the verification code box, SuperCode can be configured in config.xml"})
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	data := make(map[string]interface{})
 | 
			
		||||
	data["account"] = account
 | 
			
		||||
	c.JSON(http.StatusOK, gin.H{"errCode": constant.NoError, "errMsg": "Verification code has been set!", "data": data})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func CreateClient(accessKeyId *string, accessKeySecret *string) (result *dysmsapi20170525.Client, err error) {
 | 
			
		||||
	c := &openapi.Config{
 | 
			
		||||
		// 您的AccessKey ID
 | 
			
		||||
		AccessKeyId: accessKeyId,
 | 
			
		||||
		// 您的AccessKey Secret
 | 
			
		||||
		AccessKeySecret: accessKeySecret,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// 访问的域名
 | 
			
		||||
	c.Endpoint = tea.String("dysmsapi.aliyuncs.com")
 | 
			
		||||
	result = &dysmsapi20170525.Client{}
 | 
			
		||||
	result, err = dysmsapi20170525.NewClient(c)
 | 
			
		||||
	return result, err
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										85
									
								
								internal/demo/register/set_password.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										85
									
								
								internal/demo/register/set_password.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,85 @@
 | 
			
		||||
package register
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	api "Open_IM/pkg/base_info"
 | 
			
		||||
	"Open_IM/pkg/common/config"
 | 
			
		||||
	"Open_IM/pkg/common/constant"
 | 
			
		||||
	"Open_IM/pkg/common/db"
 | 
			
		||||
	"Open_IM/pkg/common/db/mysql_model/im_mysql_model"
 | 
			
		||||
	http2 "Open_IM/pkg/common/http"
 | 
			
		||||
	"Open_IM/pkg/common/log"
 | 
			
		||||
	"Open_IM/pkg/utils"
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"github.com/gin-gonic/gin"
 | 
			
		||||
	"net/http"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type ParamsSetPassword struct {
 | 
			
		||||
	Email            string `json:"email"`
 | 
			
		||||
	PhoneNumber      string `json:"phoneNumber"`
 | 
			
		||||
	Password         string `json:"password"`
 | 
			
		||||
	VerificationCode string `json:"verificationCode"`
 | 
			
		||||
	Platform         int32  `json:"platform" binding:"required,min=1,max=7"`
 | 
			
		||||
	Ex               string `json:"ex"`
 | 
			
		||||
	OperationID      string `json:"operationID" binding:"required"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SetPassword(c *gin.Context) {
 | 
			
		||||
	params := ParamsSetPassword{}
 | 
			
		||||
	if err := c.BindJSON(¶ms); err != nil {
 | 
			
		||||
		log.NewError(params.OperationID, utils.GetSelfFuncName(), "bind json failed", err.Error())
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"errCode": constant.FormattingError, "errMsg": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	var account string
 | 
			
		||||
	if params.Email != "" {
 | 
			
		||||
		account = params.Email
 | 
			
		||||
	} else {
 | 
			
		||||
		account = params.PhoneNumber
 | 
			
		||||
	}
 | 
			
		||||
	if params.VerificationCode != config.Config.Demo.SuperCode {
 | 
			
		||||
		accountKey := account + "_" + constant.VerificationCodeForRegisterSuffix
 | 
			
		||||
		v, err := db.DB.GetAccountCode(accountKey)
 | 
			
		||||
		if err != nil || v != params.VerificationCode {
 | 
			
		||||
			log.NewError(params.OperationID, "password Verification code error", account, params.VerificationCode)
 | 
			
		||||
			data := make(map[string]interface{})
 | 
			
		||||
			data["PhoneNumber"] = account
 | 
			
		||||
			c.JSON(http.StatusOK, gin.H{"errCode": constant.CodeInvalidOrExpired, "errMsg": "Verification code error!", "data": data})
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	url := fmt.Sprintf("http://%s:10000/auth/user_register", utils.ServerIP)
 | 
			
		||||
	openIMRegisterReq := api.UserRegisterReq{}
 | 
			
		||||
	openIMRegisterReq.OperationID = params.OperationID
 | 
			
		||||
	openIMRegisterReq.Platform = params.Platform
 | 
			
		||||
	openIMRegisterReq.UserID = account
 | 
			
		||||
	openIMRegisterReq.Nickname = account
 | 
			
		||||
	openIMRegisterReq.Secret = config.Config.Secret
 | 
			
		||||
	openIMRegisterResp := api.UserRegisterResp{}
 | 
			
		||||
	bMsg, err := http2.Post(url, openIMRegisterReq, 2)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(params.OperationID, "request openIM register error", account, "err", err.Error())
 | 
			
		||||
		c.JSON(http.StatusOK, gin.H{"errCode": constant.RegisterFailed, "errMsg": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	err = json.Unmarshal(bMsg, &openIMRegisterResp)
 | 
			
		||||
	if err != nil || openIMRegisterResp.ErrCode != 0 {
 | 
			
		||||
		log.NewError(params.OperationID, "request openIM register error", account, "err", "resp: ", openIMRegisterResp.ErrCode)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			log.NewError(params.OperationID, utils.GetSelfFuncName(), err.Error())
 | 
			
		||||
		}
 | 
			
		||||
		c.JSON(http.StatusOK, gin.H{"errCode": constant.RegisterFailed, "errMsg": "register failed: "+openIMRegisterResp.ErrMsg})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	log.Info(params.OperationID, "begin store mysql", account, params.Password)
 | 
			
		||||
	err = im_mysql_model.SetPassword(account, params.Password, params.Ex)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(params.OperationID, "set phone number password error", account, "err", err.Error())
 | 
			
		||||
		c.JSON(http.StatusOK, gin.H{"errCode": constant.RegisterFailed, "errMsg": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	log.Info(params.OperationID, "end setPassword", account, params.Password)
 | 
			
		||||
	c.JSON(http.StatusOK, gin.H{"errCode": constant.NoError, "errMsg": "", "data": openIMRegisterResp.UserToken})
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										80
									
								
								internal/demo/register/verify.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										80
									
								
								internal/demo/register/verify.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,80 @@
 | 
			
		||||
package register
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"Open_IM/pkg/common/config"
 | 
			
		||||
	"Open_IM/pkg/common/constant"
 | 
			
		||||
	"Open_IM/pkg/common/db"
 | 
			
		||||
	"Open_IM/pkg/common/log"
 | 
			
		||||
 | 
			
		||||
	"github.com/gin-gonic/gin"
 | 
			
		||||
	"net/http"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type paramsCertification struct {
 | 
			
		||||
	Email            string `json:"email"`
 | 
			
		||||
	PhoneNumber      string `json:"phoneNumber"`
 | 
			
		||||
	VerificationCode string `json:"verificationCode"`
 | 
			
		||||
	OperationID      string `json:"operationID" binding:"required"`
 | 
			
		||||
	UsedFor          int    `json:"usedFor"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func Verify(c *gin.Context) {
 | 
			
		||||
	params := paramsCertification{}
 | 
			
		||||
	if err := c.BindJSON(¶ms); err != nil {
 | 
			
		||||
		log.NewError("", "request params json parsing failed", "", "err", err.Error())
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"errCode": constant.FormattingError, "errMsg": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	log.NewInfo("recv req: ", params)
 | 
			
		||||
 | 
			
		||||
	var account string
 | 
			
		||||
	if params.Email != "" {
 | 
			
		||||
		account = params.Email
 | 
			
		||||
	} else {
 | 
			
		||||
		account = params.PhoneNumber
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if params.VerificationCode == config.Config.Demo.SuperCode {
 | 
			
		||||
		log.InfoByKv("Super Code Verified successfully", account)
 | 
			
		||||
		data := make(map[string]interface{})
 | 
			
		||||
		data["account"] = account
 | 
			
		||||
		data["verificationCode"] = params.VerificationCode
 | 
			
		||||
		c.JSON(http.StatusOK, gin.H{"errCode": constant.NoError, "errMsg": "Verified successfully!", "data": data})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	log.NewInfo("0", " params.VerificationCode != config.Config.Demo.SuperCode", params.VerificationCode, config.Config.Demo)
 | 
			
		||||
	log.NewInfo(params.OperationID, "begin get form redis", account)
 | 
			
		||||
	if params.UsedFor == 0 {
 | 
			
		||||
		params.UsedFor = constant.VerificationCodeForRegister
 | 
			
		||||
	}
 | 
			
		||||
	var accountKey string
 | 
			
		||||
	switch params.UsedFor {
 | 
			
		||||
	case constant.VerificationCodeForRegister:
 | 
			
		||||
		accountKey = account + "_" + constant.VerificationCodeForRegisterSuffix
 | 
			
		||||
	case constant.VerificationCodeForReset:
 | 
			
		||||
		accountKey = account + "_" + constant.VerificationCodeForResetSuffix
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	code, err := db.DB.GetAccountCode(accountKey)
 | 
			
		||||
	log.NewInfo(params.OperationID, "redis phone number and verificating Code", accountKey, code, params)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(params.OperationID, "Verification code expired", accountKey, "err", err.Error())
 | 
			
		||||
		data := make(map[string]interface{})
 | 
			
		||||
		data["account"] = account
 | 
			
		||||
		c.JSON(http.StatusOK, gin.H{"errCode": constant.CodeInvalidOrExpired, "errMsg": "Verification code expired!", "data": data})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	if params.VerificationCode == code {
 | 
			
		||||
		log.Info(params.OperationID, "Verified successfully", account)
 | 
			
		||||
		data := make(map[string]interface{})
 | 
			
		||||
		data["account"] = account
 | 
			
		||||
		data["verificationCode"] = params.VerificationCode
 | 
			
		||||
		c.JSON(http.StatusOK, gin.H{"errCode": constant.NoError, "errMsg": "Verified successfully!", "data": data})
 | 
			
		||||
		return
 | 
			
		||||
	} else {
 | 
			
		||||
		log.Info(params.OperationID, "Verification code error", account, params.VerificationCode)
 | 
			
		||||
		data := make(map[string]interface{})
 | 
			
		||||
		data["account"] = account
 | 
			
		||||
		c.JSON(http.StatusOK, gin.H{"errCode": constant.CodeInvalidOrExpired, "errMsg": "Verification code error!", "data": data})
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
@ -3,15 +3,19 @@ package gate
 | 
			
		||||
import (
 | 
			
		||||
	"Open_IM/pkg/common/config"
 | 
			
		||||
	"Open_IM/pkg/common/log"
 | 
			
		||||
	"Open_IM/pkg/statistics"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"github.com/go-playground/validator/v10"
 | 
			
		||||
	"sync"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	rwLock   *sync.RWMutex
 | 
			
		||||
	validate *validator.Validate
 | 
			
		||||
	ws       WServer
 | 
			
		||||
	rpcSvr   RPCServer
 | 
			
		||||
	rwLock       *sync.RWMutex
 | 
			
		||||
	validate     *validator.Validate
 | 
			
		||||
	ws           WServer
 | 
			
		||||
	rpcSvr       RPCServer
 | 
			
		||||
	sendMsgCount uint64
 | 
			
		||||
	userCount    uint64
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func Init(rpcPort, wsPort int) {
 | 
			
		||||
@ -19,6 +23,8 @@ func Init(rpcPort, wsPort int) {
 | 
			
		||||
	log.NewPrivateLog(config.Config.ModuleName.LongConnSvrName)
 | 
			
		||||
	rwLock = new(sync.RWMutex)
 | 
			
		||||
	validate = validator.New()
 | 
			
		||||
	statistics.NewStatistics(&sendMsgCount, config.Config.ModuleName.LongConnSvrName, fmt.Sprintf("%d second recv to msg_gateway sendMsgCount", sendMsgCount), 300)
 | 
			
		||||
	statistics.NewStatistics(&userCount, config.Config.ModuleName.LongConnSvrName, fmt.Sprintf("%d second add user conn", userCount), 300)
 | 
			
		||||
	ws.onInit(wsPort)
 | 
			
		||||
	rpcSvr.onInit(rpcPort)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -6,12 +6,10 @@ import (
 | 
			
		||||
	"Open_IM/pkg/common/log"
 | 
			
		||||
	"Open_IM/pkg/grpc-etcdv3/getcdv3"
 | 
			
		||||
	pbChat "Open_IM/pkg/proto/chat"
 | 
			
		||||
	open_im_sdk "Open_IM/pkg/proto/sdk_ws"
 | 
			
		||||
	"Open_IM/pkg/utils"
 | 
			
		||||
	sdk_ws "Open_IM/pkg/proto/sdk_ws"
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"context"
 | 
			
		||||
	"encoding/gob"
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"github.com/golang/protobuf/proto"
 | 
			
		||||
	"github.com/gorilla/websocket"
 | 
			
		||||
	"runtime"
 | 
			
		||||
@ -30,7 +28,7 @@ func (ws *WServer) msgParse(conn *UserConn, binaryMsg []byte) {
 | 
			
		||||
	dec := gob.NewDecoder(b)
 | 
			
		||||
	err := dec.Decode(&m)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.ErrorByKv("ws json Unmarshal err", "", "err", err.Error())
 | 
			
		||||
		log.ErrorByKv("ws Decode  err", "", "err", err.Error())
 | 
			
		||||
		ws.sendErrMsg(conn, 200, err.Error(), constant.WSDataError, "", "")
 | 
			
		||||
		err = conn.Close()
 | 
			
		||||
		if err != nil {
 | 
			
		||||
@ -51,42 +49,41 @@ func (ws *WServer) msgParse(conn *UserConn, binaryMsg []byte) {
 | 
			
		||||
 | 
			
		||||
	switch m.ReqIdentifier {
 | 
			
		||||
	case constant.WSGetNewestSeq:
 | 
			
		||||
		go ws.getSeqReq(conn, &m)
 | 
			
		||||
	case constant.WSPullMsg:
 | 
			
		||||
		go ws.pullMsgReq(conn, &m)
 | 
			
		||||
		ws.getSeqReq(conn, &m)
 | 
			
		||||
	case constant.WSSendMsg:
 | 
			
		||||
		sendTime := utils.GetCurrentTimestampByNano()
 | 
			
		||||
		go ws.sendMsgReq(conn, &m, sendTime)
 | 
			
		||||
		ws.sendMsgReq(conn, &m)
 | 
			
		||||
	case constant.WSSendSignalMsg:
 | 
			
		||||
		ws.sendSignalMsgReq(conn, &m)
 | 
			
		||||
	case constant.WSPullMsgBySeqList:
 | 
			
		||||
		go ws.pullMsgBySeqListReq(conn, &m)
 | 
			
		||||
		ws.pullMsgBySeqListReq(conn, &m)
 | 
			
		||||
	default:
 | 
			
		||||
	}
 | 
			
		||||
	log.NewInfo("", "goroutine num is ", runtime.NumGoroutine())
 | 
			
		||||
}
 | 
			
		||||
func (ws *WServer) getSeqReq(conn *UserConn, m *Req) {
 | 
			
		||||
	log.NewInfo(m.OperationID, "Ws call success to getNewSeq", m.MsgIncr, m.SendID, m.ReqIdentifier)
 | 
			
		||||
	pbData := pbChat.GetMaxAndMinSeqReq{}
 | 
			
		||||
	rpcReq := pbChat.GetMaxAndMinSeqReq{}
 | 
			
		||||
	nReply := new(pbChat.GetMaxAndMinSeqResp)
 | 
			
		||||
	pbData.UserID = m.SendID
 | 
			
		||||
	pbData.OperationID = m.OperationID
 | 
			
		||||
	rpcReq.UserID = m.SendID
 | 
			
		||||
	rpcReq.OperationID = m.OperationID
 | 
			
		||||
	grpcConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImOfflineMessageName)
 | 
			
		||||
	if grpcConn == nil {
 | 
			
		||||
		log.ErrorByKv("get grpcConn err", pbData.OperationID, "args", m)
 | 
			
		||||
		log.ErrorByKv("get grpcConn err", rpcReq.OperationID, "args", m)
 | 
			
		||||
	}
 | 
			
		||||
	msgClient := pbChat.NewChatClient(grpcConn)
 | 
			
		||||
	reply, err := msgClient.GetMaxAndMinSeq(context.Background(), &pbData)
 | 
			
		||||
	rpcReply, err := msgClient.GetMaxAndMinSeq(context.Background(), &rpcReq)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.ErrorByKv("rpc call failed to getSeqReq", pbData.OperationID, "err", err, "pbData", pbData.String())
 | 
			
		||||
		nReply.ErrCode = 200
 | 
			
		||||
		log.Error(rpcReq.OperationID, "rpc call failed to getSeqReq", err, rpcReq.String())
 | 
			
		||||
		nReply.ErrCode = 500
 | 
			
		||||
		nReply.ErrMsg = err.Error()
 | 
			
		||||
		ws.getSeqResp(conn, m, nReply)
 | 
			
		||||
	} else {
 | 
			
		||||
		log.InfoByKv("rpc call success to getSeqReq", pbData.OperationID, "replyData", reply.String())
 | 
			
		||||
		ws.getSeqResp(conn, m, reply)
 | 
			
		||||
		log.InfoByKv("rpc call success to getSeqReq", rpcReq.OperationID, "replyData", rpcReply.String())
 | 
			
		||||
		ws.getSeqResp(conn, m, rpcReply)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
func (ws *WServer) getSeqResp(conn *UserConn, m *Req, pb *pbChat.GetMaxAndMinSeqResp) {
 | 
			
		||||
	var mReplyData open_im_sdk.GetMaxAndMinSeqResp
 | 
			
		||||
	var mReplyData sdk_ws.GetMaxAndMinSeqResp
 | 
			
		||||
	mReplyData.MaxSeq = pb.GetMaxSeq()
 | 
			
		||||
	mReplyData.MinSeq = pb.GetMinSeq()
 | 
			
		||||
	b, _ := proto.Marshal(&mReplyData)
 | 
			
		||||
@ -100,58 +97,38 @@ func (ws *WServer) getSeqResp(conn *UserConn, m *Req, pb *pbChat.GetMaxAndMinSeq
 | 
			
		||||
	}
 | 
			
		||||
	ws.sendMsg(conn, mReply)
 | 
			
		||||
}
 | 
			
		||||
func (ws *WServer) pullMsgReq(conn *UserConn, m *Req) {
 | 
			
		||||
	log.NewInfo(m.OperationID, "Ws call success to pullMsgReq", m.ReqIdentifier, m.MsgIncr, m.SendID)
 | 
			
		||||
	nReply := new(pbChat.PullMessageResp)
 | 
			
		||||
	isPass, errCode, errMsg, data := ws.argsValidate(m, constant.WSPullMsg)
 | 
			
		||||
 | 
			
		||||
func (ws *WServer) pullMsgBySeqListReq(conn *UserConn, m *Req) {
 | 
			
		||||
	log.NewInfo(m.OperationID, "Ws call success to pullMsgBySeqListReq start", m.SendID, m.ReqIdentifier, m.MsgIncr)
 | 
			
		||||
	nReply := new(sdk_ws.PullMessageBySeqListResp)
 | 
			
		||||
	isPass, errCode, errMsg, data := ws.argsValidate(m, constant.WSPullMsgBySeqList)
 | 
			
		||||
	log.NewInfo(m.OperationID, "Ws call success to pullMsgBySeqListReq middle", m.SendID, m.ReqIdentifier, m.MsgIncr, data.(sdk_ws.PullMessageBySeqListReq).SeqList)
 | 
			
		||||
	if isPass {
 | 
			
		||||
		pbData := pbChat.PullMessageReq{}
 | 
			
		||||
		pbData.UserID = m.SendID
 | 
			
		||||
		pbData.OperationID = m.OperationID
 | 
			
		||||
		pbData.SeqBegin = data.(SeqData).SeqBegin
 | 
			
		||||
		pbData.SeqEnd = data.(SeqData).SeqEnd
 | 
			
		||||
		rpcReq := sdk_ws.PullMessageBySeqListReq{}
 | 
			
		||||
		rpcReq.SeqList = data.(sdk_ws.PullMessageBySeqListReq).SeqList
 | 
			
		||||
		rpcReq.UserID = m.SendID
 | 
			
		||||
		rpcReq.OperationID = m.OperationID
 | 
			
		||||
		grpcConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImOfflineMessageName)
 | 
			
		||||
		msgClient := pbChat.NewChatClient(grpcConn)
 | 
			
		||||
		reply, err := msgClient.PullMessage(context.Background(), &pbData)
 | 
			
		||||
		reply, err := msgClient.PullMessageBySeqList(context.Background(), &rpcReq)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			log.ErrorByKv("PullMessage error", pbData.OperationID, "err", err.Error())
 | 
			
		||||
			log.NewError(rpcReq.OperationID, "pullMsgBySeqListReq err", err.Error())
 | 
			
		||||
			nReply.ErrCode = 200
 | 
			
		||||
			nReply.ErrMsg = err.Error()
 | 
			
		||||
			ws.pullMsgResp(conn, m, nReply)
 | 
			
		||||
			ws.pullMsgBySeqListResp(conn, m, nReply)
 | 
			
		||||
		} else {
 | 
			
		||||
			log.InfoByKv("rpc call success to pullMsgRep", pbData.OperationID, "ReplyArgs", reply.String(), "maxSeq", reply.GetMaxSeq(),
 | 
			
		||||
				"MinSeq", reply.GetMinSeq(), "singLen", len(reply.GetSingleUserMsg()), "groupLen", len(reply.GetGroupUserMsg()))
 | 
			
		||||
			ws.pullMsgResp(conn, m, reply)
 | 
			
		||||
			log.NewInfo(rpcReq.OperationID, "rpc call success to pullMsgBySeqListReq", reply.String(), len(reply.List))
 | 
			
		||||
			ws.pullMsgBySeqListResp(conn, m, reply)
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		nReply.ErrCode = errCode
 | 
			
		||||
		nReply.ErrMsg = errMsg
 | 
			
		||||
		ws.pullMsgResp(conn, m, nReply)
 | 
			
		||||
		ws.pullMsgBySeqListResp(conn, m, nReply)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
func (ws *WServer) pullMsgResp(conn *UserConn, m *Req, pb *pbChat.PullMessageResp) {
 | 
			
		||||
	log.NewInfo(m.OperationID, "pullMsgResp come  here ", pb.String())
 | 
			
		||||
	var mReplyData open_im_sdk.PullMessageBySeqListResp
 | 
			
		||||
	a, err := json.Marshal(pb.SingleUserMsg)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(m.OperationID, "GetSingleUserMsg,json marshal,err", err.Error())
 | 
			
		||||
	}
 | 
			
		||||
	log.NewInfo(m.OperationID, "pullMsgResp json is ", len(pb.SingleUserMsg))
 | 
			
		||||
	err = json.Unmarshal(a, &mReplyData.SingleUserMsg)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(m.OperationID, "SingleUserMsg,json Unmarshal,err", err.Error())
 | 
			
		||||
	}
 | 
			
		||||
	b, err := json.Marshal(pb.GroupUserMsg)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(m.OperationID, "mReplyData,json marshal,err", err.Error())
 | 
			
		||||
	}
 | 
			
		||||
	err = json.Unmarshal(b, &mReplyData.GroupUserMsg)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(m.OperationID, "test SingleUserMsg,json Unmarshal,err", err.Error())
 | 
			
		||||
	}
 | 
			
		||||
	c, err := proto.Marshal(&mReplyData)
 | 
			
		||||
	log.NewInfo(m.OperationID, "test info is ", len(mReplyData.SingleUserMsg), mReplyData.SingleUserMsg)
 | 
			
		||||
 | 
			
		||||
func (ws *WServer) pullMsgBySeqListResp(conn *UserConn, m *Req, pb *sdk_ws.PullMessageBySeqListResp) {
 | 
			
		||||
	log.NewInfo(m.OperationID, "pullMsgBySeqListResp come  here ", pb.String())
 | 
			
		||||
	c, _ := proto.Marshal(pb)
 | 
			
		||||
	mReply := Resp{
 | 
			
		||||
		ReqIdentifier: m.ReqIdentifier,
 | 
			
		||||
		MsgIncr:       m.MsgIncr,
 | 
			
		||||
@ -160,92 +137,52 @@ func (ws *WServer) pullMsgResp(conn *UserConn, m *Req, pb *pbChat.PullMessageRes
 | 
			
		||||
		OperationID:   m.OperationID,
 | 
			
		||||
		Data:          c,
 | 
			
		||||
	}
 | 
			
		||||
	log.NewInfo(m.OperationID, "pullMsgResp all data  is ", mReply.ReqIdentifier, mReply.MsgIncr, mReply.ErrCode, mReply.ErrMsg,
 | 
			
		||||
	log.NewInfo(m.OperationID, "pullMsgBySeqListResp all data  is ", mReply.ReqIdentifier, mReply.MsgIncr, mReply.ErrCode, mReply.ErrMsg,
 | 
			
		||||
		len(mReply.Data))
 | 
			
		||||
 | 
			
		||||
	ws.sendMsg(conn, mReply)
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
func (ws *WServer) pullMsgBySeqListReq(conn *UserConn, m *Req) {
 | 
			
		||||
	log.NewInfo(m.OperationID, "Ws call success to pullMsgBySeqListReq start", m.SendID, m.ReqIdentifier, m.MsgIncr)
 | 
			
		||||
	nReply := new(pbChat.PullMessageResp)
 | 
			
		||||
	isPass, errCode, errMsg, data := ws.argsValidate(m, constant.WSPullMsgBySeqList)
 | 
			
		||||
	log.NewInfo(m.OperationID, "Ws call success to pullMsgBySeqListReq middle", m.SendID, m.ReqIdentifier, m.MsgIncr, data.(open_im_sdk.PullMessageBySeqListReq).SeqList)
 | 
			
		||||
	if isPass {
 | 
			
		||||
		pbData := pbChat.PullMessageBySeqListReq{}
 | 
			
		||||
		pbData.SeqList = data.(open_im_sdk.PullMessageBySeqListReq).SeqList
 | 
			
		||||
		pbData.UserID = m.SendID
 | 
			
		||||
		pbData.OperationID = m.OperationID
 | 
			
		||||
		grpcConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImOfflineMessageName)
 | 
			
		||||
		msgClient := pbChat.NewChatClient(grpcConn)
 | 
			
		||||
		reply, err := msgClient.PullMessageBySeqList(context.Background(), &pbData)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			log.NewError(pbData.OperationID, "pullMsgBySeqListReq err", err.Error())
 | 
			
		||||
			nReply.ErrCode = 200
 | 
			
		||||
			nReply.ErrMsg = err.Error()
 | 
			
		||||
			ws.pullMsgResp(conn, m, nReply)
 | 
			
		||||
		} else {
 | 
			
		||||
			log.NewInfo(pbData.OperationID, "rpc call success to pullMsgBySeqListReq", reply.String(), reply.GetMaxSeq(), reply.GetMinSeq(), len(reply.GetSingleUserMsg()), len(reply.GetGroupUserMsg()))
 | 
			
		||||
			ws.pullMsgResp(conn, m, reply)
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		nReply.ErrCode = errCode
 | 
			
		||||
		nReply.ErrMsg = errMsg
 | 
			
		||||
		ws.pullMsgResp(conn, m, nReply)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
func (ws *WServer) sendMsgReq(conn *UserConn, m *Req, sendTime int64) {
 | 
			
		||||
	log.NewInfo(m.OperationID, "Ws call success to sendMsgReq start", m.MsgIncr, m.ReqIdentifier, m.SendID, sendTime)
 | 
			
		||||
	nReply := new(pbChat.UserSendMsgResp)
 | 
			
		||||
func (ws *WServer) sendMsgReq(conn *UserConn, m *Req) {
 | 
			
		||||
	sendMsgCount++
 | 
			
		||||
	log.NewInfo(m.OperationID, "Ws call success to sendMsgReq start", m.MsgIncr, m.ReqIdentifier, m.SendID)
 | 
			
		||||
	nReply := new(pbChat.SendMsgResp)
 | 
			
		||||
	isPass, errCode, errMsg, pData := ws.argsValidate(m, constant.WSSendMsg)
 | 
			
		||||
	if isPass {
 | 
			
		||||
		data := pData.(open_im_sdk.UserSendMsgReq)
 | 
			
		||||
		pbData := pbChat.UserSendMsgReq{
 | 
			
		||||
			ReqIdentifier:  m.ReqIdentifier,
 | 
			
		||||
			Token:          m.Token,
 | 
			
		||||
			SendID:         m.SendID,
 | 
			
		||||
			OperationID:    m.OperationID,
 | 
			
		||||
			PlatformID:     data.PlatformID,
 | 
			
		||||
			SessionType:    data.SessionType,
 | 
			
		||||
			MsgFrom:        data.MsgFrom,
 | 
			
		||||
			ContentType:    data.ContentType,
 | 
			
		||||
			RecvID:         data.RecvID,
 | 
			
		||||
			ForceList:      data.ForceList,
 | 
			
		||||
			SenderNickName: data.SenderNickName,
 | 
			
		||||
			SenderFaceURL:  data.SenderFaceURL,
 | 
			
		||||
			Content:        data.Content,
 | 
			
		||||
			Options:        utils.MapIntToJsonString(data.Options),
 | 
			
		||||
			ClientMsgID:    data.ClientMsgID,
 | 
			
		||||
			SendTime:       sendTime,
 | 
			
		||||
		data := pData.(sdk_ws.MsgData)
 | 
			
		||||
		pbData := pbChat.SendMsgReq{
 | 
			
		||||
			Token:       m.Token,
 | 
			
		||||
			OperationID: m.OperationID,
 | 
			
		||||
			MsgData:     &data,
 | 
			
		||||
		}
 | 
			
		||||
		log.NewInfo(m.OperationID, "Ws call success to sendMsgReq middle", m.ReqIdentifier, m.SendID, m.MsgIncr, data)
 | 
			
		||||
		etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImOfflineMessageName)
 | 
			
		||||
		client := pbChat.NewChatClient(etcdConn)
 | 
			
		||||
		reply, err := client.UserSendMsg(context.Background(), &pbData)
 | 
			
		||||
		reply, err := client.SendMsg(context.Background(), &pbData)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			log.NewError(pbData.OperationID, "UserSendMsg err", err.Error())
 | 
			
		||||
			nReply.ErrCode = 200
 | 
			
		||||
			nReply.ErrMsg = err.Error()
 | 
			
		||||
			ws.sendMsgResp(conn, m, nReply, sendTime)
 | 
			
		||||
			ws.sendMsgResp(conn, m, nReply)
 | 
			
		||||
		} else {
 | 
			
		||||
			log.NewInfo(pbData.OperationID, "rpc call success to sendMsgReq", reply.String())
 | 
			
		||||
			ws.sendMsgResp(conn, m, reply, sendTime)
 | 
			
		||||
			ws.sendMsgResp(conn, m, reply)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	} else {
 | 
			
		||||
		nReply.ErrCode = errCode
 | 
			
		||||
		nReply.ErrMsg = errMsg
 | 
			
		||||
		ws.sendMsgResp(conn, m, nReply, sendTime)
 | 
			
		||||
		ws.sendMsgResp(conn, m, nReply)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
func (ws *WServer) sendMsgResp(conn *UserConn, m *Req, pb *pbChat.UserSendMsgResp, sendTime int64) {
 | 
			
		||||
func (ws *WServer) sendMsgResp(conn *UserConn, m *Req, pb *pbChat.SendMsgResp) {
 | 
			
		||||
	// := make(map[string]interface{})
 | 
			
		||||
 | 
			
		||||
	var mReplyData open_im_sdk.UserSendMsgResp
 | 
			
		||||
	var mReplyData sdk_ws.UserSendMsgResp
 | 
			
		||||
	mReplyData.ClientMsgID = pb.GetClientMsgID()
 | 
			
		||||
	mReplyData.ServerMsgID = pb.GetServerMsgID()
 | 
			
		||||
	mReplyData.SendTime = sendTime
 | 
			
		||||
	mReplyData.SendTime = pb.GetSendTime()
 | 
			
		||||
	b, _ := proto.Marshal(&mReplyData)
 | 
			
		||||
	mReply := Resp{
 | 
			
		||||
		ReqIdentifier: m.ReqIdentifier,
 | 
			
		||||
@ -258,17 +195,70 @@ func (ws *WServer) sendMsgResp(conn *UserConn, m *Req, pb *pbChat.UserSendMsgRes
 | 
			
		||||
	ws.sendMsg(conn, mReply)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (ws *WServer) sendSignalMsgReq(conn *UserConn, m *Req) {
 | 
			
		||||
	sendMsgCount++
 | 
			
		||||
	log.NewInfo(m.OperationID, "Ws call success to sendSignalMsgReq start", m.MsgIncr, m.ReqIdentifier, m.SendID)
 | 
			
		||||
	nReply := new(pbChat.SendMsgResp)
 | 
			
		||||
	isPass, errCode, errMsg, pData := ws.argsValidate(m, constant.WSSendMsg)
 | 
			
		||||
	if isPass {
 | 
			
		||||
		data := pData.(sdk_ws.MsgData)
 | 
			
		||||
		pbData := pbChat.SendMsgReq{
 | 
			
		||||
			Token:       m.Token,
 | 
			
		||||
			OperationID: m.OperationID,
 | 
			
		||||
			MsgData:     &data,
 | 
			
		||||
		}
 | 
			
		||||
		log.NewInfo(m.OperationID, "Ws call success to sendSignalMsgReq middle", m.ReqIdentifier, m.SendID, m.MsgIncr, data)
 | 
			
		||||
		etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImOfflineMessageName)
 | 
			
		||||
		client := pbChat.NewChatClient(etcdConn)
 | 
			
		||||
		reply, err := client.SendMsg(context.Background(), &pbData)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			log.NewError(pbData.OperationID, "rpc sendMsg err", err.Error())
 | 
			
		||||
			nReply.ErrCode = 200
 | 
			
		||||
			nReply.ErrMsg = err.Error()
 | 
			
		||||
			ws.sendSignalMsgResp(conn, m, nReply)
 | 
			
		||||
		} else {
 | 
			
		||||
			log.NewInfo(pbData.OperationID, "rpc call success to sendMsgReq", reply.String())
 | 
			
		||||
			ws.sendSignalMsgResp(conn, m, reply)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	} else {
 | 
			
		||||
		nReply.ErrCode = errCode
 | 
			
		||||
		nReply.ErrMsg = errMsg
 | 
			
		||||
		ws.sendSignalMsgResp(conn, m, nReply)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
func (ws *WServer) sendSignalMsgResp(conn *UserConn, m *Req, pb *pbChat.SendMsgResp) {
 | 
			
		||||
	// := make(map[string]interface{})
 | 
			
		||||
 | 
			
		||||
	var mReplyData sdk_ws.UserSendMsgResp
 | 
			
		||||
	mReplyData.ClientMsgID = pb.GetClientMsgID()
 | 
			
		||||
	mReplyData.ServerMsgID = pb.GetServerMsgID()
 | 
			
		||||
	mReplyData.SendTime = pb.GetSendTime()
 | 
			
		||||
	b, _ := proto.Marshal(&mReplyData)
 | 
			
		||||
	mReply := Resp{
 | 
			
		||||
		ReqIdentifier: m.ReqIdentifier,
 | 
			
		||||
		MsgIncr:       m.MsgIncr,
 | 
			
		||||
		ErrCode:       pb.GetErrCode(),
 | 
			
		||||
		ErrMsg:        pb.GetErrMsg(),
 | 
			
		||||
		OperationID:   m.OperationID,
 | 
			
		||||
		Data:          b,
 | 
			
		||||
	}
 | 
			
		||||
	ws.sendMsg(conn, mReply)
 | 
			
		||||
}
 | 
			
		||||
func (ws *WServer) sendMsg(conn *UserConn, mReply interface{}) {
 | 
			
		||||
	var b bytes.Buffer
 | 
			
		||||
	enc := gob.NewEncoder(&b)
 | 
			
		||||
	err := enc.Encode(mReply)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(mReply.(Resp).OperationID, mReply.(Resp).ReqIdentifier, mReply.(Resp).ErrCode, mReply.(Resp).ErrMsg, "Encode Msg error", conn.RemoteAddr().String(), ws.getUserUid(conn), err.Error())
 | 
			
		||||
		uid, platform := ws.getUserUid(conn)
 | 
			
		||||
		log.NewError(mReply.(Resp).OperationID, mReply.(Resp).ReqIdentifier, mReply.(Resp).ErrCode, mReply.(Resp).ErrMsg, "Encode Msg error", conn.RemoteAddr().String(), uid, platform, err.Error())
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	err = ws.writeMsg(conn, websocket.BinaryMessage, b.Bytes())
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(mReply.(Resp).OperationID, mReply.(Resp).ReqIdentifier, mReply.(Resp).ErrCode, mReply.(Resp).ErrMsg, "WS WriteMsg error", conn.RemoteAddr().String(), ws.getUserUid(conn), err.Error())
 | 
			
		||||
		uid, platform := ws.getUserUid(conn)
 | 
			
		||||
		log.NewError(mReply.(Resp).OperationID, mReply.(Resp).ReqIdentifier, mReply.(Resp).ErrCode, mReply.(Resp).ErrMsg, "WS WriteMsg error", conn.RemoteAddr().String(), uid, platform, err.Error())
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
func (ws *WServer) sendErrMsg(conn *UserConn, errCode int32, errMsg string, reqIdentifier int32, msgIncr string, operationID string) {
 | 
			
		||||
 | 
			
		||||
@ -4,9 +4,9 @@ import (
 | 
			
		||||
	"Open_IM/pkg/common/config"
 | 
			
		||||
	"Open_IM/pkg/common/constant"
 | 
			
		||||
	"Open_IM/pkg/common/log"
 | 
			
		||||
	"Open_IM/pkg/common/token_verify"
 | 
			
		||||
	"Open_IM/pkg/grpc-etcdv3/getcdv3"
 | 
			
		||||
	pbRelay "Open_IM/pkg/proto/relay"
 | 
			
		||||
	open_im_sdk "Open_IM/pkg/proto/sdk_ws"
 | 
			
		||||
	"Open_IM/pkg/utils"
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"context"
 | 
			
		||||
@ -55,26 +55,10 @@ func (r *RPCServer) run() {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
func (r *RPCServer) MsgToUser(_ context.Context, in *pbRelay.MsgToUserReq) (*pbRelay.MsgToUserResp, error) {
 | 
			
		||||
func (r *RPCServer) OnlinePushMsg(_ context.Context, in *pbRelay.OnlinePushMsgReq) (*pbRelay.OnlinePushMsgResp, error) {
 | 
			
		||||
	log.InfoByKv("PushMsgToUser is arriving", in.OperationID, "args", in.String())
 | 
			
		||||
	var resp []*pbRelay.SingleMsgToUser
 | 
			
		||||
	var RecvID string
 | 
			
		||||
	msg := open_im_sdk.MsgData{
 | 
			
		||||
		SendID:           in.SendID,
 | 
			
		||||
		RecvID:           in.RecvID,
 | 
			
		||||
		MsgFrom:          in.MsgFrom,
 | 
			
		||||
		ContentType:      in.ContentType,
 | 
			
		||||
		SessionType:      in.SessionType,
 | 
			
		||||
		SenderNickName:   in.SenderNickName,
 | 
			
		||||
		SenderFaceURL:    in.SenderFaceURL,
 | 
			
		||||
		ClientMsgID:      in.ClientMsgID,
 | 
			
		||||
		ServerMsgID:      in.ServerMsgID,
 | 
			
		||||
		Content:          in.Content,
 | 
			
		||||
		Seq:              in.RecvSeq,
 | 
			
		||||
		SendTime:         in.SendTime,
 | 
			
		||||
		SenderPlatformID: in.PlatformID,
 | 
			
		||||
	}
 | 
			
		||||
	msgBytes, _ := proto.Marshal(&msg)
 | 
			
		||||
	msgBytes, _ := proto.Marshal(in.MsgData)
 | 
			
		||||
	mReply := Resp{
 | 
			
		||||
		ReqIdentifier: constant.WSPushMsg,
 | 
			
		||||
		OperationID:   in.OperationID,
 | 
			
		||||
@ -86,31 +70,24 @@ func (r *RPCServer) MsgToUser(_ context.Context, in *pbRelay.MsgToUserReq) (*pbR
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(in.OperationID, "data encode err", err.Error())
 | 
			
		||||
	}
 | 
			
		||||
	switch in.GetSessionType() {
 | 
			
		||||
	case constant.SingleChatType:
 | 
			
		||||
		RecvID = in.GetRecvID()
 | 
			
		||||
	case constant.GroupChatType:
 | 
			
		||||
		RecvID = strings.Split(in.GetRecvID(), " ")[0]
 | 
			
		||||
	}
 | 
			
		||||
	var tag bool
 | 
			
		||||
	var UIDAndPID []string
 | 
			
		||||
	userIDList := genUidPlatformArray(RecvID)
 | 
			
		||||
	for _, v := range userIDList {
 | 
			
		||||
		UIDAndPID = strings.Split(v, " ")
 | 
			
		||||
		if conn := ws.getUserConn(v); conn != nil {
 | 
			
		||||
	recvID := in.PushToUserID
 | 
			
		||||
	platformList := genPlatformArray()
 | 
			
		||||
	for _, v := range platformList {
 | 
			
		||||
		if conn := ws.getUserConn(recvID, v); conn != nil {
 | 
			
		||||
			tag = true
 | 
			
		||||
			resultCode := sendMsgToUser(conn, replyBytes.Bytes(), in, UIDAndPID[1], UIDAndPID[0])
 | 
			
		||||
			resultCode := sendMsgToUser(conn, replyBytes.Bytes(), in, v, recvID)
 | 
			
		||||
			temp := &pbRelay.SingleMsgToUser{
 | 
			
		||||
				ResultCode:     resultCode,
 | 
			
		||||
				RecvID:         UIDAndPID[0],
 | 
			
		||||
				RecvPlatFormID: utils.PlatformNameToID(UIDAndPID[1]),
 | 
			
		||||
				RecvID:         recvID,
 | 
			
		||||
				RecvPlatFormID: constant.PlatformNameToID(v),
 | 
			
		||||
			}
 | 
			
		||||
			resp = append(resp, temp)
 | 
			
		||||
		} else {
 | 
			
		||||
			temp := &pbRelay.SingleMsgToUser{
 | 
			
		||||
				ResultCode:     -1,
 | 
			
		||||
				RecvID:         UIDAndPID[0],
 | 
			
		||||
				RecvPlatFormID: utils.PlatformNameToID(UIDAndPID[1]),
 | 
			
		||||
				RecvID:         recvID,
 | 
			
		||||
				RecvPlatFormID: constant.PlatformNameToID(v),
 | 
			
		||||
			}
 | 
			
		||||
			resp = append(resp, temp)
 | 
			
		||||
		}
 | 
			
		||||
@ -129,16 +106,43 @@ func (r *RPCServer) MsgToUser(_ context.Context, in *pbRelay.MsgToUserReq) (*pbR
 | 
			
		||||
	if !tag {
 | 
			
		||||
		log.NewError(in.OperationID, "push err ,no matched ws conn not in map", in.String())
 | 
			
		||||
	}
 | 
			
		||||
	return &pbRelay.MsgToUserResp{
 | 
			
		||||
	return &pbRelay.OnlinePushMsgResp{
 | 
			
		||||
		Resp: resp,
 | 
			
		||||
	}, nil
 | 
			
		||||
}
 | 
			
		||||
func (r *RPCServer) GetUsersOnlineStatus(_ context.Context, req *pbRelay.GetUsersOnlineStatusReq) (*pbRelay.GetUsersOnlineStatusResp, error) {
 | 
			
		||||
	log.NewInfo(req.OperationID, "rpc GetUsersOnlineStatus arrived server", req.String())
 | 
			
		||||
	if !token_verify.IsMangerUserID(req.OpUserID) {
 | 
			
		||||
		log.NewError(req.OperationID, "no permission GetUsersOnlineStatus ", req.OpUserID)
 | 
			
		||||
		return &pbRelay.GetUsersOnlineStatusResp{ErrCode: constant.ErrAccess.ErrCode, ErrMsg: constant.ErrAccess.ErrMsg}, nil
 | 
			
		||||
	}
 | 
			
		||||
	var resp pbRelay.GetUsersOnlineStatusResp
 | 
			
		||||
	for _, userID := range req.UserIDList {
 | 
			
		||||
		platformList := genPlatformArray()
 | 
			
		||||
		temp := new(pbRelay.GetUsersOnlineStatusResp_SuccessResult)
 | 
			
		||||
		temp.UserID = userID
 | 
			
		||||
		for _, platform := range platformList {
 | 
			
		||||
			if conn := ws.getUserConn(userID, platform); conn != nil {
 | 
			
		||||
				ps := new(pbRelay.GetUsersOnlineStatusResp_SuccessDetail)
 | 
			
		||||
				ps.Platform = platform
 | 
			
		||||
				ps.Status = constant.OnlineStatus
 | 
			
		||||
				temp.Status = constant.OnlineStatus
 | 
			
		||||
				temp.DetailPlatformStatus = append(temp.DetailPlatformStatus, ps)
 | 
			
		||||
 | 
			
		||||
func sendMsgToUser(conn *UserConn, bMsg []byte, in *pbRelay.MsgToUserReq, RecvPlatForm, RecvID string) (ResultCode int64) {
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if temp.Status == constant.OnlineStatus {
 | 
			
		||||
			resp.SuccessResult = append(resp.SuccessResult, temp)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	log.NewInfo(req.OperationID, "GetUsersOnlineStatus rpc return ", resp.String())
 | 
			
		||||
	return &resp, nil
 | 
			
		||||
}
 | 
			
		||||
func sendMsgToUser(conn *UserConn, bMsg []byte, in *pbRelay.OnlinePushMsgReq, RecvPlatForm, RecvID string) (ResultCode int64) {
 | 
			
		||||
	err := ws.writeMsg(conn, websocket.BinaryMessage, bMsg)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.ErrorByKv("PushMsgToUser is failed By Ws", "", "Addr", conn.RemoteAddr().String(),
 | 
			
		||||
			"error", err, "senderPlatform", utils.PlatformIDToName(in.PlatformID), "recvPlatform", RecvPlatForm, "args", in.String(), "recvID", RecvID)
 | 
			
		||||
			"error", err, "senderPlatform", constant.PlatformIDToName(in.MsgData.SenderPlatformID), "recvPlatform", RecvPlatForm, "args", in.String(), "recvID", RecvID)
 | 
			
		||||
		ResultCode = -2
 | 
			
		||||
		return ResultCode
 | 
			
		||||
	} else {
 | 
			
		||||
@ -148,9 +152,9 @@ func sendMsgToUser(conn *UserConn, bMsg []byte, in *pbRelay.MsgToUserReq, RecvPl
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
func genUidPlatformArray(uid string) (array []string) {
 | 
			
		||||
	for i := 1; i <= utils.LinuxPlatformID; i++ {
 | 
			
		||||
		array = append(array, uid+" "+utils.PlatformIDToName(int32(i)))
 | 
			
		||||
func genPlatformArray() (array []string) {
 | 
			
		||||
	for i := 1; i <= constant.LinuxPlatformID; i++ {
 | 
			
		||||
		array = append(array, constant.PlatformIDToName(int32(i)))
 | 
			
		||||
	}
 | 
			
		||||
	return array
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -58,8 +58,8 @@ type SeqListData struct {
 | 
			
		||||
 | 
			
		||||
func (ws *WServer) argsValidate(m *Req, r int32) (isPass bool, errCode int32, errMsg string, returnData interface{}) {
 | 
			
		||||
	switch r {
 | 
			
		||||
	case constant.WSSendMsg:
 | 
			
		||||
		data := open_im_sdk.UserSendMsgReq{}
 | 
			
		||||
	case constant.WSSendMsg | constant.WSSendSignalMsg:
 | 
			
		||||
		data := open_im_sdk.MsgData{}
 | 
			
		||||
		if err := proto.Unmarshal(m.Data, &data); err != nil {
 | 
			
		||||
			log.ErrorByKv("Decode Data struct  err", "", "err", err.Error(), "reqIdentifier", r)
 | 
			
		||||
			return false, 203, err.Error(), nil
 | 
			
		||||
 | 
			
		||||
@ -2,12 +2,19 @@ package gate
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"Open_IM/pkg/common/config"
 | 
			
		||||
	"Open_IM/pkg/common/constant"
 | 
			
		||||
	"Open_IM/pkg/common/db"
 | 
			
		||||
	"Open_IM/pkg/common/log"
 | 
			
		||||
	"Open_IM/pkg/common/token_verify"
 | 
			
		||||
	"Open_IM/pkg/utils"
 | 
			
		||||
	"github.com/gorilla/websocket"
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"encoding/gob"
 | 
			
		||||
	"github.com/garyburd/redigo/redis"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"sync"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/gorilla/websocket"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type UserConn struct {
 | 
			
		||||
@ -18,16 +25,15 @@ type WServer struct {
 | 
			
		||||
	wsAddr       string
 | 
			
		||||
	wsMaxConnNum int
 | 
			
		||||
	wsUpGrader   *websocket.Upgrader
 | 
			
		||||
	wsConnToUser map[*UserConn]string
 | 
			
		||||
	wsUserToConn map[string]*UserConn
 | 
			
		||||
	wsConnToUser map[*UserConn]map[string]string
 | 
			
		||||
	wsUserToConn map[string]map[string]*UserConn
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (ws *WServer) onInit(wsPort int) {
 | 
			
		||||
	ip := utils.ServerIP
 | 
			
		||||
	ws.wsAddr = ip + ":" + utils.IntToString(wsPort)
 | 
			
		||||
	ws.wsAddr = ":" + utils.IntToString(wsPort)
 | 
			
		||||
	ws.wsMaxConnNum = config.Config.LongConnSvr.WebsocketMaxConnNum
 | 
			
		||||
	ws.wsConnToUser = make(map[*UserConn]string)
 | 
			
		||||
	ws.wsUserToConn = make(map[string]*UserConn)
 | 
			
		||||
	ws.wsConnToUser = make(map[*UserConn]map[string]string)
 | 
			
		||||
	ws.wsUserToConn = make(map[string]map[string]*UserConn)
 | 
			
		||||
	ws.wsUpGrader = &websocket.Upgrader{
 | 
			
		||||
		HandshakeTimeout: time.Duration(config.Config.LongConnSvr.WebsocketTimeOut) * time.Second,
 | 
			
		||||
		ReadBufferSize:   config.Config.LongConnSvr.WebsocketMaxMsgLen,
 | 
			
		||||
@ -53,10 +59,10 @@ func (ws *WServer) wsHandler(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
		} else {
 | 
			
		||||
			//Connection mapping relationship,
 | 
			
		||||
			//userID+" "+platformID->conn
 | 
			
		||||
			SendID := query["sendID"][0] + " " + utils.PlatformIDToName(int32(utils.StringToInt64(query["platformID"][0])))
 | 
			
		||||
 | 
			
		||||
			//Initialize a lock for each user
 | 
			
		||||
			newConn := &UserConn{conn, new(sync.Mutex)}
 | 
			
		||||
			ws.addUserConn(SendID, newConn)
 | 
			
		||||
			ws.addUserConn(query["sendID"][0], int32(utils.StringToInt64(query["platformID"][0])), newConn, query["token"][0])
 | 
			
		||||
			go ws.readMsg(newConn)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
@ -69,7 +75,8 @@ func (ws *WServer) readMsg(conn *UserConn) {
 | 
			
		||||
			log.NewInfo("", "this is a  pingMessage")
 | 
			
		||||
		}
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			log.ErrorByKv("WS ReadMsg error", "", "userIP", conn.RemoteAddr().String(), "userUid", ws.getUserUid(conn), "error", err)
 | 
			
		||||
			uid, platform := ws.getUserUid(conn)
 | 
			
		||||
			log.ErrorByKv("WS ReadMsg error", "", "userIP", conn.RemoteAddr().String(), "userUid", uid, "platform", platform, "error", err.Error())
 | 
			
		||||
			ws.delUserConn(conn)
 | 
			
		||||
			return
 | 
			
		||||
		} else {
 | 
			
		||||
@ -86,70 +93,176 @@ func (ws *WServer) writeMsg(conn *UserConn, a int, msg []byte) error {
 | 
			
		||||
	return conn.WriteMessage(a, msg)
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
func (ws *WServer) addUserConn(uid string, conn *UserConn) {
 | 
			
		||||
func (ws *WServer) MultiTerminalLoginChecker(uid string, platformID int32, newConn *UserConn, token string) {
 | 
			
		||||
	switch config.Config.MultiLoginPolicy {
 | 
			
		||||
	case constant.AllLoginButSameTermKick:
 | 
			
		||||
		if oldConnMap, ok := ws.wsUserToConn[uid]; ok {
 | 
			
		||||
			if oldConn, ok := oldConnMap[constant.PlatformIDToName(platformID)]; ok {
 | 
			
		||||
				log.NewDebug("", uid, platformID, "kick old conn")
 | 
			
		||||
				ws.sendKickMsg(oldConn, newConn)
 | 
			
		||||
				m, err := db.DB.GetTokenMapByUidPid(uid, constant.PlatformIDToName(platformID))
 | 
			
		||||
				if err != nil && err != redis.ErrNil {
 | 
			
		||||
					log.NewError("", "get token from redis err", err.Error())
 | 
			
		||||
					return
 | 
			
		||||
				}
 | 
			
		||||
				if m == nil {
 | 
			
		||||
					log.NewError("", "get token from redis err", "m is nil")
 | 
			
		||||
					return
 | 
			
		||||
				}
 | 
			
		||||
				for k, _ := range m {
 | 
			
		||||
					if k != token {
 | 
			
		||||
						m[k] = constant.KickedToken
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
				log.NewDebug("get map is ", m)
 | 
			
		||||
				err = db.DB.SetTokenMapByUidPid(uid, platformID, m)
 | 
			
		||||
				if err != nil {
 | 
			
		||||
					log.NewError("", "SetTokenMapByUidPid err", err.Error())
 | 
			
		||||
					return
 | 
			
		||||
				}
 | 
			
		||||
				err = oldConn.Close()
 | 
			
		||||
				delete(oldConnMap, constant.PlatformIDToName(platformID))
 | 
			
		||||
				ws.wsUserToConn[uid] = oldConnMap
 | 
			
		||||
				if len(oldConnMap) == 0 {
 | 
			
		||||
					delete(ws.wsUserToConn, uid)
 | 
			
		||||
				}
 | 
			
		||||
				delete(ws.wsConnToUser, oldConn)
 | 
			
		||||
				if err != nil {
 | 
			
		||||
					log.NewError("", "conn close err", err.Error(), uid, platformID)
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
		} else {
 | 
			
		||||
			log.NewDebug("no other conn", ws.wsUserToConn)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	case constant.SingleTerminalLogin:
 | 
			
		||||
	case constant.WebAndOther:
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
func (ws *WServer) sendKickMsg(oldConn, newConn *UserConn) {
 | 
			
		||||
	mReply := Resp{
 | 
			
		||||
		ReqIdentifier: constant.WSKickOnlineMsg,
 | 
			
		||||
		ErrCode:       constant.ErrTokenInvalid.ErrCode,
 | 
			
		||||
		ErrMsg:        constant.ErrTokenInvalid.ErrMsg,
 | 
			
		||||
	}
 | 
			
		||||
	var b bytes.Buffer
 | 
			
		||||
	enc := gob.NewEncoder(&b)
 | 
			
		||||
	err := enc.Encode(mReply)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(mReply.OperationID, mReply.ReqIdentifier, mReply.ErrCode, mReply.ErrMsg, "Encode Msg error", oldConn.RemoteAddr().String(), newConn.RemoteAddr().String(), err.Error())
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	err = ws.writeMsg(oldConn, websocket.BinaryMessage, b.Bytes())
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(mReply.OperationID, mReply.ReqIdentifier, mReply.ErrCode, mReply.ErrMsg, "WS WriteMsg error", oldConn.RemoteAddr().String(), newConn.RemoteAddr().String(), err.Error())
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
func (ws *WServer) addUserConn(uid string, platformID int32, conn *UserConn, token string) {
 | 
			
		||||
	rwLock.Lock()
 | 
			
		||||
	defer rwLock.Unlock()
 | 
			
		||||
	if oldConn, ok := ws.wsUserToConn[uid]; ok {
 | 
			
		||||
		err := oldConn.Close()
 | 
			
		||||
		delete(ws.wsConnToUser, oldConn)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			log.ErrorByKv("close err", "", "uid", uid, "conn", conn)
 | 
			
		||||
		}
 | 
			
		||||
	ws.MultiTerminalLoginChecker(uid, platformID, conn, token)
 | 
			
		||||
	if oldConnMap, ok := ws.wsUserToConn[uid]; ok {
 | 
			
		||||
		oldConnMap[constant.PlatformIDToName(platformID)] = conn
 | 
			
		||||
		ws.wsUserToConn[uid] = oldConnMap
 | 
			
		||||
	} else {
 | 
			
		||||
		log.InfoByKv("this user is first login", "", "uid", uid)
 | 
			
		||||
		i := make(map[string]*UserConn)
 | 
			
		||||
		i[constant.PlatformIDToName(platformID)] = conn
 | 
			
		||||
		ws.wsUserToConn[uid] = i
 | 
			
		||||
	}
 | 
			
		||||
	ws.wsConnToUser[conn] = uid
 | 
			
		||||
	ws.wsUserToConn[uid] = conn
 | 
			
		||||
	log.WarnByKv("WS Add operation", "", "wsUser added", ws.wsUserToConn, "uid", uid, "online_num", len(ws.wsUserToConn))
 | 
			
		||||
	if oldStringMap, ok := ws.wsConnToUser[conn]; ok {
 | 
			
		||||
		oldStringMap[constant.PlatformIDToName(platformID)] = uid
 | 
			
		||||
		ws.wsConnToUser[conn] = oldStringMap
 | 
			
		||||
	} else {
 | 
			
		||||
		i := make(map[string]string)
 | 
			
		||||
		i[constant.PlatformIDToName(platformID)] = uid
 | 
			
		||||
		ws.wsConnToUser[conn] = i
 | 
			
		||||
	}
 | 
			
		||||
	count := 0
 | 
			
		||||
	for _, v := range ws.wsUserToConn {
 | 
			
		||||
		count = count + len(v)
 | 
			
		||||
	}
 | 
			
		||||
	log.Debug("WS Add operation", "", "wsUser added", ws.wsUserToConn, "connection_uid", uid, "connection_platform", constant.PlatformIDToName(platformID), "online_user_num", len(ws.wsUserToConn), "online_conn_num", count)
 | 
			
		||||
	userCount = uint64(len(ws.wsUserToConn))
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (ws *WServer) delUserConn(conn *UserConn) {
 | 
			
		||||
	rwLock.Lock()
 | 
			
		||||
	defer rwLock.Unlock()
 | 
			
		||||
	var uidPlatform string
 | 
			
		||||
	if uid, ok := ws.wsConnToUser[conn]; ok {
 | 
			
		||||
		uidPlatform = uid
 | 
			
		||||
		if _, ok = ws.wsUserToConn[uid]; ok {
 | 
			
		||||
			delete(ws.wsUserToConn, uid)
 | 
			
		||||
			log.WarnByKv("WS delete operation", "", "wsUser deleted", ws.wsUserToConn, "uid", uid, "online_num", len(ws.wsUserToConn))
 | 
			
		||||
		} else {
 | 
			
		||||
			log.WarnByKv("uid not exist", "", "wsUser deleted", ws.wsUserToConn, "uid", uid, "online_num", len(ws.wsUserToConn))
 | 
			
		||||
	var platform, uid string
 | 
			
		||||
	if oldStringMap, ok := ws.wsConnToUser[conn]; ok {
 | 
			
		||||
		for k, v := range oldStringMap {
 | 
			
		||||
			platform = k
 | 
			
		||||
			uid = v
 | 
			
		||||
		}
 | 
			
		||||
		if oldConnMap, ok := ws.wsUserToConn[uid]; ok {
 | 
			
		||||
			delete(oldConnMap, platform)
 | 
			
		||||
			ws.wsUserToConn[uid] = oldConnMap
 | 
			
		||||
			if len(oldConnMap) == 0 {
 | 
			
		||||
				delete(ws.wsUserToConn, uid)
 | 
			
		||||
			}
 | 
			
		||||
			count := 0
 | 
			
		||||
			for _, v := range ws.wsUserToConn {
 | 
			
		||||
				count = count + len(v)
 | 
			
		||||
			}
 | 
			
		||||
			log.WarnByKv("WS delete operation", "", "wsUser deleted", ws.wsUserToConn, "disconnection_uid", uid, "disconnection_platform", platform, "online_user_num", len(ws.wsUserToConn), "online_conn_num", count)
 | 
			
		||||
		} else {
 | 
			
		||||
			log.WarnByKv("WS delete operation", "", "wsUser deleted", ws.wsUserToConn, "disconnection_uid", uid, "disconnection_platform", platform, "online_user_num", len(ws.wsUserToConn))
 | 
			
		||||
		}
 | 
			
		||||
		userCount = uint64(len(ws.wsUserToConn))
 | 
			
		||||
		delete(ws.wsConnToUser, conn)
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
	err := conn.Close()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.ErrorByKv("close err", "", "uid", uidPlatform)
 | 
			
		||||
		log.ErrorByKv("close err", "", "uid", uid, "platform", platform)
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (ws *WServer) getUserConn(uid string) *UserConn {
 | 
			
		||||
func (ws *WServer) getUserConn(uid string, platform string) *UserConn {
 | 
			
		||||
	rwLock.RLock()
 | 
			
		||||
	defer rwLock.RUnlock()
 | 
			
		||||
	if conn, ok := ws.wsUserToConn[uid]; ok {
 | 
			
		||||
		return conn
 | 
			
		||||
	if connMap, ok := ws.wsUserToConn[uid]; ok {
 | 
			
		||||
		if conn, flag := connMap[platform]; flag {
 | 
			
		||||
			return conn
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
func (ws *WServer) getUserUid(conn *UserConn) string {
 | 
			
		||||
func (ws *WServer) getSingleUserAllConn(uid string) map[string]*UserConn {
 | 
			
		||||
	rwLock.RLock()
 | 
			
		||||
	defer rwLock.RUnlock()
 | 
			
		||||
	if connMap, ok := ws.wsUserToConn[uid]; ok {
 | 
			
		||||
		return connMap
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
func (ws *WServer) getUserUid(conn *UserConn) (uid, platform string) {
 | 
			
		||||
	rwLock.RLock()
 | 
			
		||||
	defer rwLock.RUnlock()
 | 
			
		||||
 | 
			
		||||
	if uid, ok := ws.wsConnToUser[conn]; ok {
 | 
			
		||||
		return uid
 | 
			
		||||
	if stringMap, ok := ws.wsConnToUser[conn]; ok {
 | 
			
		||||
		for k, v := range stringMap {
 | 
			
		||||
			platform = k
 | 
			
		||||
			uid = v
 | 
			
		||||
		}
 | 
			
		||||
		return uid, platform
 | 
			
		||||
	}
 | 
			
		||||
	return ""
 | 
			
		||||
	return "", ""
 | 
			
		||||
}
 | 
			
		||||
func (ws *WServer) headerCheck(w http.ResponseWriter, r *http.Request) bool {
 | 
			
		||||
	status := http.StatusUnauthorized
 | 
			
		||||
	query := r.URL.Query()
 | 
			
		||||
	if len(query["token"]) != 0 && len(query["sendID"]) != 0 && len(query["platformID"]) != 0 {
 | 
			
		||||
		if !utils.VerifyToken(query["token"][0], query["sendID"][0]) {
 | 
			
		||||
		if ok, err := token_verify.VerifyToken(query["token"][0], query["sendID"][0]); !ok {
 | 
			
		||||
			e := err.(*constant.ErrInfo)
 | 
			
		||||
			log.ErrorByKv("Token verify failed", "", "query", query)
 | 
			
		||||
			w.Header().Set("Sec-Websocket-Version", "13")
 | 
			
		||||
			http.Error(w, http.StatusText(status), status)
 | 
			
		||||
			http.Error(w, e.ErrMsg, int(e.ErrCode))
 | 
			
		||||
			return false
 | 
			
		||||
		} else {
 | 
			
		||||
			log.InfoByKv("Connection Authentication Success", "", "token", query["token"][0], "userID", query["sendID"][0])
 | 
			
		||||
@ -161,5 +274,7 @@ func (ws *WServer) headerCheck(w http.ResponseWriter, r *http.Request) bool {
 | 
			
		||||
		http.Error(w, http.StatusText(status), status)
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
func genMapKey(uid string, platformID int32) string {
 | 
			
		||||
	return uid + " " + constant.PlatformIDToName(platformID)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -2,24 +2,22 @@ package logic
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"Open_IM/pkg/common/db"
 | 
			
		||||
	"Open_IM/pkg/common/db/mysql_model/im_mysql_model"
 | 
			
		||||
	"Open_IM/pkg/common/log"
 | 
			
		||||
	pbMsg "Open_IM/pkg/proto/chat"
 | 
			
		||||
	"Open_IM/pkg/utils"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func saveUserChat(uid string, pbMsg *pbMsg.MsgSvrToPushSvrChatMsg) error {
 | 
			
		||||
func saveUserChat(uid string, msg *pbMsg.MsgDataToMQ) error {
 | 
			
		||||
	time := utils.GetCurrentTimestampByMill()
 | 
			
		||||
	seq, err := db.DB.IncrUserSeq(uid)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.NewError(pbMsg.OperationID, "data insert to redis err", err.Error(), pbMsg.String())
 | 
			
		||||
		log.NewError(msg.OperationID, "data insert to redis err", err.Error(), msg.String())
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	pbMsg.RecvSeq = seq
 | 
			
		||||
	log.NewInfo(pbMsg.OperationID, "IncrUserSeq cost time", utils.GetCurrentTimestampByMill()-time)
 | 
			
		||||
	return db.DB.SaveUserChat(uid, pbMsg.SendTime, pbMsg)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func getGroupList(groupID string) ([]string, error) {
 | 
			
		||||
	return im_mysql_model.SelectGroupList(groupID)
 | 
			
		||||
	msg.MsgData.Seq = uint32(seq)
 | 
			
		||||
	pbSaveData := pbMsg.MsgDataToDB{}
 | 
			
		||||
	pbSaveData.MsgData = msg.MsgData
 | 
			
		||||
	log.NewInfo(msg.OperationID, "IncrUserSeq cost time", utils.GetCurrentTimestampByMill()-time)
 | 
			
		||||
	return db.DB.SaveUserChatMongo2(uid, pbSaveData.MsgData.SendTime, &pbSaveData)
 | 
			
		||||
//	return db.DB.SaveUserChatMongo2(uid, pbSaveData.MsgData.SendTime, &pbSaveData)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -8,6 +8,7 @@ import (
 | 
			
		||||
	"Open_IM/pkg/grpc-etcdv3/getcdv3"
 | 
			
		||||
	pbMsg "Open_IM/pkg/proto/chat"
 | 
			
		||||
	pbPush "Open_IM/pkg/proto/push"
 | 
			
		||||
	"Open_IM/pkg/statistics"
 | 
			
		||||
	"Open_IM/pkg/utils"
 | 
			
		||||
	"context"
 | 
			
		||||
	"github.com/Shopify/sarama"
 | 
			
		||||
@ -20,9 +21,14 @@ type fcb func(msg []byte, msgKey string)
 | 
			
		||||
type HistoryConsumerHandler struct {
 | 
			
		||||
	msgHandle            map[string]fcb
 | 
			
		||||
	historyConsumerGroup *kfk.MConsumerGroup
 | 
			
		||||
	singleMsgCount       uint64
 | 
			
		||||
	groupMsgCount        uint64
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (mc *HistoryConsumerHandler) Init() {
 | 
			
		||||
	statistics.NewStatistics(&mc.singleMsgCount, config.Config.ModuleName.MsgTransferName, "singleMsgCount insert to mongo ", 300)
 | 
			
		||||
	statistics.NewStatistics(&mc.groupMsgCount, config.Config.ModuleName.MsgTransferName, "groupMsgCount insert to mongo ", 300)
 | 
			
		||||
 | 
			
		||||
	mc.msgHandle = make(map[string]fcb)
 | 
			
		||||
	mc.msgHandle[config.Config.Kafka.Ws2mschat.Topic] = mc.handleChatWs2Mongo
 | 
			
		||||
	mc.historyConsumerGroup = kfk.NewMConsumerGroup(&kfk.MConsumerGroupConfig{KafkaVersion: sarama.V0_10_2_0,
 | 
			
		||||
@ -32,80 +38,53 @@ func (mc *HistoryConsumerHandler) Init() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (mc *HistoryConsumerHandler) handleChatWs2Mongo(msg []byte, msgKey string) {
 | 
			
		||||
	log.InfoByKv("chat come mongo!!!", "", "chat", string(msg))
 | 
			
		||||
	log.NewInfo("msg come mongo!!!", "", "msg", string(msg))
 | 
			
		||||
	time := utils.GetCurrentTimestampByNano()
 | 
			
		||||
	pbData := pbMsg.WSToMsgSvrChatMsg{}
 | 
			
		||||
	err := proto.Unmarshal(msg, &pbData)
 | 
			
		||||
	msgFromMQ := pbMsg.MsgDataToMQ{}
 | 
			
		||||
	err := proto.Unmarshal(msg, &msgFromMQ)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.ErrorByKv("msg_transfer Unmarshal chat err", "", "chat", string(msg), "err", err.Error())
 | 
			
		||||
		log.ErrorByKv("msg_transfer Unmarshal msg err", "", "msg", string(msg), "err", err.Error())
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	pbSaveData := pbMsg.MsgSvrToPushSvrChatMsg{}
 | 
			
		||||
	pbSaveData.SendID = pbData.SendID
 | 
			
		||||
	pbSaveData.SenderNickName = pbData.SenderNickName
 | 
			
		||||
	pbSaveData.SenderFaceURL = pbData.SenderFaceURL
 | 
			
		||||
	pbSaveData.ClientMsgID = pbData.ClientMsgID
 | 
			
		||||
	pbSaveData.SendTime = pbData.SendTime
 | 
			
		||||
	pbSaveData.Content = pbData.Content
 | 
			
		||||
	pbSaveData.MsgFrom = pbData.MsgFrom
 | 
			
		||||
	pbSaveData.ContentType = pbData.ContentType
 | 
			
		||||
	pbSaveData.SessionType = pbData.SessionType
 | 
			
		||||
	pbSaveData.MsgID = pbData.MsgID
 | 
			
		||||
	pbSaveData.OperationID = pbData.OperationID
 | 
			
		||||
	pbSaveData.RecvID = pbData.RecvID
 | 
			
		||||
	pbSaveData.PlatformID = pbData.PlatformID
 | 
			
		||||
	Options := utils.JsonStringToMap(pbData.Options)
 | 
			
		||||
	operationID := msgFromMQ.OperationID
 | 
			
		||||
	//Control whether to store offline messages (mongo)
 | 
			
		||||
	isHistory := utils.GetSwitchFromOptions(Options, "history")
 | 
			
		||||
	isHistory := utils.GetSwitchFromOptions(msgFromMQ.MsgData.Options, constant.IsHistory)
 | 
			
		||||
	//Control whether to store history messages (mysql)
 | 
			
		||||
	isPersist := utils.GetSwitchFromOptions(Options, "persistent")
 | 
			
		||||
	switch pbData.SessionType {
 | 
			
		||||
	isPersist := utils.GetSwitchFromOptions(msgFromMQ.MsgData.Options, constant.IsPersistent)
 | 
			
		||||
	isSenderSync := utils.GetSwitchFromOptions(msgFromMQ.MsgData.Options, constant.IsSenderSync)
 | 
			
		||||
	switch msgFromMQ.MsgData.SessionType {
 | 
			
		||||
	case constant.SingleChatType:
 | 
			
		||||
		log.NewDebug(pbSaveData.OperationID, "msg_transfer chat type = SingleChatType", isHistory, isPersist)
 | 
			
		||||
		log.NewDebug(msgFromMQ.OperationID, "msg_transfer msg type = SingleChatType", isHistory, isPersist)
 | 
			
		||||
		if isHistory {
 | 
			
		||||
			if msgKey == pbSaveData.RecvID {
 | 
			
		||||
				err := saveUserChat(pbData.RecvID, &pbSaveData)
 | 
			
		||||
				if err != nil {
 | 
			
		||||
					log.NewError(pbSaveData.OperationID, "single data insert to mongo err", err.Error(), pbSaveData.String())
 | 
			
		||||
					return
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
			} else if msgKey == pbSaveData.SendID {
 | 
			
		||||
				err := saveUserChat(pbData.SendID, &pbSaveData)
 | 
			
		||||
				if err != nil {
 | 
			
		||||
					log.NewError(pbSaveData.OperationID, "single data insert to mongo err", err.Error(), pbSaveData.String())
 | 
			
		||||
					return
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			log.NewDebug(pbSaveData.OperationID, "saveUserChat cost time ", utils.GetCurrentTimestampByNano()-time)
 | 
			
		||||
		}
 | 
			
		||||
		if msgKey == pbSaveData.RecvID {
 | 
			
		||||
			pbSaveData.Options = pbData.Options
 | 
			
		||||
			pbSaveData.OfflineInfo = pbData.OfflineInfo
 | 
			
		||||
			go sendMessageToPush(&pbSaveData)
 | 
			
		||||
			log.NewDebug(pbSaveData.OperationID, "sendMessageToPush cost time ", utils.GetCurrentTimestampByNano()-time)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	case constant.GroupChatType:
 | 
			
		||||
		log.NewDebug(pbSaveData.OperationID, "msg_transfer chat type = GroupChatType", isHistory, isPersist)
 | 
			
		||||
		if isHistory {
 | 
			
		||||
			uidAndGroupID := strings.Split(pbData.RecvID, " ")
 | 
			
		||||
			err := saveUserChat(uidAndGroupID[0], &pbSaveData)
 | 
			
		||||
			err := saveUserChat(msgKey, &msgFromMQ)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				log.NewError(pbSaveData.OperationID, "group data insert to mongo err", pbSaveData.String(), uidAndGroupID[0], err.Error())
 | 
			
		||||
				log.NewError(operationID, "single data insert to mongo err", err.Error(), msgFromMQ.String())
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
			mc.singleMsgCount++
 | 
			
		||||
			log.NewDebug(msgFromMQ.OperationID, "sendMessageToPush cost time ", utils.GetCurrentTimestampByNano()-time)
 | 
			
		||||
		}
 | 
			
		||||
		pbSaveData.Options = pbData.Options
 | 
			
		||||
		pbSaveData.OfflineInfo = pbData.OfflineInfo
 | 
			
		||||
		go sendMessageToPush(&pbSaveData)
 | 
			
		||||
		if !isSenderSync && msgKey == msgFromMQ.MsgData.SendID {
 | 
			
		||||
		} else {
 | 
			
		||||
			go sendMessageToPush(&msgFromMQ, msgKey)
 | 
			
		||||
		}
 | 
			
		||||
		log.NewDebug(operationID, "saveUserChat cost time ", utils.GetCurrentTimestampByNano()-time)
 | 
			
		||||
	case constant.GroupChatType:
 | 
			
		||||
		log.NewDebug(msgFromMQ.OperationID, "msg_transfer msg type = GroupChatType", isHistory, isPersist)
 | 
			
		||||
		if isHistory {
 | 
			
		||||
			err := saveUserChat(msgFromMQ.MsgData.RecvID, &msgFromMQ)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				log.NewError(operationID, "group data insert to mongo err", msgFromMQ.String(), msgFromMQ.MsgData.RecvID, err.Error())
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
			mc.groupMsgCount++
 | 
			
		||||
		}
 | 
			
		||||
		go sendMessageToPush(&msgFromMQ, msgFromMQ.MsgData.RecvID)
 | 
			
		||||
	default:
 | 
			
		||||
		log.NewError(pbSaveData.OperationID, "SessionType error", pbSaveData.String())
 | 
			
		||||
		log.NewError(msgFromMQ.OperationID, "SessionType error", msgFromMQ.String())
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	log.NewDebug(pbSaveData.OperationID, "msg_transfer handle topic data to database success...", pbSaveData.String())
 | 
			
		||||
	log.NewDebug(msgFromMQ.OperationID, "msg_transfer handle topic data to database success...", msgFromMQ.String())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (HistoryConsumerHandler) Setup(_ sarama.ConsumerGroupSession) error   { return nil }
 | 
			
		||||
@ -113,50 +92,35 @@ func (HistoryConsumerHandler) Cleanup(_ sarama.ConsumerGroupSession) error { ret
 | 
			
		||||
func (mc *HistoryConsumerHandler) ConsumeClaim(sess sarama.ConsumerGroupSession,
 | 
			
		||||
	claim sarama.ConsumerGroupClaim) error {
 | 
			
		||||
	for msg := range claim.Messages() {
 | 
			
		||||
		log.InfoByKv("kafka get info to mongo", "", "msgTopic", msg.Topic, "msgPartition", msg.Partition, "chat", string(msg.Value))
 | 
			
		||||
		log.InfoByKv("kafka get info to mongo", "", "msgTopic", msg.Topic, "msgPartition", msg.Partition, "msg", string(msg.Value))
 | 
			
		||||
		mc.msgHandle[msg.Topic](msg.Value, string(msg.Key))
 | 
			
		||||
		sess.MarkMessage(msg, "")
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
func sendMessageToPush(message *pbMsg.MsgSvrToPushSvrChatMsg) {
 | 
			
		||||
func sendMessageToPush(message *pbMsg.MsgDataToMQ, pushToUserID string) {
 | 
			
		||||
	log.InfoByKv("msg_transfer send message to push", message.OperationID, "message", message.String())
 | 
			
		||||
	msg := pbPush.PushMsgReq{}
 | 
			
		||||
	msg.OperationID = message.OperationID
 | 
			
		||||
	msg.PlatformID = message.PlatformID
 | 
			
		||||
	msg.Content = message.Content
 | 
			
		||||
	msg.ContentType = message.ContentType
 | 
			
		||||
	msg.SessionType = message.SessionType
 | 
			
		||||
	msg.RecvID = message.RecvID
 | 
			
		||||
	msg.SendID = message.SendID
 | 
			
		||||
	msg.SenderNickName = message.SenderNickName
 | 
			
		||||
	msg.SenderFaceURL = message.SenderFaceURL
 | 
			
		||||
	msg.ClientMsgID = message.ClientMsgID
 | 
			
		||||
	msg.MsgFrom = message.MsgFrom
 | 
			
		||||
	msg.Options = message.Options
 | 
			
		||||
	msg.RecvSeq = message.RecvSeq
 | 
			
		||||
	msg.SendTime = message.SendTime
 | 
			
		||||
	msg.MsgID = message.MsgID
 | 
			
		||||
	msg.OfflineInfo = message.OfflineInfo
 | 
			
		||||
	rpcPushMsg := pbPush.PushMsgReq{OperationID: message.OperationID, MsgData: message.MsgData, PushToUserID: pushToUserID}
 | 
			
		||||
	mqPushMsg := pbMsg.PushMsgDataToMQ{OperationID: message.OperationID, MsgData: message.MsgData, PushToUserID: pushToUserID}
 | 
			
		||||
	grpcConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImPushName)
 | 
			
		||||
	if grpcConn == nil {
 | 
			
		||||
		log.ErrorByKv("rpc dial failed", msg.OperationID, "push data", msg.String())
 | 
			
		||||
		pid, offset, err := producer.SendMessage(message)
 | 
			
		||||
		log.ErrorByKv("rpc dial failed", rpcPushMsg.OperationID, "push data", rpcPushMsg.String())
 | 
			
		||||
		pid, offset, err := producer.SendMessage(&mqPushMsg)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			log.ErrorByKv("kafka send failed", msg.OperationID, "send data", message.String(), "pid", pid, "offset", offset, "err", err.Error())
 | 
			
		||||
			log.ErrorByKv("kafka send failed", mqPushMsg.OperationID, "send data", message.String(), "pid", pid, "offset", offset, "err", err.Error())
 | 
			
		||||
		}
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	msgClient := pbPush.NewPushMsgServiceClient(grpcConn)
 | 
			
		||||
	_, err := msgClient.PushMsg(context.Background(), &msg)
 | 
			
		||||
	_, err := msgClient.PushMsg(context.Background(), &rpcPushMsg)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.ErrorByKv("rpc send failed", msg.OperationID, "push data", msg.String(), "err", err.Error())
 | 
			
		||||
		pid, offset, err := producer.SendMessage(message)
 | 
			
		||||
		log.ErrorByKv("rpc send failed", rpcPushMsg.OperationID, "push data", rpcPushMsg.String(), "err", err.Error())
 | 
			
		||||
		pid, offset, err := producer.SendMessage(&mqPushMsg)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			log.ErrorByKv("kafka send failed", msg.OperationID, "send data", message.String(), "pid", pid, "offset", offset, "err", err.Error())
 | 
			
		||||
			log.ErrorByKv("kafka send failed", mqPushMsg.OperationID, "send data", mqPushMsg.String(), "pid", pid, "offset", offset, "err", err.Error())
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		log.InfoByKv("rpc send success", msg.OperationID, "push data", msg.String())
 | 
			
		||||
		log.InfoByKv("rpc send success", rpcPushMsg.OperationID, "push data", rpcPushMsg.String())
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -16,7 +16,6 @@ import (
 | 
			
		||||
	"Open_IM/pkg/utils"
 | 
			
		||||
	"github.com/Shopify/sarama"
 | 
			
		||||
	"github.com/golang/protobuf/proto"
 | 
			
		||||
	"strings"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type PersistentConsumerHandler struct {
 | 
			
		||||
@ -32,30 +31,29 @@ func (pc *PersistentConsumerHandler) Init() {
 | 
			
		||||
		config.Config.Kafka.Ws2mschat.Addr, config.Config.Kafka.ConsumerGroupID.MsgToMySql)
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (pc *PersistentConsumerHandler) handleChatWs2Mysql(msg []byte, msgKey string) {
 | 
			
		||||
	log.InfoByKv("chat come here mysql!!!", "", "chat", string(msg))
 | 
			
		||||
	pbData := pbMsg.WSToMsgSvrChatMsg{}
 | 
			
		||||
	err := proto.Unmarshal(msg, &pbData)
 | 
			
		||||
	log.NewInfo("msg come here mysql!!!", "", "msg", string(msg))
 | 
			
		||||
	msgFromMQ := pbMsg.MsgDataToMQ{}
 | 
			
		||||
	err := proto.Unmarshal(msg, &msgFromMQ)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.ErrorByKv("msg_transfer Unmarshal chat err", "", "chat", string(msg), "err", err.Error())
 | 
			
		||||
		log.ErrorByKv("msg_transfer Unmarshal msg err", "", "msg", string(msg), "err", err.Error())
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	Options := utils.JsonStringToMap(pbData.Options)
 | 
			
		||||
	//Control whether to store history messages (mysql)
 | 
			
		||||
	isPersist := utils.GetSwitchFromOptions(Options, "persistent")
 | 
			
		||||
	isPersist := utils.GetSwitchFromOptions(msgFromMQ.MsgData.Options, constant.IsPersistent)
 | 
			
		||||
	//Only process receiver data
 | 
			
		||||
	if isPersist {
 | 
			
		||||
		if msgKey == pbData.RecvID && pbData.SessionType == constant.SingleChatType {
 | 
			
		||||
			log.InfoByKv("msg_transfer chat persisting", pbData.OperationID)
 | 
			
		||||
			if err = im_mysql_msg_model.InsertMessageToChatLog(pbData); err != nil {
 | 
			
		||||
				log.ErrorByKv("Message insert failed", pbData.OperationID, "err", err.Error(), "chat", pbData.String())
 | 
			
		||||
		if msgKey == msgFromMQ.MsgData.RecvID && msgFromMQ.MsgData.SessionType == constant.SingleChatType {
 | 
			
		||||
			log.InfoByKv("msg_transfer msg persisting", msgFromMQ.OperationID)
 | 
			
		||||
			if err = im_mysql_msg_model.InsertMessageToChatLog(msgFromMQ); err != nil {
 | 
			
		||||
				log.ErrorByKv("Message insert failed", msgFromMQ.OperationID, "err", err.Error(), "msg", msgFromMQ.String())
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
		} else if pbData.SessionType == constant.GroupChatType && msgKey == "0" {
 | 
			
		||||
			pbData.RecvID = strings.Split(pbData.RecvID, " ")[1]
 | 
			
		||||
			log.InfoByKv("msg_transfer chat persisting", pbData.OperationID)
 | 
			
		||||
			if err = im_mysql_msg_model.InsertMessageToChatLog(pbData); err != nil {
 | 
			
		||||
				log.ErrorByKv("Message insert failed", pbData.OperationID, "err", err.Error(), "chat", pbData.String())
 | 
			
		||||
		} else if msgFromMQ.MsgData.SessionType == constant.GroupChatType && msgKey == msgFromMQ.MsgData.SendID {
 | 
			
		||||
			log.InfoByKv("msg_transfer msg persisting", msgFromMQ.OperationID)
 | 
			
		||||
			if err = im_mysql_msg_model.InsertMessageToChatLog(msgFromMQ); err != nil {
 | 
			
		||||
				log.ErrorByKv("Message insert failed", msgFromMQ.OperationID, "err", err.Error(), "msg", msgFromMQ.String())
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
@ -67,7 +65,7 @@ func (PersistentConsumerHandler) Cleanup(_ sarama.ConsumerGroupSession) error {
 | 
			
		||||
func (pc *PersistentConsumerHandler) ConsumeClaim(sess sarama.ConsumerGroupSession,
 | 
			
		||||
	claim sarama.ConsumerGroupClaim) error {
 | 
			
		||||
	for msg := range claim.Messages() {
 | 
			
		||||
		log.InfoByKv("kafka get info to mysql", "", "msgTopic", msg.Topic, "msgPartition", msg.Partition, "chat", string(msg.Value))
 | 
			
		||||
		log.InfoByKv("kafka get info to mysql", "", "msgTopic", msg.Topic, "msgPartition", msg.Partition, "msg", string(msg.Value))
 | 
			
		||||
		pc.msgHandle[msg.Topic](msg.Value, string(msg.Key))
 | 
			
		||||
		sess.MarkMessage(msg, "")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@ -13,21 +13,24 @@ import (
 | 
			
		||||
type JPushResp struct {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func JGAccountListPush(accounts []string, content, detailContent, platform string) ([]byte, error) {
 | 
			
		||||
func JGAccountListPush(accounts []string, alert, detailContent, platform string) ([]byte, error) {
 | 
			
		||||
 | 
			
		||||
	var pf requestBody.Platform
 | 
			
		||||
	_ = pf.SetPlatform(platform)
 | 
			
		||||
	var au requestBody.Audience
 | 
			
		||||
	au.SetAlias(accounts)
 | 
			
		||||
	var no requestBody.Notification
 | 
			
		||||
	no.SetAlert(content)
 | 
			
		||||
	no.SetAlert(alert, platform)
 | 
			
		||||
	var me requestBody.Message
 | 
			
		||||
	me.SetMsgContent(detailContent)
 | 
			
		||||
	var o requestBody.Options
 | 
			
		||||
	o.SetApnsProduction(false)
 | 
			
		||||
	var po requestBody.PushObj
 | 
			
		||||
	po.SetPlatform(&pf)
 | 
			
		||||
	po.SetAudience(&au)
 | 
			
		||||
	po.SetNotification(&no)
 | 
			
		||||
	po.SetMessage(&me)
 | 
			
		||||
	po.SetOptions(&o)
 | 
			
		||||
 | 
			
		||||
	con, err := json.Marshal(po)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
 | 
			
		||||
@ -1,17 +1,41 @@
 | 
			
		||||
package requestBody
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"Open_IM/pkg/common/config"
 | 
			
		||||
	"Open_IM/pkg/common/constant"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type Notification struct {
 | 
			
		||||
	Alert   string   `json:"alert,omitempty"`
 | 
			
		||||
	Android *Android `json:"android,omitempty"`
 | 
			
		||||
	IOS     *Ios     `json:"ios,omitempty"`
 | 
			
		||||
	Alert   string  `json:"alert,omitempty"`
 | 
			
		||||
	Android Android `json:"android,omitempty"`
 | 
			
		||||
	IOS     Ios     `json:"ios,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type Android struct {
 | 
			
		||||
	Alert  string `json:"alert,omitempty"`
 | 
			
		||||
	Intent struct {
 | 
			
		||||
		URL string `json:"url,omitempty"`
 | 
			
		||||
	} `json:"intent,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type Ios struct {
 | 
			
		||||
	Alert string `json:"alert,omitempty"`
 | 
			
		||||
	Sound string `json:"sound,omitempty"`
 | 
			
		||||
	Badge string `json:"badge,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (n *Notification) SetAlert(alert string) {
 | 
			
		||||
func (n *Notification) SetAlert(alert, platform string) {
 | 
			
		||||
	n.Alert = alert
 | 
			
		||||
	switch platform {
 | 
			
		||||
	case constant.AndroidPlatformStr:
 | 
			
		||||
		n.Android.Alert = alert
 | 
			
		||||
		n.SetAndroidIntent()
 | 
			
		||||
	case constant.IOSPlatformStr:
 | 
			
		||||
		n.IOS.Alert = alert
 | 
			
		||||
		n.IOS.Sound = "default"
 | 
			
		||||
		n.IOS.Badge = "+1"
 | 
			
		||||
	default:
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
func (n *Notification) SetAndroidIntent() {
 | 
			
		||||
	n.Android.Intent.URL = config.Config.Push.Jpns.PushIntent
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user