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

325 lines
9.5 KiB
Go
Raw Normal View History

2021-12-27 16:48:05 +08:00
package user
import (
2023-02-14 11:33:10 +08:00
"Open_IM/internal/common/check"
2023-01-31 15:45:24 +08:00
"Open_IM/internal/common/convert"
2023-02-14 11:33:10 +08:00
"Open_IM/internal/common/notification"
2023-02-10 21:04:22 +08:00
"Open_IM/internal/common/rpcserver"
2021-12-27 16:48:05 +08:00
"Open_IM/pkg/common/config"
"Open_IM/pkg/common/constant"
2023-01-29 14:47:21 +08:00
"Open_IM/pkg/common/db/controller"
"Open_IM/pkg/common/db/relation"
2023-02-10 12:53:46 +08:00
tablerelation "Open_IM/pkg/common/db/table/relation"
2021-12-27 16:48:05 +08:00
"Open_IM/pkg/common/log"
2023-02-10 12:53:46 +08:00
prome "Open_IM/pkg/common/prometheus"
2023-02-09 14:40:49 +08:00
"Open_IM/pkg/common/tokenverify"
2023-01-31 15:45:24 +08:00
"Open_IM/pkg/common/tracelog"
2023-02-10 12:53:46 +08:00
"Open_IM/pkg/proto/sdkws"
pbuser "Open_IM/pkg/proto/user"
2021-12-27 16:48:05 +08:00
"Open_IM/pkg/utils"
"context"
2022-09-15 16:27:36 +08:00
grpcPrometheus "github.com/grpc-ecosystem/go-grpc-prometheus"
2022-01-27 01:08:02 +08:00
"google.golang.org/grpc"
2021-12-27 16:48:05 +08:00
)
type userServer struct {
2023-02-10 11:03:03 +08:00
*rpcserver.RpcServer
2023-01-29 14:47:21 +08:00
controller.UserInterface
2023-02-14 11:33:10 +08:00
notification *notification.Check
userCheck *check.UserCheck
2021-12-27 16:48:05 +08:00
}
2021-12-28 15:33:47 +08:00
func NewUserServer(port int) *userServer {
2023-02-10 11:03:03 +08:00
r, err := rpcserver.NewRpcServer(config.Config.RpcRegisterIP, port, config.Config.RpcRegisterName.OpenImUserName, config.Config.Zookeeper.ZkAddr, config.Config.Zookeeper.Schema)
2023-02-09 12:21:58 +08:00
if err != nil {
2023-02-09 13:43:50 +08:00
panic(err)
2021-12-28 15:33:47 +08:00
}
2023-01-29 14:47:21 +08:00
//mysql init
var mysql relation.Mysql
2023-02-01 17:20:55 +08:00
var model relation.UserGorm
2023-02-09 13:36:37 +08:00
err = mysql.InitConn().AutoMigrateModel(&model)
2023-01-29 14:47:21 +08:00
if err != nil {
panic("db init err:" + err.Error())
}
if mysql.GormConn() != nil {
model.DB = mysql.GormConn()
} else {
panic("db init err:" + "conn is nil")
}
2023-02-09 13:43:50 +08:00
return &userServer{RpcServer: r, UserInterface: controller.NewUserController(model.DB)}
2021-12-28 15:33:47 +08:00
}
2021-12-27 16:48:05 +08:00
func (s *userServer) Run() {
2023-02-09 13:43:50 +08:00
operationID := utils.OperationIDGenerator()
log.NewInfo(operationID, "rpc user start...")
2023-02-10 11:03:03 +08:00
listener, address, err := rpcserver.GetTcpListen(config.Config.ListenIP, s.Port)
2021-12-27 16:48:05 +08:00
if err != nil {
2023-02-09 13:43:50 +08:00
panic(err)
2021-12-27 16:48:05 +08:00
}
2023-02-09 13:43:50 +08:00
log.NewInfo(operationID, "listen ok ", address)
2021-12-27 16:48:05 +08:00
defer listener.Close()
//grpc server
2022-09-15 01:22:20 +08:00
var grpcOpts []grpc.ServerOption
if config.Config.Prometheus.Enable {
2023-02-10 12:53:46 +08:00
prome.NewGrpcRequestCounter()
prome.NewGrpcRequestFailedCounter()
prome.NewGrpcRequestSuccessCounter()
2022-09-15 16:27:36 +08:00
grpcOpts = append(grpcOpts, []grpc.ServerOption{
2022-09-15 16:39:49 +08:00
// grpc.UnaryInterceptor(promePkg.UnaryServerInterceptorProme),
2022-09-15 16:27:36 +08:00
grpc.StreamInterceptor(grpcPrometheus.StreamServerInterceptor),
grpc.UnaryInterceptor(grpcPrometheus.UnaryServerInterceptor),
}...)
2022-09-15 01:22:20 +08:00
}
srv := grpc.NewServer(grpcOpts...)
2021-12-27 16:48:05 +08:00
defer srv.GracefulStop()
//Service registers with etcd
2023-02-10 12:53:46 +08:00
pbuser.RegisterUserServer(srv, s)
2023-02-09 13:43:50 +08:00
2021-12-27 16:48:05 +08:00
err = srv.Serve(listener)
if err != nil {
2023-02-09 13:43:50 +08:00
panic(err)
2021-12-27 16:48:05 +08:00
}
2023-02-09 13:43:50 +08:00
log.NewInfo(operationID, "rpc user success")
2021-12-27 16:48:05 +08:00
}
2023-02-09 10:58:30 +08:00
// ok
2023-02-10 16:18:26 +08:00
//func (s *userServer) SyncJoinedGroupMemberFaceURL(ctx context.Context, userID string, faceURL string, operationID string, opUserID string) {
// members, err := s.GetJoinedGroupMembers(ctx, userID)
// if err != nil {
// return
// }
// groupIDs := make([]string, 0)
// for _, v := range members {
// groupIDs = append(groupIDs, v.GroupID)
// }
// if s.SetGroupMemberInfo(ctx, "", faceURL, "", 0, groupIDs, userID) != nil {
// return
// }
// for _, v := range groupIDs {
// chat.GroupMemberInfoSetNotification(operationID, opUserID, v, userID)
// }
//}
2022-03-11 17:37:01 +08:00
2023-02-09 10:58:30 +08:00
// ok
2023-02-10 16:18:26 +08:00
//func (s *userServer) SyncJoinedGroupMemberNickname(ctx context.Context, userID string, newNickname, oldNickname string, operationID string, opUserID string) {
// members, err := s.GetJoinedGroupMembers(ctx, userID)
// if err != nil {
// return
// }
// groupIDs := make([]string, 0)
// for _, v := range members {
// if v.Nickname == oldNickname {
// groupIDs = append(groupIDs, v.GroupID)
// }
// }
// s.SetGroupMemberInfo(ctx, newNickname, "", "", 0, groupIDs, userID)
// for _, v := range groupIDs {
// chat.GroupMemberInfoSetNotification(operationID, opUserID, v, userID)
// }
//}
2021-12-27 16:48:05 +08:00
2023-02-10 16:18:26 +08:00
// 设置群头像
//func (s *userServer) SetGroupMemberInfo(ctx context.Context, nickname, faceURL, ex string, roleLevel int32, groupIDs []string, userID string) (err error) {
//
// req := pbgroup.SetGroupMemberInfo{UserID: userID}
// if nickname != "" {
// req.Nickname = &wrappers.StringValue{Value: nickname}
// }
// if faceURL != "" {
// req.FaceURL = &wrappers.StringValue{Value: faceURL}
// }
// if ex != "" {
// req.Ex = &wrappers.StringValue{Value: ex}
// }
// if roleLevel != 0 {
// req.RoleLevel = &wrappers.Int32Value{Value: roleLevel}
// }
//
// setGroupMemberInfoReq := &pbgroup.SetGroupMemberInfoReq{}
// for _, v := range groupIDs {
// req.GroupID = v
// setGroupMemberInfoReq.Members = append(setGroupMemberInfoReq.Members, &req)
// }
2023-02-10 12:53:46 +08:00
// conn, err := s.RegisterCenter.GetConn(config.Config.RpcRegisterName.OpenImGroupName)
// if err != nil {
// return err
// }
// client := group.NewGroupClient(conn)
2023-02-10 16:18:26 +08:00
// _, err = client.SetGroupMemberInfo(ctx, setGroupMemberInfoReq)
2023-02-10 12:53:46 +08:00
// return
//}
2023-02-09 10:58:30 +08:00
// 获取加入的群成员信息
2023-02-10 16:18:26 +08:00
//func (s *userServer) GetJoinedGroupMembers(ctx context.Context, userID string) (members []*sdkws.GroupMemberFullInfo, err error) {
// conn, err := s.RegisterCenter.GetConn(config.Config.RpcRegisterName.OpenImGroupName)
// if err != nil {
// return nil, err
// }
//
// client := group.NewGroupClient(conn)
// for {
// idx := int32(0)
// req := pbgroup.GetJoinedGroupListReq{FromUserID: userID, Pagination: &sdkws.RequestPagination{PageNumber: idx, ShowNumber: constant.ShowNumber}}
// resp, err := client.GetJoinedGroupList(ctx, &req)
// if err != nil {
// return nil, err
// }
// groupIDs := make([]string, 0)
//
// for _, v := range resp.Groups {
// groupIDs = append(groupIDs, v.GroupID)
// }
//
// client.GetGroupMembersInfo()
//
// if len(resp.Groups) < constant.ShowNumber {
// break
// }
// idx++
// }
//
// return
//}
2023-02-09 10:58:30 +08:00
2023-02-07 20:28:34 +08:00
// ok
2023-02-10 12:53:46 +08:00
func (s *userServer) GetDesignateUsers(ctx context.Context, req *pbuser.GetDesignateUsersReq) (resp *pbuser.GetDesignateUsersResp, err error) {
resp = &pbuser.GetDesignateUsersResp{}
2023-02-09 10:58:30 +08:00
users, err := s.FindWithError(ctx, req.UserIDs)
2023-01-29 16:30:33 +08:00
if err != nil {
return nil, err
}
2023-01-31 20:33:33 +08:00
resp.UsersInfo, err = (*convert.DBUser)(nil).DB2PB(users)
if err != nil {
return nil, err
2023-01-29 16:30:33 +08:00
}
return resp, nil
2021-12-27 16:48:05 +08:00
}
2023-02-09 20:36:34 +08:00
func (s *userServer) GetAllPageFriends(ctx context.Context, ownerUserID string) (resp []*sdkws.FriendInfo, err error) {
2023-02-09 10:58:30 +08:00
return
}
// ok
2023-02-10 12:53:46 +08:00
func (s *userServer) UpdateUserInfo(ctx context.Context, req *pbuser.UpdateUserInfoReq) (resp *pbuser.UpdateUserInfoResp, err error) {
resp = &pbuser.UpdateUserInfoResp{}
2023-02-09 14:40:49 +08:00
err = tokenverify.CheckAccessV3(ctx, req.UserInfo.UserID)
2023-01-29 14:47:21 +08:00
if err != nil {
return nil, err
2021-12-27 16:48:05 +08:00
}
2023-02-10 16:18:26 +08:00
//oldNickname := ""
//if req.UserInfo.Nickname != "" {
// u, err := s.FindWithError(ctx, []string{req.UserInfo.UserID})
// if err != nil {
// return nil, err
// }
// oldNickname = u[0].Nickname
//}
2023-01-31 15:45:24 +08:00
user, err := convert.NewPBUser(req.UserInfo).Convert()
2022-06-16 19:26:09 +08:00
if err != nil {
2023-01-29 14:47:21 +08:00
return nil, err
2021-12-27 16:48:05 +08:00
}
2023-02-10 12:53:46 +08:00
err = s.Update(ctx, []*tablerelation.UserModel{user})
2023-01-29 14:47:21 +08:00
if err != nil {
return nil, err
}
2023-02-09 10:58:30 +08:00
friends, err := s.GetAllPageFriends(ctx, req.UserInfo.UserID)
2021-12-27 16:48:05 +08:00
if err != nil {
2023-01-30 10:40:27 +08:00
return nil, err
2022-07-14 12:08:28 +08:00
}
2023-01-30 10:40:27 +08:00
go func() {
2023-02-09 10:58:30 +08:00
for _, v := range friends {
2023-02-14 11:33:10 +08:00
s.notification.FriendInfoUpdatedNotification(ctx, req.UserInfo.UserID, v.FriendUser.UserID, tracelog.GetOpUserID(ctx))
2023-01-30 10:40:27 +08:00
}
}()
2023-02-14 11:33:10 +08:00
s.notification.UserInfoUpdatedNotification(ctx, tracelog.GetOpUserID(ctx), req.UserInfo.UserID)
2023-02-10 16:18:26 +08:00
2023-02-09 10:58:30 +08:00
return resp, nil
2021-12-27 16:48:05 +08:00
}
2022-01-24 01:40:49 +08:00
2023-02-09 10:58:30 +08:00
// ok
2023-02-10 12:53:46 +08:00
func (s *userServer) SetGlobalRecvMessageOpt(ctx context.Context, req *pbuser.SetGlobalRecvMessageOptReq) (resp *pbuser.SetGlobalRecvMessageOptResp, err error) {
resp = &pbuser.SetGlobalRecvMessageOptResp{}
2023-02-09 10:58:30 +08:00
if _, err := s.FindWithError(ctx, []string{req.UserID}); err != nil {
2023-02-07 20:28:34 +08:00
return nil, err
}
2022-06-16 19:33:35 +08:00
m := make(map[string]interface{}, 1)
m["global_recv_msg_opt"] = req.GlobalRecvMsgOpt
2023-02-07 20:28:34 +08:00
if err := s.UpdateByMap(ctx, req.UserID, m); err != nil {
2023-01-29 16:30:33 +08:00
return nil, err
2022-08-11 20:04:15 +08:00
}
2023-02-14 11:33:10 +08:00
s.notification.UserInfoUpdatedNotification(ctx, req.UserID, req.UserID)
2023-02-07 20:28:34 +08:00
return resp, nil
2022-06-16 19:33:35 +08:00
}
2023-02-09 10:58:30 +08:00
// ok
2023-02-10 12:53:46 +08:00
func (s *userServer) AccountCheck(ctx context.Context, req *pbuser.AccountCheckReq) (resp *pbuser.AccountCheckResp, err error) {
resp = &pbuser.AccountCheckResp{}
2023-02-09 10:58:30 +08:00
if utils.Duplicate(req.CheckUserIDs) {
return nil, constant.ErrArgs.Wrap("userID repeated")
}
2023-02-09 14:40:49 +08:00
err = tokenverify.CheckAdmin(ctx)
2022-05-12 18:00:23 +08:00
if err != nil {
2023-01-29 16:30:33 +08:00
return nil, err
2022-05-12 18:00:23 +08:00
}
2023-02-09 10:58:30 +08:00
users, err := s.Find(ctx, req.CheckUserIDs)
if err != nil {
2023-01-29 16:30:33 +08:00
return nil, err
}
2023-02-07 20:28:34 +08:00
userIDs := make(map[string]interface{}, 0)
2023-02-09 10:58:30 +08:00
for _, v := range users {
2023-02-07 20:28:34 +08:00
userIDs[v.UserID] = nil
2023-01-29 16:30:33 +08:00
}
for _, v := range req.CheckUserIDs {
2023-02-10 12:53:46 +08:00
temp := &pbuser.AccountCheckRespSingleUserStatus{UserID: v}
2023-02-07 20:28:34 +08:00
if _, ok := userIDs[v]; ok {
2023-01-29 16:30:33 +08:00
temp.AccountStatus = constant.Registered
} else {
temp.AccountStatus = constant.UnRegistered
}
2023-02-07 20:28:34 +08:00
resp.Results = append(resp.Results, temp)
}
2023-02-07 20:28:34 +08:00
return resp, nil
}
2023-02-09 10:58:30 +08:00
// ok
2023-02-10 12:53:46 +08:00
func (s *userServer) GetPaginationUsers(ctx context.Context, req *pbuser.GetPaginationUsersReq) (resp *pbuser.GetPaginationUsersResp, err error) {
resp = &pbuser.GetPaginationUsersResp{}
2023-02-09 10:58:30 +08:00
usersDB, total, err := s.Page(ctx, req.Pagination.PageNumber, req.Pagination.ShowNumber)
2023-01-29 17:46:11 +08:00
if err != nil {
2023-01-29 17:54:01 +08:00
return nil, err
2022-09-06 20:35:32 +08:00
}
2023-01-29 17:54:01 +08:00
resp.Total = int32(total)
2023-02-09 10:58:30 +08:00
resp.Users, err = (*convert.DBUser)(nil).DB2PB(usersDB)
2023-02-07 20:39:12 +08:00
return resp, nil
2022-01-24 01:40:49 +08:00
}
2023-01-31 20:33:33 +08:00
2023-02-09 10:58:30 +08:00
// ok
2023-02-10 12:53:46 +08:00
func (s *userServer) UserRegister(ctx context.Context, req *pbuser.UserRegisterReq) (resp *pbuser.UserRegisterResp, err error) {
resp = &pbuser.UserRegisterResp{}
2023-02-09 20:36:34 +08:00
if utils.DuplicateAny(req.Users, func(e *sdkws.UserInfo) string { return e.UserID }) {
2023-02-07 20:28:34 +08:00
return nil, constant.ErrArgs.Wrap("userID repeated")
}
2023-01-31 20:33:33 +08:00
userIDs := make([]string, 0)
for _, v := range req.Users {
userIDs = append(userIDs, v.UserID)
}
exist, err := s.IsExist(ctx, userIDs)
if err != nil {
return nil, err
}
if exist {
2023-02-09 10:58:30 +08:00
return nil, constant.ErrRegisteredAlready.Wrap("userID registered already")
2023-01-31 20:33:33 +08:00
}
users, err := (*convert.PBUser)(nil).PB2DB(req.Users)
if err != nil {
return nil, err
}
err = s.Create(ctx, users)
if err != nil {
return nil, err
}
2023-02-07 20:28:34 +08:00
return resp, nil
2023-01-31 20:33:33 +08:00
}