diff --git a/cmd/open_im_cms_api/Makefile b/cmd/open_im_cms_api/Makefile index e69de29bb..31304542d 100644 --- a/cmd/open_im_cms_api/Makefile +++ b/cmd/open_im_cms_api/Makefile @@ -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 + diff --git a/cmd/rpc/open_im_admin_cms/Makefile b/cmd/rpc/open_im_admin_cms/Makefile new file mode 100644 index 000000000..f6efc1c08 --- /dev/null +++ b/cmd/rpc/open_im_admin_cms/Makefile @@ -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 diff --git a/cmd/rpc/open_im_message_cms/Makefile b/cmd/rpc/open_im_message_cms/Makefile new file mode 100644 index 000000000..4ac4cba3a --- /dev/null +++ b/cmd/rpc/open_im_message_cms/Makefile @@ -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 diff --git a/cmd/rpc/open_im_msg/main.go b/cmd/rpc/open_im_msg/main.go index b79d53f1a..7344facf4 100644 --- a/cmd/rpc/open_im_msg/main.go +++ b/cmd/rpc/open_im_msg/main.go @@ -6,7 +6,7 @@ import ( ) func main() { - rpcPort := flag.Int("port", 10301, "rpc listening port") + rpcPort := flag.Int("port", 10300, "rpc listening port") flag.Parse() rpcServer := rpcChat.NewRpcChatServer(*rpcPort) rpcServer.Run() diff --git a/cmd/rpc/open_im_statistics/Makefile b/cmd/rpc/open_im_statistics/Makefile new file mode 100644 index 000000000..37dbb3efe --- /dev/null +++ b/cmd/rpc/open_im_statistics/Makefile @@ -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 diff --git a/cmd/rpc/open_im_user/main.go b/cmd/rpc/open_im_user/main.go index 4382dc9fe..91b6e55b5 100644 --- a/cmd/rpc/open_im_user/main.go +++ b/cmd/rpc/open_im_user/main.go @@ -6,7 +6,7 @@ import ( ) func main() { - rpcPort := flag.Int("port", 10101, "rpc listening port") + rpcPort := flag.Int("port", 10100, "rpc listening port") flag.Parse() rpcServer := user.NewUserServer(*rpcPort) rpcServer.Run() diff --git a/config/config.yaml b/config/config.yaml index eea6bcbb7..f40bfa62a 100644 --- a/config/config.yaml +++ b/config/config.yaml @@ -60,6 +60,7 @@ serverip: 0.0.0.0 # 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 @@ -67,11 +68,14 @@ endpoints: 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 api: openImApiPort: [ 10000 ] cmsapi: - openImCMSPort: [ 8000 ] + openImCmsApiPort: [ 8000 ] sdk: openImSdkWsPort: [ 30000 ] @@ -92,9 +96,9 @@ rpcport: openImGroupPort: [ 10500 ] openImAuthPort: [ 10600 ] openImPushPort: [ 10700 ] - openImOpenImStatisticPort: [ 10800 ] - OpenImMessageCMSPort: [ 10900 ] - openImAdminCMSPort: [11000] + openImStatisticsPort: [ 10800 ] + openImMessageCmsPort: [ 10900 ] + openImAdminCmsPort: [ 11000 ] c2c: callbackBeforeSendMsg: switch: false @@ -153,7 +157,7 @@ push: pushIntent: "intent:#Intent;component=io.openim.app.enterprisechat/io.openim.app.enterprisechat.MainActivity;end" manager: appManagerUid: [ "openIM123456","openIM654321", "openIM333", "openIMAdmin"] - secrets: [ "openIM1","openIM2", "openIM333" ] + secrets: [ "openIM1","openIM2", "openIM333", "openIMAdmin"] secret: tuoyun diff --git a/internal/rpc/group/group.go b/internal/rpc/group/group.go index 2a0f59f8d..4fc915971 100644 --- a/internal/rpc/group/group.go +++ b/internal/rpc/group/group.go @@ -696,7 +696,6 @@ func (s *groupServer) GetGroup(_ context.Context, req *pbGroup.GetGroupReq) (*pb groupMember, err := imdb.GetGroupMaster(v.GroupID) if err != nil { log.NewError(req.OperationID, utils.GetSelfFuncName(), "GetGroupMaster error", err.Error()) - continue } resp.CMSGroups = append(resp.CMSGroups, &pbGroup.CMSGroup{ GroupInfo: &open_im_sdk.GroupInfo{ @@ -738,7 +737,6 @@ func (s *groupServer) GetGroups(_ context.Context, req *pbGroup.GetGroupsReq) (* groupMember, err := imdb.GetGroupMaster(v.GroupID) if err != nil { log.NewError(req.OperationID, utils.GetSelfFuncName(), err.Error()) - continue } resp.CMSGroups = append(resp.CMSGroups, &pbGroup.CMSGroup{ GroupInfo: &open_im_sdk.GroupInfo{ diff --git a/pkg/common/db/mysql_model/im_mysql_model/group_model.go b/pkg/common/db/mysql_model/im_mysql_model/group_model.go index a1e8318fd..46ec80738 100644 --- a/pkg/common/db/mysql_model/im_mysql_model/group_model.go +++ b/pkg/common/db/mysql_model/im_mysql_model/group_model.go @@ -6,6 +6,7 @@ import ( "Open_IM/pkg/utils" "errors" "fmt" + "github.com/jinzhu/gorm" "time" ) @@ -124,17 +125,56 @@ func OperateGroupRole(userId, groupId string, roleLevel int32) error { groupMember := db.GroupMember{ UserID: userId, GroupID: groupId, - RoleLevel: roleLevel, } updateInfo := db.GroupMember{ RoleLevel: roleLevel, } - result := dbConn.Table("group_members").Find(&groupMember).Update(updateInfo) - if result.Error != nil { - return result.Error + groupMaster := db.GroupMember{ } - if result.RowsAffected == 0 { - return errors.New(fmt.Sprintf("user %s not exist in group %s or already operate", userId, groupId)) + switch roleLevel { + case constant.GroupOwner: + return dbConn.Transaction(func(tx *gorm.DB) error { + result := dbConn.Table("group_members").Where("group_id = ? and role_level = ?", groupId, constant.GroupOwner).First(&groupMaster).Update(&db.GroupMember{ + RoleLevel: constant.GroupOrdinaryUsers, + }) + if result.Error != nil { + return result.Error + } + if result.RowsAffected == 0 { + return errors.New(fmt.Sprintf("user %s not exist in group %s or already operate", userId, groupId)) + } + + result = dbConn.Table("group_members").First(&groupMember).Update(updateInfo) + if result.Error != nil { + return result.Error + } + if result.RowsAffected == 0 { + return errors.New(fmt.Sprintf("user %s not exist in group %s or already operate", userId, groupId)) + } + return nil + }) + case constant.GroupOrdinaryUsers: + return dbConn.Transaction(func(tx *gorm.DB) error { + result := dbConn.Table("group_members").Where("group_id = ? and role_level = ?", groupId, constant.GroupOwner).First(&groupMaster) + if result.Error != nil { + return result.Error + } + if result.RowsAffected == 0 { + return errors.New(fmt.Sprintf("user %s not exist in group %s or already operate", userId, groupId)) + } + if groupMaster.UserID == userId { + return errors.New(fmt.Sprintf("user %s is master of %s, cant set to ordinary user", userId, groupId)) + } else { + result = dbConn.Table("group_members").Find(&groupMember).Update(updateInfo) + if result.Error != nil { + return result.Error + } + if result.RowsAffected == 0 { + return errors.New(fmt.Sprintf("user %s not exist in group %s or already operate", userId, groupId)) + } + } + return nil + }) } return nil } diff --git a/script/check_all.sh b/script/check_all.sh index 0c7313743..b94aa893a 100644 --- a/script/check_all.sh +++ b/script/check_all.sh @@ -4,6 +4,7 @@ source ./style_info.cfg source ./path_info.cfg source ./function.sh service_port_name=( + openImCmsApiPort openImApiPort openImUserPort openImFriendPort @@ -15,6 +16,9 @@ service_port_name=( openImWsPort openImSdkWsPort openImDemoPort + openImAdminCmsPort + openImMessageCmsPort + openImStatisticsPort ) switch=$(cat $config_path | grep demoswitch |awk -F '[:]' '{print $NF}') for i in ${service_port_name[*]}; do diff --git a/script/path_info.cfg b/script/path_info.cfg index ea9fa76e9..7fe9622b6 100644 --- a/script/path_info.cfg +++ b/script/path_info.cfg @@ -39,11 +39,15 @@ config_path="../config/config.yaml" service_source_root=( #api service file ../cmd/open_im_api/ + ../cmd/open_im_cms_api/ #rpc service file ../cmd/rpc/open_im_user/ ../cmd/rpc/open_im_friend/ ../cmd/rpc/open_im_group/ ../cmd/rpc/open_im_auth/ + ../cmd/rpc/open_im_admin_cms/ + ../cmd/rpc/open_im_message_cms/ + ../cmd/rpc/open_im_statistics/ ${msg_gateway_source_root} ${msg_transfer_source_root} ${msg_source_root} @@ -56,11 +60,15 @@ service_source_root=( service_names=( #api service filename open_im_api + open_im_cms_api #rpc service filename open_im_user open_im_friend open_im_group open_im_auth + open_im_admin_cms + open_im_message_cms + open_im_statistics ${msg_gateway_name} ${msg_transfer_name} ${msg_name} diff --git a/script/start_rpc_service.sh b/script/start_rpc_service.sh index 9491a4fe8..bc5f41e3d 100644 --- a/script/start_rpc_service.sh +++ b/script/start_rpc_service.sh @@ -8,11 +8,15 @@ source ./function.sh service_filename=( #api open_im_api + open_im_cms_api #rpc open_im_user open_im_friend open_im_group open_im_auth + open_im_admin_cms + open_im_message_cms + open_im_statistics ${msg_name} ) @@ -20,11 +24,15 @@ service_filename=( service_port_name=( #api port name openImApiPort + openImCmsApiPort #rpc port name openImUserPort openImFriendPort openImGroupPort openImAuthPort + openImAdminCmsPort + openImMessageCmsPort + openImStatisticsPort openImOfflineMessagePort )