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

336 lines
9.8 KiB
Go
Raw Normal View History

2021-12-27 16:48:05 +08:00
package user
import (
2023-01-31 15:45:24 +08:00
"Open_IM/internal/common/convert"
2021-12-27 16:48:05 +08:00
chat "Open_IM/internal/rpc/msg"
"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"
2021-12-27 16:48:05 +08:00
"Open_IM/pkg/common/log"
2022-09-15 01:22:20 +08:00
promePkg "Open_IM/pkg/common/prometheus"
2021-12-27 16:48:05 +08:00
"Open_IM/pkg/common/token_verify"
2023-01-31 15:45:24 +08:00
"Open_IM/pkg/common/tracelog"
2023-01-11 11:24:38 +08:00
"Open_IM/pkg/getcdv3"
2021-12-27 16:48:05 +08:00
pbFriend "Open_IM/pkg/proto/friend"
2023-01-30 10:40:27 +08:00
pbGroup "Open_IM/pkg/proto/group"
2021-12-27 16:48:05 +08:00
pbUser "Open_IM/pkg/proto/user"
"Open_IM/pkg/utils"
"context"
2023-01-30 10:40:27 +08:00
"github.com/golang/protobuf/ptypes/wrappers"
2021-12-27 16:48:05 +08:00
"net"
"strconv"
"strings"
2022-01-27 01:08:02 +08:00
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 {
rpcPort int
rpcRegisterName string
etcdSchema string
etcdAddr []string
2023-01-29 14:47:21 +08:00
controller.UserInterface
2021-12-27 16:48:05 +08:00
}
2021-12-28 15:33:47 +08:00
func NewUserServer(port int) *userServer {
2022-03-31 11:15:06 +08:00
log.NewPrivateLog(constant.LogFileName)
2023-01-29 14:47:21 +08:00
u := userServer{
2021-12-28 15:33:47 +08:00
rpcPort: port,
rpcRegisterName: config.Config.RpcRegisterName.OpenImUserName,
etcdSchema: config.Config.Etcd.EtcdSchema,
etcdAddr: config.Config.Etcd.EtcdAddr,
}
2023-01-29 14:47:21 +08:00
//mysql init
var mysql relation.Mysql
var model relation.User
err := mysql.InitConn().AutoMigrateModel(&model)
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")
}
u.UserInterface = controller.NewUserController(model.DB)
return &u
2021-12-28 15:33:47 +08:00
}
2021-12-27 16:48:05 +08:00
func (s *userServer) Run() {
2023-01-30 10:40:27 +08:00
log.NewInfo("", "rpc user 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)
2021-12-27 16:48:05 +08:00
//listener network
2022-05-07 17:05:05 +08:00
listener, err := net.Listen("tcp", address)
2021-12-27 16:48:05 +08:00
if err != nil {
2022-05-10 09:09:37 +08:00
panic("listening err:" + err.Error() + s.rpcRegisterName)
2021-12-27 16:48:05 +08:00
}
2023-01-30 10:40:27 +08:00
log.NewInfo("", "listen network success, address ", address, listener)
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 {
2022-09-15 08:45:10 +08:00
promePkg.NewGrpcRequestCounter()
promePkg.NewGrpcRequestFailedCounter()
promePkg.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
pbUser.RegisterUserServer(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())
}
}
2023-01-30 10:40:27 +08:00
err = getcdv3.RegisterEtcd(s.etcdSchema, strings.Join(s.etcdAddr, ","), rpcRegisterIP, s.rpcPort, s.rpcRegisterName, 10, "")
2021-12-27 16:48:05 +08:00
if err != nil {
2023-01-30 10:40:27 +08:00
log.NewError("", "RegisterEtcd failed ", err.Error(), s.etcdSchema, strings.Join(s.etcdAddr, ","), rpcRegisterIP, s.rpcPort, s.rpcRegisterName)
2022-08-26 17:41:58 +08:00
panic(utils.Wrap(err, "register user module rpc to etcd err"))
2021-12-27 16:48:05 +08:00
}
err = srv.Serve(listener)
if err != nil {
2023-01-30 10:40:27 +08:00
log.NewError("", "Serve failed ", err.Error())
2021-12-27 16:48:05 +08:00
return
}
2023-01-30 10:40:27 +08:00
log.NewInfo("", "rpc user success")
2021-12-27 16:48:05 +08:00
}
2023-01-30 10:40:27 +08:00
func (s *userServer) SyncJoinedGroupMemberFaceURL(ctx context.Context, userID string, faceURL string, operationID string, opUserID string) {
etcdConn, err := getcdv3.GetConn(ctx, config.Config.RpcRegisterName.OpenImFriendName)
2022-03-16 18:02:26 +08:00
if err != nil {
2023-01-30 10:40:27 +08:00
return
2022-03-16 18:02:26 +08:00
}
2023-01-30 10:40:27 +08:00
client := pbGroup.NewGroupClient(etcdConn)
newReq := &pbGroup.GetJoinedGroupListReq{FromUserID: userID}
rpcResp, err := client.GetJoinedGroupList(ctx, newReq)
2021-12-27 16:48:05 +08:00
if err != nil {
2023-01-30 10:40:27 +08:00
return
2021-12-27 16:48:05 +08:00
}
2023-01-30 10:40:27 +08:00
for _, group := range rpcResp.Groups {
req := &pbGroup.SetGroupMemberInfoReq{GroupID: group.GroupID, UserID: userID, FaceURL: &wrappers.StringValue{Value: faceURL}}
_, err := client.SetGroupMemberInfo(ctx, req)
2022-04-18 19:24:36 +08:00
if err != nil {
2023-01-30 10:40:27 +08:00
return
2022-04-18 19:24:36 +08:00
}
2023-01-30 10:40:27 +08:00
chat.GroupMemberInfoSetNotification(operationID, opUserID, group.GroupID, userID)
2022-04-18 19:24:36 +08:00
}
2021-12-27 16:48:05 +08:00
}
2022-03-11 17:37:01 +08:00
2023-01-30 10:40:27 +08:00
func (s *userServer) SyncJoinedGroupMemberNickname(ctx context.Context, userID string, newNickname, oldNickname string, operationID string, opUserID string) {
etcdConn, err := getcdv3.GetConn(ctx, config.Config.RpcRegisterName.OpenImFriendName)
2021-12-27 16:48:05 +08:00
if err != nil {
2023-01-30 10:40:27 +08:00
return
2021-12-27 16:48:05 +08:00
}
2023-01-30 10:40:27 +08:00
client := pbGroup.NewGroupClient(etcdConn)
newReq := &pbGroup.GetJoinedGroupListReq{FromUserID: userID}
rpcResp, err := client.GetJoinedGroupList(ctx, newReq)
2023-01-29 16:30:33 +08:00
if err != nil {
return
2021-12-27 16:48:05 +08:00
}
2023-01-30 10:40:27 +08:00
req := pbGroup.GetUserInGroupMembersReq{UserID: userID}
for _, group := range rpcResp.Groups {
req.GroupIDs = append(req.GroupIDs, group.GroupID)
2023-01-29 16:30:33 +08:00
}
2023-01-30 10:40:27 +08:00
resp, err := client.GetUserInGroupMembers(ctx, &req)
2021-12-27 16:48:05 +08:00
if err != nil {
2023-01-29 16:30:33 +08:00
return
}
2023-01-30 10:40:27 +08:00
for _, v := range resp.Members {
if v.Nickname == oldNickname {
req := pbGroup.SetGroupMemberNicknameReq{Nickname: newNickname, GroupID: v.GroupID, UserID: v.UserID}
_, err := client.SetGroupMemberNickname(ctx, &req)
if err != nil {
return
2021-12-27 16:48:05 +08:00
}
2023-01-30 10:40:27 +08:00
chat.GroupMemberInfoSetNotification(operationID, opUserID, v.GroupID, userID)
2021-12-27 16:48:05 +08:00
}
}
2023-01-29 16:30:33 +08:00
}
2021-12-27 16:48:05 +08:00
2023-01-29 16:30:33 +08:00
func (s *userServer) GetUsersInfo(ctx context.Context, req *pbUser.GetUsersInfoReq) (*pbUser.GetUsersInfoResp, error) {
resp := &pbUser.GetUsersInfoResp{}
users, err := s.Find(ctx, req.UserIDs)
if err != nil {
return nil, err
}
for _, v := range users {
2023-01-31 15:45:24 +08:00
n, err := convert.NewDBUser(v).Convert()
2023-01-29 16:30:33 +08:00
if err != nil {
return nil, err
}
resp.UsersInfo = append(resp.UsersInfo, n)
}
return resp, nil
2021-12-27 16:48:05 +08:00
}
func (s *userServer) UpdateUserInfo(ctx context.Context, req *pbUser.UpdateUserInfoReq) (*pbUser.UpdateUserInfoResp, error) {
2023-01-29 14:47:21 +08:00
resp := pbUser.UpdateUserInfoResp{}
err := token_verify.CheckAccessV3(ctx, req.UserInfo.UserID)
if err != nil {
return nil, err
2021-12-27 16:48:05 +08:00
}
oldNickname := ""
if req.UserInfo.Nickname != "" {
2023-01-29 14:47:21 +08:00
u, err := s.Take(ctx, req.UserInfo.UserID)
2022-10-28 15:42:37 +08:00
if err != nil {
2023-01-29 14:47:21 +08:00
return nil, err
2022-10-28 15:42:37 +08:00
}
2023-01-29 14:47:21 +08:00
oldNickname = u.Nickname
2021-12-28 20:28:01 +08:00
}
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-01-29 14:47:21 +08:00
err = s.Update(ctx, []*relation.User{user})
if err != nil {
return nil, err
}
etcdConn, err := getcdv3.GetConn(ctx, config.Config.RpcRegisterName.OpenImFriendName)
if err != nil {
return nil, err
2022-06-16 14:09:28 +08:00
}
2021-12-27 16:48:05 +08:00
client := pbFriend.NewFriendClient(etcdConn)
2023-01-31 15:45:24 +08:00
newReq := &pbFriend.GetFriendsReq{UserID: req.UserInfo.UserID}
rpcResp, err := client.GetFriends(context.Background(), newReq)
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-01-31 15:45:24 +08:00
for _, v := range rpcResp.FriendsInfo {
chat.FriendInfoUpdatedNotification(tracelog.GetOperationID(ctx), req.UserInfo.UserID, v.FriendUser.UserID, tracelog.GetOpUserID(ctx))
2023-01-30 10:40:27 +08:00
}
}()
2023-01-31 15:45:24 +08:00
chat.UserInfoUpdatedNotification(tracelog.GetOperationID(ctx), tracelog.GetOpUserID(ctx), req.UserInfo.UserID)
2022-05-12 18:00:23 +08:00
if req.UserInfo.FaceURL != "" {
2023-01-31 15:45:24 +08:00
s.SyncJoinedGroupMemberFaceURL(ctx, req.UserInfo.UserID, req.UserInfo.FaceURL, tracelog.GetOperationID(ctx), tracelog.GetOpUserID(ctx))
2022-05-12 18:00:23 +08:00
}
if req.UserInfo.Nickname != "" {
2023-01-31 15:45:24 +08:00
s.SyncJoinedGroupMemberNickname(ctx, req.UserInfo.UserID, req.UserInfo.Nickname, oldNickname, tracelog.GetOperationID(ctx), tracelog.GetOpUserID(ctx))
2022-08-16 11:49:20 +08:00
}
2023-01-30 10:40:27 +08:00
return &resp, nil
2021-12-27 16:48:05 +08:00
}
2022-01-24 01:40:49 +08:00
2023-01-29 16:30:33 +08:00
func (s *userServer) SetGlobalRecvMessageOpt(ctx context.Context, req *pbUser.SetGlobalRecvMessageOptReq) (*pbUser.SetGlobalRecvMessageOptResp, error) {
resp := pbUser.SetGlobalRecvMessageOptResp{}
2022-06-16 19:33:35 +08:00
m := make(map[string]interface{}, 1)
m["global_recv_msg_opt"] = req.GlobalRecvMsgOpt
2023-01-29 16:30:33 +08:00
err := s.UpdateByMap(ctx, req.UserID, m)
2022-06-16 19:33:35 +08:00
if err != nil {
2023-01-29 16:30:33 +08:00
return nil, err
2022-08-11 20:04:15 +08:00
}
2023-01-31 15:45:24 +08:00
chat.UserInfoUpdatedNotification(tracelog.GetOperationID(ctx), req.UserID, req.UserID)
2023-01-29 16:30:33 +08:00
return &resp, nil
2022-06-16 19:33:35 +08:00
}
2023-01-29 16:30:33 +08:00
func (s *userServer) AccountCheck(ctx context.Context, req *pbUser.AccountCheckReq) (*pbUser.AccountCheckResp, error) {
resp := pbUser.AccountCheckResp{}
2023-01-31 15:45:24 +08:00
err := token_verify.CheckManagerUserID(ctx, tracelog.GetOpUserID(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-01-29 16:30:33 +08:00
user, err := s.Find(ctx, req.CheckUserIDs)
if err != nil {
2023-01-29 16:30:33 +08:00
return nil, err
}
2023-01-29 16:30:33 +08:00
uidList := make([]string, 0)
for _, v := range user {
uidList = append(uidList, v.UserID)
}
var r []*pbUser.AccountCheckResp_SingleUserStatus
for _, v := range req.CheckUserIDs {
temp := new(pbUser.AccountCheckResp_SingleUserStatus)
temp.UserID = v
if utils.IsContain(v, uidList) {
temp.AccountStatus = constant.Registered
} else {
temp.AccountStatus = constant.UnRegistered
}
2023-01-29 16:30:33 +08:00
r = append(r, temp)
}
2023-01-29 16:30:33 +08:00
return &resp, nil
}
2022-08-26 17:51:01 +08:00
func (s *userServer) GetUsers(ctx context.Context, req *pbUser.GetUsersReq) (*pbUser.GetUsersResp, error) {
2023-01-29 16:30:33 +08:00
resp := pbUser.GetUsersResp{}
2022-09-06 20:35:32 +08:00
var err error
2022-08-26 17:51:01 +08:00
if req.UserID != "" {
2023-01-29 16:30:33 +08:00
u, err := s.Take(ctx, req.UserID)
2022-02-08 20:24:59 +08:00
if err != nil {
2023-01-29 16:30:33 +08:00
return nil, err
2022-02-08 20:24:59 +08:00
}
2023-01-29 16:30:33 +08:00
resp.Total = 1
2023-01-31 15:45:24 +08:00
u1, err := convert.NewDBUser(u).Convert()
2023-01-29 16:30:33 +08:00
if err != nil {
return nil, err
}
resp.Users = append(resp.Users, u1)
return &resp, nil
}
if req.UserName != "" {
2023-01-29 17:46:11 +08:00
usersDB, total, err := s.GetByName(ctx, req.UserName, req.Pagination.ShowNumber, req.Pagination.PageNumber)
2022-08-26 17:51:01 +08:00
if err != nil {
2023-01-29 17:46:11 +08:00
return nil, err
2022-08-26 17:51:01 +08:00
}
2023-01-29 17:46:11 +08:00
resp.Total = int32(total)
for _, v := range usersDB {
2023-01-31 15:45:24 +08:00
u1, err := convert.NewDBUser(v).Convert()
2023-01-29 17:46:11 +08:00
if err != nil {
return nil, err
}
resp.Users = append(resp.Users, u1)
2022-08-26 17:51:01 +08:00
}
2023-01-29 17:46:11 +08:00
return &resp, nil
2022-09-06 20:35:32 +08:00
} else if req.Content != "" {
2023-01-29 17:46:11 +08:00
usersDB, total, err := s.GetByNameAndID(ctx, req.UserName, req.Pagination.ShowNumber, req.Pagination.PageNumber)
2022-09-06 20:35:32 +08:00
if err != nil {
2023-01-29 17:46:11 +08:00
return nil, err
}
resp.Total = int32(total)
for _, v := range usersDB {
2023-01-31 15:45:24 +08:00
u1, err := convert.NewDBUser(v).Convert()
2023-01-29 17:46:11 +08:00
if err != nil {
return nil, err
}
resp.Users = append(resp.Users, u1)
2022-08-26 17:51:01 +08:00
}
2023-01-29 17:46:11 +08:00
return &resp, nil
2023-01-29 16:30:33 +08:00
}
2023-01-29 17:54:01 +08:00
usersDB, total, err := s.Get(ctx, req.Pagination.ShowNumber, req.Pagination.PageNumber)
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)
2022-08-19 21:37:39 +08:00
2023-01-29 17:54:01 +08:00
for _, userDB := range usersDB {
2023-01-31 15:45:24 +08:00
u, err := convert.NewDBUser(userDB).Convert()
2023-01-29 17:54:01 +08:00
if err != nil {
return nil, err
2022-01-25 19:18:04 +08:00
}
2023-01-29 17:54:01 +08:00
resp.Users = append(resp.Users, u)
2022-01-24 01:40:49 +08:00
}
2023-01-29 17:54:01 +08:00
return &resp, nil
2022-01-24 01:40:49 +08:00
}