Files
open-im-server/internal/rpc/organization/organization.go
T

564 lines
26 KiB
Go
Raw Normal View History

2022-04-12 22:02:43 +08:00
package organization
import (
2022-04-19 16:40:57 +08:00
chat "Open_IM/internal/rpc/msg"
2022-04-12 22:02:43 +08:00
"Open_IM/pkg/common/config"
"Open_IM/pkg/common/constant"
2022-04-15 19:48:17 +08:00
"Open_IM/pkg/common/db"
imdb "Open_IM/pkg/common/db/mysql_model/im_mysql_model"
2022-07-20 19:09:20 +08:00
rocksCache "Open_IM/pkg/common/db/rocks_cache"
2022-04-12 22:02:43 +08:00
"Open_IM/pkg/common/log"
2022-04-15 19:48:17 +08:00
"Open_IM/pkg/common/token_verify"
2022-04-12 22:02:43 +08:00
"Open_IM/pkg/grpc-etcdv3/getcdv3"
2022-05-29 19:44:22 +08:00
pbAuth "Open_IM/pkg/proto/auth"
2022-05-12 19:00:48 +08:00
groupRpc "Open_IM/pkg/proto/group"
2022-04-12 22:02:43 +08:00
rpc "Open_IM/pkg/proto/organization"
2022-04-15 19:48:17 +08:00
open_im_sdk "Open_IM/pkg/proto/sdk_ws"
2022-04-12 22:02:43 +08:00
"Open_IM/pkg/utils"
"context"
"net"
"strconv"
"strings"
2022-04-19 21:27:06 +08:00
"time"
2022-05-29 19:44:22 +08:00
"google.golang.org/grpc"
2022-04-12 22:02:43 +08:00
)
type organizationServer struct {
rpcPort int
rpcRegisterName string
etcdSchema string
etcdAddr []string
}
2022-04-16 21:10:46 +08:00
func NewServer(port int) *organizationServer {
2022-04-12 22:02:43 +08:00
log.NewPrivateLog(constant.LogFileName)
return &organizationServer{
rpcPort: port,
2022-04-16 20:56:28 +08:00
rpcRegisterName: config.Config.RpcRegisterName.OpenImOrganizationName,
2022-04-12 22:02:43 +08:00
etcdSchema: config.Config.Etcd.EtcdSchema,
etcdAddr: config.Config.Etcd.EtcdAddr,
}
}
func (s *organizationServer) Run() {
log.NewInfo("", "organization rpc start ")
2022-05-07 17:05:05 +08:00
listenIP := ""
if config.Config.ListenIP == "" {
listenIP = "0.0.0.0"
} else {
listenIP = config.Config.ListenIP
}
address := listenIP + ":" + strconv.Itoa(s.rpcPort)
2022-04-12 22:02:43 +08:00
//listener network
2022-05-07 17:05:05 +08:00
listener, err := net.Listen("tcp", address)
2022-04-12 22:02:43 +08:00
if err != nil {
2022-05-10 09:09:37 +08:00
panic("listening err:" + err.Error() + s.rpcRegisterName)
2022-04-12 22:02:43 +08:00
}
2022-05-07 17:05:05 +08:00
log.NewInfo("", "listen network success, ", address, listener)
2022-04-12 22:02:43 +08:00
defer listener.Close()
//grpc server
srv := grpc.NewServer()
defer srv.GracefulStop()
//Service registers with etcd
rpc.RegisterOrganizationServer(srv, s)
2022-06-23 09:24:05 +08:00
rpcRegisterIP := config.Config.RpcRegisterIP
2022-05-07 17:05:05 +08:00
if config.Config.RpcRegisterIP == "" {
rpcRegisterIP, err = utils.GetLocalIP()
if err != nil {
log.Error("", "GetLocalIP failed ", err.Error())
}
}
2022-05-29 19:44:22 +08:00
log.NewInfo("", "rpcRegisterIP", rpcRegisterIP)
2022-05-07 17:05:05 +08:00
err = getcdv3.RegisterEtcd(s.etcdSchema, strings.Join(s.etcdAddr, ","), rpcRegisterIP, s.rpcPort, s.rpcRegisterName, 10)
2022-04-12 22:02:43 +08:00
if err != nil {
log.NewError("", "RegisterEtcd failed ", err.Error())
return
}
2022-05-07 17:05:05 +08:00
log.NewInfo("", "organization rpc RegisterEtcd success", rpcRegisterIP, s.rpcPort, s.rpcRegisterName, 10)
2022-04-12 22:02:43 +08:00
err = srv.Serve(listener)
if err != nil {
log.NewError("", "Serve failed ", err.Error())
return
}
log.NewInfo("", "organization rpc success")
}
func (s *organizationServer) CreateDepartment(ctx context.Context, req *rpc.CreateDepartmentReq) (*rpc.CreateDepartmentResp, error) {
2022-04-16 20:10:10 +08:00
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), " rpc args ", req.String())
if !token_verify.IsManagerUserID(req.OpUserID) {
2022-04-18 18:11:07 +08:00
errMsg := req.OperationID + " " + req.OpUserID + " is not app manager"
2022-04-15 19:48:17 +08:00
log.Error(req.OperationID, errMsg)
2022-04-18 18:11:07 +08:00
return &rpc.CreateDepartmentResp{ErrCode: constant.ErrAccess.ErrCode, ErrMsg: errMsg}, nil
2022-04-15 19:48:17 +08:00
}
department := db.Department{}
utils.CopyStructFields(&department, req.DepartmentInfo)
if department.DepartmentID == "" {
department.DepartmentID = utils.Md5(strconv.FormatInt(time.Now().UnixNano(), 10))
}
2022-04-16 20:10:10 +08:00
log.Debug(req.OperationID, "dst ", department, "src ", req.DepartmentInfo)
if err := imdb.CreateDepartment(&department); err != nil {
errMsg := req.OperationID + " " + "CreateDepartment failed " + err.Error()
log.Error(req.OperationID, errMsg)
return &rpc.CreateDepartmentResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: errMsg}, nil
2022-04-15 19:48:17 +08:00
}
2022-06-09 12:39:28 +08:00
createdDepartment, err := imdb.GetDepartment(department.DepartmentID)
2022-04-15 19:48:17 +08:00
if err != nil {
2022-04-16 20:10:10 +08:00
errMsg := req.OperationID + " " + "GetDepartment failed " + err.Error() + department.DepartmentID
log.Error(req.OperationID, errMsg)
return &rpc.CreateDepartmentResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: errMsg}, nil
2022-04-15 19:48:17 +08:00
}
2022-04-16 20:10:10 +08:00
log.Debug(req.OperationID, "GetDepartment ", department.DepartmentID, *createdDepartment)
2022-04-15 19:48:17 +08:00
resp := &rpc.CreateDepartmentResp{DepartmentInfo: &open_im_sdk.Department{}}
utils.CopyStructFields(resp.DepartmentInfo, createdDepartment)
2022-04-16 20:10:10 +08:00
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), " rpc return ", *resp)
2022-07-20 19:09:20 +08:00
if err := rocksCache.DelAllDepartmentsFromCache(); err != nil {
errMsg := req.OperationID + " " + "UpdateDepartment failed " + err.Error()
log.Error(req.OperationID, errMsg)
return &rpc.CreateDepartmentResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: errMsg}, nil
}
2022-04-19 16:40:57 +08:00
chat.OrganizationNotificationToAll(req.OpUserID, req.OperationID)
2022-06-16 15:19:39 +08:00
etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImGroupName, req.OperationID)
if etcdConn == nil {
errMsg := req.OperationID + "getcdv3.GetConn == nil"
log.NewError(req.OperationID, errMsg)
resp.ErrCode = constant.ErrInternal.ErrCode
resp.ErrMsg = errMsg
return resp, nil
}
2022-05-12 19:00:48 +08:00
client := groupRpc.NewGroupClient(etcdConn)
createGroupReq := &groupRpc.CreateGroupReq{
2022-06-15 13:39:49 +08:00
InitMemberList: []*groupRpc.GroupAddMemberInfo{},
2022-05-12 19:00:48 +08:00
GroupInfo: &open_im_sdk.GroupInfo{
2022-06-15 13:24:21 +08:00
Introduction: req.DepartmentInfo.Name,
2022-05-12 19:00:48 +08:00
GroupName: req.DepartmentInfo.Name,
FaceURL: req.DepartmentInfo.FaceURL,
CreateTime: uint32(time.Now().Unix()),
CreatorUserID: req.OpUserID,
2022-06-15 16:18:41 +08:00
GroupType: constant.NormalGroup,
2022-06-15 13:24:21 +08:00
OwnerUserID: req.OpUserID,
2022-05-12 19:00:48 +08:00
},
OperationID: req.OperationID,
OpUserID: req.OpUserID,
2022-06-15 13:44:45 +08:00
OwnerUserID: req.OpUserID,
2022-05-12 19:00:48 +08:00
}
createGroupResp, err := client.CreateGroup(context.Background(), createGroupReq)
if err != nil {
log.NewError(req.OperationID, utils.GetSelfFuncName(), "CreateGroup rpc failed", createGroupReq, err.Error())
resp.ErrCode = constant.ErrDB.ErrCode
resp.ErrMsg = constant.ErrDB.ErrMsg + " createGroup failed " + err.Error()
return resp, nil
}
if createGroupResp.ErrCode != 0 {
log.NewError(req.OperationID, utils.GetSelfFuncName(), resp)
resp.ErrCode = constant.ErrDB.ErrCode
resp.ErrMsg = constant.ErrDB.ErrMsg + " createGroup failed " + createGroupResp.ErrMsg
return resp, nil
}
2022-06-09 12:39:28 +08:00
if err := imdb.SetDepartmentRelatedGroupID(createGroupResp.GroupInfo.GroupID, department.DepartmentID); err != nil {
log.NewError(req.OperationID, utils.GetSelfFuncName(), "SetDepartmentRelatedGroupID failed", err.Error())
}
2022-04-15 19:48:17 +08:00
return resp, nil
}
func (s *organizationServer) UpdateDepartment(ctx context.Context, req *rpc.UpdateDepartmentReq) (*rpc.UpdateDepartmentResp, error) {
2022-04-16 20:10:10 +08:00
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), " rpc args ", req.String())
if !token_verify.IsManagerUserID(req.OpUserID) {
2022-04-18 18:11:07 +08:00
errMsg := req.OperationID + " " + req.OpUserID + " is not app manager"
2022-04-16 20:10:10 +08:00
log.Error(req.OperationID, errMsg)
2022-04-18 18:11:07 +08:00
return &rpc.UpdateDepartmentResp{ErrCode: constant.ErrAccess.ErrCode, ErrMsg: errMsg}, nil
2022-04-16 20:10:10 +08:00
}
department := db.Department{}
utils.CopyStructFields(&department, req.DepartmentInfo)
log.Debug(req.OperationID, "dst ", department, "src ", req.DepartmentInfo)
if err := imdb.UpdateDepartment(&department, nil); err != nil {
2022-07-20 19:09:20 +08:00
errMsg := req.OperationID + " " + "UpdateDepartment failed " + err.Error()
log.Error(req.OperationID, errMsg, department)
return &rpc.UpdateDepartmentResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: errMsg}, nil
}
if err := rocksCache.DelAllDepartmentsFromCache(); err != nil {
2022-04-16 20:10:10 +08:00
errMsg := req.OperationID + " " + "UpdateDepartment failed " + err.Error()
log.Error(req.OperationID, errMsg)
return &rpc.UpdateDepartmentResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: errMsg}, nil
}
resp := &rpc.UpdateDepartmentResp{}
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), " rpc return ", *resp)
2022-04-19 16:40:57 +08:00
chat.OrganizationNotificationToAll(req.OpUserID, req.OperationID)
2022-04-16 20:10:10 +08:00
return resp, nil
2022-04-15 19:48:17 +08:00
}
2022-04-16 20:10:10 +08:00
func (s *organizationServer) GetSubDepartment(ctx context.Context, req *rpc.GetSubDepartmentReq) (*rpc.GetSubDepartmentResp, error) {
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), " rpc args ", req.String())
2022-07-20 19:09:20 +08:00
var departmentList []db.Department
var err error
if req.DepartmentID == "-1" {
departmentList, err = rocksCache.GetAllDepartmentsFromCache()
if err != nil {
errMsg := req.OperationID + " " + "GetDepartment failed " + err.Error()
log.Error(req.OperationID, errMsg)
return &rpc.GetSubDepartmentResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: errMsg}, nil
}
} else {
departmentList, err = imdb.GetSubDepartmentList(req.DepartmentID)
if err != nil {
errMsg := req.OperationID + " " + "GetDepartment failed " + err.Error()
log.Error(req.OperationID, errMsg)
return &rpc.GetSubDepartmentResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: errMsg}, nil
}
2022-04-16 20:10:10 +08:00
}
2022-07-20 19:09:20 +08:00
2022-04-16 20:10:10 +08:00
log.Debug(req.OperationID, "GetSubDepartmentList ", req.DepartmentID, departmentList)
resp := &rpc.GetSubDepartmentResp{}
for _, v := range departmentList {
v1 := open_im_sdk.Department{}
utils.CopyStructFields(&v1, v)
log.Debug(req.OperationID, "src ", v, "dst ", v1)
2022-04-20 11:53:32 +08:00
err, v1.MemberNum = imdb.GetDepartmentMemberNum(v1.DepartmentID)
if err != nil {
log.Error(req.OperationID, "GetDepartmentMemberNum failed ", err.Error(), v1.DepartmentID)
continue
}
err, v1.SubDepartmentNum = imdb.GetSubDepartmentNum(v1.DepartmentID)
if err != nil {
log.Error(req.OperationID, "GetSubDepartmentNum failed ", err.Error(), v1.DepartmentID)
continue
}
2022-04-16 20:10:10 +08:00
resp.DepartmentList = append(resp.DepartmentList, &v1)
}
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), " rpc return ", *resp)
return resp, nil
2022-04-15 19:48:17 +08:00
}
func (s *organizationServer) DeleteDepartment(ctx context.Context, req *rpc.DeleteDepartmentReq) (*rpc.DeleteDepartmentResp, error) {
2022-04-16 20:10:10 +08:00
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), " rpc args ", req.String())
if !token_verify.IsManagerUserID(req.OpUserID) {
2022-04-18 18:11:07 +08:00
errMsg := req.OperationID + " " + req.OpUserID + " is not app manager"
2022-04-16 20:10:10 +08:00
log.Error(req.OperationID, errMsg)
2022-04-18 18:11:07 +08:00
return &rpc.DeleteDepartmentResp{ErrCode: constant.ErrAccess.ErrCode, ErrMsg: errMsg}, nil
2022-04-16 20:10:10 +08:00
}
err := imdb.DeleteDepartment(req.DepartmentID)
if err != nil {
errMsg := req.OperationID + " " + "DeleteDepartment failed " + err.Error()
log.Error(req.OperationID, errMsg, req.DepartmentID)
return &rpc.DeleteDepartmentResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: errMsg}, nil
}
log.Debug(req.OperationID, "DeleteDepartment ", req.DepartmentID)
2022-07-20 19:09:20 +08:00
if err := rocksCache.DelAllDepartmentsFromCache(); err != nil {
errMsg := req.OperationID + " " + "UpdateDepartment failed " + err.Error()
log.Error(req.OperationID, errMsg)
return &rpc.DeleteDepartmentResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: errMsg}, nil
}
2022-04-16 20:10:10 +08:00
resp := &rpc.DeleteDepartmentResp{}
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), " rpc return ", resp)
2022-04-19 16:40:57 +08:00
chat.OrganizationNotificationToAll(req.OpUserID, req.OperationID)
2022-04-16 20:10:10 +08:00
return resp, nil
2022-04-15 19:48:17 +08:00
}
func (s *organizationServer) CreateOrganizationUser(ctx context.Context, req *rpc.CreateOrganizationUserReq) (*rpc.CreateOrganizationUserResp, error) {
2022-04-19 21:27:06 +08:00
authReq := &pbAuth.UserRegisterReq{UserInfo: &open_im_sdk.UserInfo{}}
utils.CopyStructFields(authReq.UserInfo, req.OrganizationUser)
authReq.OperationID = req.OperationID
2022-06-08 17:07:16 +08:00
if req.IsRegister {
2022-06-16 15:19:39 +08:00
etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImAuthName, req.OperationID)
if etcdConn == nil {
errMsg := req.OperationID + "getcdv3.GetConn == nil"
log.NewError(req.OperationID, errMsg)
return &rpc.CreateOrganizationUserResp{ErrCode: constant.ErrInternal.ErrCode, ErrMsg: errMsg}, nil
}
2022-06-08 17:07:16 +08:00
client := pbAuth.NewAuthClient(etcdConn)
reply, err := client.UserRegister(context.Background(), authReq)
if err != nil {
errMsg := "UserRegister failed " + err.Error()
log.NewError(req.OperationID, errMsg)
return &rpc.CreateOrganizationUserResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: errMsg}, nil
}
if reply.CommonResp.ErrCode != 0 {
errMsg := "UserRegister failed " + reply.CommonResp.ErrMsg
log.NewError(req.OperationID, errMsg)
return &rpc.CreateOrganizationUserResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: errMsg}, nil
}
2022-04-19 21:27:06 +08:00
}
2022-04-16 20:10:10 +08:00
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), " rpc args ", req.String())
if !token_verify.IsManagerUserID(req.OpUserID) {
2022-04-18 18:11:07 +08:00
errMsg := req.OperationID + " " + req.OpUserID + " is not app manager"
2022-04-16 20:10:10 +08:00
log.Error(req.OperationID, errMsg)
2022-04-18 18:11:07 +08:00
return &rpc.CreateOrganizationUserResp{ErrCode: constant.ErrAccess.ErrCode, ErrMsg: errMsg}, nil
2022-04-16 20:10:10 +08:00
}
organizationUser := db.OrganizationUser{}
utils.CopyStructFields(&organizationUser, req.OrganizationUser)
2022-04-17 14:54:51 +08:00
organizationUser.Birth = utils.UnixSecondToTime(int64(req.OrganizationUser.Birth))
2022-04-16 20:10:10 +08:00
log.Debug(req.OperationID, "src ", *req.OrganizationUser, "dst ", organizationUser)
2022-06-08 17:08:47 +08:00
err := imdb.CreateOrganizationUser(&organizationUser)
2022-04-16 20:10:10 +08:00
if err != nil {
errMsg := req.OperationID + " " + "CreateOrganizationUser failed " + err.Error()
log.Error(req.OperationID, errMsg, organizationUser)
return &rpc.CreateOrganizationUserResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: errMsg}, nil
}
log.Debug(req.OperationID, "CreateOrganizationUser ", organizationUser)
resp := &rpc.CreateOrganizationUserResp{}
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), " rpc return ", *resp)
2022-07-22 10:44:49 +08:00
//chat.OrganizationNotificationToAll(req.OpUserID, req.OperationID)
2022-04-16 20:10:10 +08:00
return resp, nil
2022-04-15 19:48:17 +08:00
}
func (s *organizationServer) UpdateOrganizationUser(ctx context.Context, req *rpc.UpdateOrganizationUserReq) (*rpc.UpdateOrganizationUserResp, error) {
2022-04-19 21:27:06 +08:00
authReq := &pbAuth.UserRegisterReq{UserInfo: &open_im_sdk.UserInfo{}}
utils.CopyStructFields(authReq.UserInfo, req.OrganizationUser)
authReq.OperationID = req.OperationID
2022-06-16 15:19:39 +08:00
etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImAuthName, req.OperationID)
if etcdConn == nil {
errMsg := req.OperationID + "getcdv3.GetConn == nil"
log.NewError(req.OperationID, errMsg)
return &rpc.UpdateOrganizationUserResp{ErrCode: constant.ErrInternal.ErrCode, ErrMsg: errMsg}, nil
}
2022-04-19 21:27:06 +08:00
client := pbAuth.NewAuthClient(etcdConn)
reply, err := client.UserRegister(context.Background(), authReq)
if err != nil {
errMsg := "UserRegister failed " + err.Error()
log.NewError(req.OperationID, errMsg)
return &rpc.UpdateOrganizationUserResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: errMsg}, nil
}
if reply.CommonResp.ErrCode != 0 {
errMsg := "UserRegister failed " + reply.CommonResp.ErrMsg
log.NewError(req.OperationID, errMsg)
return &rpc.UpdateOrganizationUserResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: errMsg}, nil
}
2022-04-16 20:10:10 +08:00
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), " rpc args ", req.String())
if !token_verify.IsManagerUserID(req.OpUserID) {
2022-04-18 18:11:07 +08:00
errMsg := req.OperationID + " " + req.OpUserID + " is not app manager"
2022-04-16 20:10:10 +08:00
log.Error(req.OperationID, errMsg)
2022-04-18 18:06:47 +08:00
return &rpc.UpdateOrganizationUserResp{ErrCode: constant.ErrAccess.ErrCode, ErrMsg: errMsg}, nil
2022-04-16 20:10:10 +08:00
}
organizationUser := db.OrganizationUser{}
utils.CopyStructFields(&organizationUser, req.OrganizationUser)
2022-04-17 15:11:27 +08:00
if req.OrganizationUser.Birth != 0 {
organizationUser.Birth = utils.UnixSecondToTime(int64(req.OrganizationUser.Birth))
2022-04-17 15:18:21 +08:00
log.Debug(req.OperationID, "time: ", organizationUser.Birth, req.OrganizationUser.Birth)
2022-04-17 15:11:27 +08:00
}
2022-04-16 20:10:10 +08:00
log.Debug(req.OperationID, "src ", *req.OrganizationUser, "dst ", organizationUser)
2022-04-19 21:28:12 +08:00
err = imdb.UpdateOrganizationUser(&organizationUser, nil)
2022-04-16 20:10:10 +08:00
if err != nil {
errMsg := req.OperationID + " " + "CreateOrganizationUser failed " + err.Error()
log.Error(req.OperationID, errMsg, organizationUser)
return &rpc.UpdateOrganizationUserResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: errMsg}, nil
}
log.Debug(req.OperationID, "UpdateOrganizationUser ", organizationUser)
resp := &rpc.UpdateOrganizationUserResp{}
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), " rpc return ", resp)
2022-04-19 16:40:57 +08:00
chat.OrganizationNotificationToAll(req.OpUserID, req.OperationID)
2022-04-16 20:10:10 +08:00
return resp, nil
2022-04-15 19:48:17 +08:00
}
func (s *organizationServer) CreateDepartmentMember(ctx context.Context, req *rpc.CreateDepartmentMemberReq) (*rpc.CreateDepartmentMemberResp, error) {
2022-04-16 20:10:10 +08:00
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), " rpc args ", req.String())
if !token_verify.IsManagerUserID(req.OpUserID) {
2022-04-18 18:11:07 +08:00
errMsg := req.OperationID + " " + req.OpUserID + " is not app manager"
2022-04-16 20:10:10 +08:00
log.Error(req.OperationID, errMsg)
2022-04-18 18:06:47 +08:00
return &rpc.CreateDepartmentMemberResp{ErrCode: constant.ErrAccess.ErrCode, ErrMsg: errMsg}, nil
2022-04-16 20:10:10 +08:00
}
2022-04-18 15:45:44 +08:00
2022-04-18 18:02:11 +08:00
err, _ := imdb.GetOrganizationUser(req.DepartmentMember.UserID)
if err != nil {
2022-04-18 18:11:07 +08:00
errMsg := req.OperationID + " " + req.DepartmentMember.UserID + " is not exist"
2022-04-18 18:02:11 +08:00
log.Error(req.OperationID, errMsg)
2022-04-18 18:06:47 +08:00
return &rpc.CreateDepartmentMemberResp{ErrCode: constant.ErrAccess.ErrCode, ErrMsg: errMsg}, nil
2022-04-18 18:02:11 +08:00
}
2022-04-16 20:10:10 +08:00
departmentMember := db.DepartmentMember{}
2022-04-18 15:45:44 +08:00
utils.CopyStructFields(&departmentMember, req.DepartmentMember)
log.Debug(req.OperationID, "src ", *req.DepartmentMember, "dst ", departmentMember)
2022-04-18 18:02:11 +08:00
err = imdb.CreateDepartmentMember(&departmentMember)
2022-04-16 20:10:10 +08:00
if err != nil {
errMsg := req.OperationID + " " + "CreateDepartmentMember failed " + err.Error()
log.Error(req.OperationID, errMsg, departmentMember)
return &rpc.CreateDepartmentMemberResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: errMsg}, nil
}
log.Debug(req.OperationID, "UpdateOrganizationUser ", departmentMember)
2022-07-20 19:09:20 +08:00
if err := rocksCache.DelAllDepartmentMembersFromCache(); err != nil {
log.NewError(req.OperationID, utils.GetSelfFuncName(), err.Error())
}
2022-04-16 20:10:10 +08:00
resp := &rpc.CreateDepartmentMemberResp{}
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), " rpc return ", *resp)
2022-04-19 16:40:57 +08:00
chat.OrganizationNotificationToAll(req.OpUserID, req.OperationID)
2022-04-16 20:10:10 +08:00
return resp, nil
}
2022-05-12 19:09:25 +08:00
func (s *organizationServer) GetDepartmentParentIDList(_ context.Context, req *rpc.GetDepartmentParentIDListReq) (resp *rpc.GetDepartmentParentIDListResp, err error) {
2022-05-12 19:00:48 +08:00
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "req:", req.String())
resp = &rpc.GetDepartmentParentIDListResp{}
2022-06-08 18:40:07 +08:00
parentIDList, err := imdb.GetDepartmentParentIDList(req.DepartmentID)
2022-05-12 19:00:48 +08:00
if err != nil {
2022-05-31 19:14:00 +08:00
log.NewError(req.OperationID, utils.GetSelfFuncName(), "GetDepartmentParentIDList failed", err.Error())
2022-05-12 19:00:48 +08:00
resp.ErrMsg = constant.ErrDB.ErrMsg + ": " + err.Error()
resp.ErrCode = constant.ErrDB.ErrCode
return resp, nil
}
2022-06-08 18:40:07 +08:00
resp.ParentIDList = parentIDList
2022-05-12 19:00:48 +08:00
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "resp:", resp.String())
return resp, nil
}
2022-04-18 16:42:50 +08:00
func (s *organizationServer) GetUserInDepartmentByUserID(userID string, operationID string) (*open_im_sdk.UserInDepartment, error) {
2022-04-16 20:10:10 +08:00
err, organizationUser := imdb.GetOrganizationUser(userID)
if err != nil {
return nil, utils.Wrap(err, "GetOrganizationUser failed")
}
err, departmentMemberList := imdb.GetUserInDepartment(userID)
if err != nil {
return nil, utils.Wrap(err, "GetUserInDepartment failed")
}
2022-04-18 16:42:50 +08:00
log.Debug(operationID, "GetUserInDepartment ", departmentMemberList)
2022-04-16 20:10:10 +08:00
resp := &open_im_sdk.UserInDepartment{OrganizationUser: &open_im_sdk.OrganizationUser{}}
utils.CopyStructFields(resp.OrganizationUser, organizationUser)
for _, v := range departmentMemberList {
v1 := open_im_sdk.DepartmentMember{}
utils.CopyStructFields(&v1, v)
2022-04-18 16:42:50 +08:00
log.Debug(operationID, "DepartmentMember src ", v, "dst ", v1)
2022-04-16 20:10:10 +08:00
resp.DepartmentMemberList = append(resp.DepartmentMemberList, &v1)
}
return resp, nil
2022-04-15 19:48:17 +08:00
}
func (s *organizationServer) GetUserInDepartment(ctx context.Context, req *rpc.GetUserInDepartmentReq) (*rpc.GetUserInDepartmentResp, error) {
2022-04-16 20:10:10 +08:00
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), " rpc args ", req.String())
2022-04-18 16:42:50 +08:00
r, err := s.GetUserInDepartmentByUserID(req.UserID, req.OperationID)
2022-04-16 20:10:10 +08:00
if err != nil {
errMsg := req.OperationID + " " + "GetUserInDepartmentByUserID failed " + err.Error()
log.Error(req.OperationID, errMsg, req.UserID)
return &rpc.GetUserInDepartmentResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: errMsg}, nil
}
log.Debug(req.OperationID, "GetUserInDepartmentByUserID success ", req.UserID, r)
resp := rpc.GetUserInDepartmentResp{UserInDepartment: &open_im_sdk.UserInDepartment{OrganizationUser: &open_im_sdk.OrganizationUser{}}}
resp.UserInDepartment.DepartmentMemberList = r.DepartmentMemberList
resp.UserInDepartment.OrganizationUser = r.OrganizationUser
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), " rpc return ", resp)
return &resp, nil
2022-04-15 19:48:17 +08:00
}
func (s *organizationServer) UpdateUserInDepartment(ctx context.Context, req *rpc.UpdateUserInDepartmentReq) (*rpc.UpdateUserInDepartmentResp, error) {
2022-04-16 20:10:10 +08:00
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), " rpc args ", req.String())
if !token_verify.IsManagerUserID(req.OpUserID) {
2022-04-18 18:11:07 +08:00
errMsg := req.OperationID + " " + req.OpUserID + " is not app manager"
2022-04-16 20:10:10 +08:00
log.Error(req.OperationID, errMsg)
2022-04-18 18:11:07 +08:00
return &rpc.UpdateUserInDepartmentResp{ErrCode: constant.ErrAccess.ErrCode, ErrMsg: errMsg}, nil
2022-04-16 20:10:10 +08:00
}
departmentMember := &db.DepartmentMember{}
utils.CopyStructFields(departmentMember, req.DepartmentMember)
log.Debug(req.OperationID, "dst ", departmentMember, "src ", req.DepartmentMember)
err := imdb.UpdateUserInDepartment(departmentMember, nil)
if err != nil {
errMsg := req.OperationID + " " + "UpdateUserInDepartment failed " + err.Error()
log.Error(req.OperationID, errMsg, *departmentMember)
return &rpc.UpdateUserInDepartmentResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: errMsg}, nil
}
resp := &rpc.UpdateUserInDepartmentResp{}
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), " rpc return ", *resp)
2022-04-19 16:40:57 +08:00
chat.OrganizationNotificationToAll(req.OpUserID, req.OperationID)
2022-04-16 20:10:10 +08:00
return resp, nil
}
func (s *organizationServer) DeleteUserInDepartment(ctx context.Context, req *rpc.DeleteUserInDepartmentReq) (*rpc.DeleteUserInDepartmentResp, error) {
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), " rpc args ", req.String())
if !token_verify.IsManagerUserID(req.OpUserID) {
2022-04-18 18:11:07 +08:00
errMsg := req.OperationID + " " + req.OpUserID + " is not app manager"
2022-04-16 20:10:10 +08:00
log.Error(req.OperationID, errMsg)
2022-04-18 18:11:07 +08:00
return &rpc.DeleteUserInDepartmentResp{ErrCode: constant.ErrAccess.ErrCode, ErrMsg: errMsg}, nil
2022-04-16 20:10:10 +08:00
}
err := imdb.DeleteUserInDepartment(req.DepartmentID, req.UserID)
if err != nil {
errMsg := req.OperationID + " " + "DeleteUserInDepartment failed " + err.Error()
log.Error(req.OperationID, errMsg, req.DepartmentID, req.UserID)
return &rpc.DeleteUserInDepartmentResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: errMsg}, nil
}
log.Debug(req.OperationID, "DeleteUserInDepartment success ", req.DepartmentID, req.UserID)
resp := &rpc.DeleteUserInDepartmentResp{}
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), " rpc return ", *resp)
2022-04-19 16:40:57 +08:00
chat.OrganizationNotificationToAll(req.OpUserID, req.OperationID)
2022-04-16 20:10:10 +08:00
return resp, nil
2022-04-15 19:48:17 +08:00
}
func (s *organizationServer) DeleteOrganizationUser(ctx context.Context, req *rpc.DeleteOrganizationUserReq) (*rpc.DeleteOrganizationUserResp, error) {
2022-04-16 20:10:10 +08:00
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), " rpc args ", req.String())
if !token_verify.IsManagerUserID(req.OpUserID) {
2022-04-18 18:11:07 +08:00
errMsg := req.OperationID + " " + req.OpUserID + " is not app manager"
2022-04-16 20:10:10 +08:00
log.Error(req.OperationID, errMsg)
2022-04-18 18:11:07 +08:00
return &rpc.DeleteOrganizationUserResp{ErrCode: constant.ErrAccess.ErrCode, ErrMsg: errMsg}, nil
2022-04-16 20:10:10 +08:00
}
err := imdb.DeleteOrganizationUser(req.UserID)
if err != nil {
errMsg := req.OperationID + " " + "DeleteOrganizationUser failed " + err.Error()
log.Error(req.OperationID, errMsg, req.UserID)
return &rpc.DeleteOrganizationUserResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: errMsg}, nil
}
log.Debug(req.OperationID, "DeleteOrganizationUser success ", req.UserID)
resp := &rpc.DeleteOrganizationUserResp{}
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), " rpc return ", *resp)
2022-04-19 16:40:57 +08:00
chat.OrganizationNotificationToAll(req.OpUserID, req.OperationID)
2022-04-16 20:10:10 +08:00
return resp, nil
2022-04-15 19:48:17 +08:00
}
func (s *organizationServer) GetDepartmentMember(ctx context.Context, req *rpc.GetDepartmentMemberReq) (*rpc.GetDepartmentMemberResp, error) {
2022-04-16 20:10:10 +08:00
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), " rpc args ", req.String())
2022-07-20 19:09:20 +08:00
var departmentMemberList []db.DepartmentMember
var err error
if req.DepartmentID == "-1" {
departmentMemberList, err = rocksCache.GetAllDepartmentMembersFromCache()
if err != nil {
errMsg := req.OperationID + " " + req.OpUserID + " is not app manager"
log.Error(req.OperationID, errMsg)
return &rpc.GetDepartmentMemberResp{ErrCode: constant.ErrAccess.ErrCode, ErrMsg: errMsg}, nil
}
} else {
departmentMemberList, err = imdb.GetDepartmentMemberList(req.DepartmentID)
if err != nil {
errMsg := req.OperationID + " " + req.OpUserID + " is not app manager"
log.Error(req.OperationID, errMsg)
return &rpc.GetDepartmentMemberResp{ErrCode: constant.ErrAccess.ErrCode, ErrMsg: errMsg}, nil
}
2022-04-16 20:10:10 +08:00
}
2022-04-18 17:25:54 +08:00
log.Debug(req.OperationID, "GetDepartmentMemberList ", departmentMemberList)
2022-04-16 20:10:10 +08:00
resp := rpc.GetDepartmentMemberResp{}
2022-04-18 17:25:54 +08:00
for _, v := range departmentMemberList {
err, organizationUser := imdb.GetOrganizationUser(v.UserID)
2022-04-16 20:10:10 +08:00
if err != nil {
2022-04-18 17:25:54 +08:00
log.Error(req.OperationID, "GetOrganizationUser failed ", err.Error())
2022-04-16 20:10:10 +08:00
continue
}
2022-04-18 17:25:54 +08:00
respOrganizationUser := &open_im_sdk.OrganizationUser{}
respDepartmentMember := &open_im_sdk.DepartmentMember{}
utils.CopyStructFields(respOrganizationUser, organizationUser)
utils.CopyStructFields(respDepartmentMember, &v)
userDepartmentMember := open_im_sdk.UserDepartmentMember{OrganizationUser: respOrganizationUser, DepartmentMember: respDepartmentMember}
log.Debug(req.OperationID, "GetUserInDepartmentByUserID success ", userDepartmentMember)
resp.UserDepartmentMemberList = append(resp.UserDepartmentMemberList, &userDepartmentMember)
2022-04-16 20:10:10 +08:00
}
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), " rpc return ", resp)
return &resp, nil
2022-04-12 22:02:43 +08:00
}
2022-05-12 19:00:48 +08:00
2022-05-12 19:11:55 +08:00
func (s *organizationServer) GetDepartmentRelatedGroupIDList(ctx context.Context, req *rpc.GetDepartmentRelatedGroupIDListReq) (resp *rpc.GetDepartmentRelatedGroupIDListResp, err error) {
2022-05-12 19:00:48 +08:00
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "req: ", req.String())
resp = &rpc.GetDepartmentRelatedGroupIDListResp{}
groupIDList, err := imdb.GetDepartmentRelatedGroupIDList(req.DepartmentIDList)
if err != nil {
log.NewError(req.OperationID, utils.GetSelfFuncName(), err.Error())
resp.ErrMsg = constant.ErrDB.ErrMsg + " GetDepartMentRelatedGroupIDList failed " + err.Error()
resp.ErrCode = constant.ErrDB.ErrCode
return resp, nil
}
resp.GroupIDList = groupIDList
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "resp: ", resp.String())
return resp, nil
}