user.go 10.6 KB
Newer Older
W
wenxu12345 已提交
1 2 3 4 5 6 7 8 9 10 11 12
package user

import (
	chat "Open_IM/internal/rpc/msg"
	"Open_IM/pkg/common/config"
	"Open_IM/pkg/common/constant"
	"Open_IM/pkg/common/db"
	imdb "Open_IM/pkg/common/db/mysql_model/im_mysql_model"
	"Open_IM/pkg/common/log"
	"Open_IM/pkg/common/token_verify"
	"Open_IM/pkg/grpc-etcdv3/getcdv3"
	pbFriend "Open_IM/pkg/proto/friend"
W
wenxu12345 已提交
13
	sdkws "Open_IM/pkg/proto/sdk_ws"
W
wenxu12345 已提交
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
	pbUser "Open_IM/pkg/proto/user"
	"Open_IM/pkg/utils"
	"context"
	"google.golang.org/grpc"
	"net"
	"strconv"
	"strings"
)

type userServer struct {
	rpcPort         int
	rpcRegisterName string
	etcdSchema      string
	etcdAddr        []string
}

W
wenxu12345 已提交
30 31 32 33 34 35 36 37 38 39
func NewUserServer(port int) *userServer {
	log.NewPrivateLog("user")
	return &userServer{
		rpcPort:         port,
		rpcRegisterName: config.Config.RpcRegisterName.OpenImUserName,
		etcdSchema:      config.Config.Etcd.EtcdSchema,
		etcdAddr:        config.Config.Etcd.EtcdAddr,
	}
}

W
wenxu12345 已提交
40 41 42 43 44 45 46 47 48 49 50
func (s *userServer) Run() {
	log.NewInfo("0", "", "rpc user start...")

	ip := utils.ServerIP
	registerAddress := ip + ":" + strconv.Itoa(s.rpcPort)
	//listener network
	listener, err := net.Listen("tcp", registerAddress)
	if err != nil {
		log.NewError("0", "listen network failed ", err.Error(), registerAddress)
		return
	}
W
wenxu12345 已提交
51
	log.NewInfo("0", "listen network success, address ", registerAddress, listener)
W
wenxu12345 已提交
52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
	defer listener.Close()
	//grpc server
	srv := grpc.NewServer()
	defer srv.GracefulStop()
	//Service registers with etcd
	pbUser.RegisterUserServer(srv, s)
	err = getcdv3.RegisterEtcd(s.etcdSchema, strings.Join(s.etcdAddr, ","), ip, s.rpcPort, s.rpcRegisterName, 10)
	if err != nil {
		log.NewError("0", "RegisterEtcd failed ", err.Error(), s.etcdSchema, strings.Join(s.etcdAddr, ","), ip, s.rpcPort, s.rpcRegisterName)
		return
	}
	err = srv.Serve(listener)
	if err != nil {
		log.NewError("0", "Serve failed ", err.Error())
		return
	}
W
wenxu12345 已提交
68
	log.NewInfo("0", "rpc  user success")
W
wenxu12345 已提交
69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
}

func (s *userServer) GetUserInfo(ctx context.Context, req *pbUser.GetUserInfoReq) (*pbUser.GetUserInfoResp, error) {
	log.NewInfo(req.OperationID, "GetUserInfo args ", req.String())
	var userInfoList []*sdkws.UserInfo
	if len(req.UserIDList) > 0 {
		for _, userID := range req.UserIDList {
			var userInfo sdkws.UserInfo
			user, err := imdb.GetUserByUserID(userID)
			if err != nil {
				log.NewError(req.OperationID, "GetUserByUserID failed ", err.Error(), userID)
				continue
			}
			utils.CopyStructFields(&userInfo, user)
			userInfoList = append(userInfoList, &userInfo)
		}
	} else {

		return &pbUser.GetUserInfoResp{CommonResp: &pbUser.CommonResp{ErrCode: constant.ErrArgs.ErrCode, ErrMsg: constant.ErrArgs.ErrMsg}}, nil
	}
W
wenxu12345 已提交
89 90
	log.NewInfo(req.OperationID, "GetUserInfo rpc return ", pbUser.GetUserInfoResp{CommonResp: &pbUser.CommonResp{}, UserInfoList: userInfoList})
	return &pbUser.GetUserInfoResp{CommonResp: &pbUser.CommonResp{}, UserInfoList: userInfoList}, nil
W
wenxu12345 已提交
91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
}

func (s *userServer) SetReceiveMessageOpt(ctx context.Context, req *pbUser.SetReceiveMessageOptReq) (*pbUser.SetReceiveMessageOptResp, error) {
	log.NewInfo(req.OperationID, "SetReceiveMessageOpt args ", req.String())
	m := make(map[string]int, len(req.ConversationIDList))
	for _, v := range req.ConversationIDList {
		m[v] = int(req.Opt)
	}
	err := db.DB.SetMultiConversationMsgOpt(req.FromUserID, m)
	if err != nil {
		log.NewError(req.OperationID, "SetMultiConversationMsgOpt failed ", err.Error(), req)
		return &pbUser.SetReceiveMessageOptResp{CommonResp: &pbUser.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}}, nil
	}
	resp := pbUser.SetReceiveMessageOptResp{CommonResp: &pbUser.CommonResp{}}

	for _, v := range req.ConversationIDList {
programor_guo's avatar
programor_guo 已提交
107
		resp.ConversationOptResultList = append(resp.ConversationOptResultList, &pbUser.OptResult{ConversationID: v, Result: req.Opt})
W
wenxu12345 已提交
108 109 110 111 112 113 114
	}
	log.NewInfo(req.OperationID, "SetReceiveMessageOpt rpc return ", resp.String())
	return &resp, nil
}

func (s *userServer) GetReceiveMessageOpt(ctx context.Context, req *pbUser.GetReceiveMessageOptReq) (*pbUser.GetReceiveMessageOptResp, error) {
	log.NewInfo(req.OperationID, "GetReceiveMessageOpt args ", req.String())
programor_guo's avatar
programor_guo 已提交
115
	m, err := db.DB.GetMultiConversationMsgOpt(req.FromUserID, req.ConversationIDList)
W
wenxu12345 已提交
116
	if err != nil {
programor_guo's avatar
programor_guo 已提交
117
		log.NewError(req.OperationID, "GetMultiConversationMsgOpt failed ", err.Error(), req.FromUserID, req.ConversationIDList)
W
wenxu12345 已提交
118 119 120 121
		return &pbUser.GetReceiveMessageOptResp{CommonResp: &pbUser.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}}, nil
	}
	resp := pbUser.GetReceiveMessageOptResp{CommonResp: &pbUser.CommonResp{}}
	for k, v := range m {
programor_guo's avatar
programor_guo 已提交
122
		resp.ConversationOptResultList = append(resp.ConversationOptResultList, &pbUser.OptResult{ConversationID: k, Result: int32(v)})
W
wenxu12345 已提交
123 124 125 126 127 128 129
	}
	log.NewInfo(req.OperationID, "GetReceiveMessageOpt rpc return ", resp.String())
	return &resp, nil
}

func (s *userServer) GetAllConversationMsgOpt(ctx context.Context, req *pbUser.GetAllConversationMsgOptReq) (*pbUser.GetAllConversationMsgOptResp, error) {
	log.NewInfo(req.OperationID, "GetAllConversationMsgOpt args ", req.String())
programor_guo's avatar
programor_guo 已提交
130
	m, err := db.DB.GetAllConversationMsgOpt(req.FromUserID)
W
wenxu12345 已提交
131
	if err != nil {
programor_guo's avatar
programor_guo 已提交
132
		log.NewError(req.OperationID, "GetAllConversationMsgOpt failed ", err.Error(), req.FromUserID)
W
wenxu12345 已提交
133 134 135 136
		return &pbUser.GetAllConversationMsgOptResp{CommonResp: &pbUser.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}}, nil
	}
	resp := pbUser.GetAllConversationMsgOptResp{CommonResp: &pbUser.CommonResp{}}
	for k, v := range m {
programor_guo's avatar
programor_guo 已提交
137
		resp.ConversationOptResultList = append(resp.ConversationOptResultList, &pbUser.OptResult{ConversationID: k, Result: int32(v)})
W
wenxu12345 已提交
138 139 140 141 142 143
	}
	log.NewInfo(req.OperationID, "GetAllConversationMsgOpt rpc return ", resp.String())
	return &resp, nil
}
func (s *userServer) DeleteUsers(_ context.Context, req *pbUser.DeleteUsersReq) (*pbUser.DeleteUsersResp, error) {
	log.NewInfo(req.OperationID, "DeleteUsers args ", req.String())
programor_guo's avatar
programor_guo 已提交
144
	if !token_verify.IsMangerUserID(req.OpUserID) {
W
wenxu12345 已提交
145 146 147 148 149 150
		log.NewError(req.OperationID, "IsMangerUserID false ", req.OpUserID)
		return &pbUser.DeleteUsersResp{CommonResp: &pbUser.CommonResp{ErrCode: constant.ErrAccess.ErrCode, ErrMsg: constant.ErrAccess.ErrMsg}, FailedUserIDList: req.DeleteUserIDList}, nil
	}
	var common pbUser.CommonResp
	resp := pbUser.DeleteUsersResp{CommonResp: &common}
	for _, userID := range req.DeleteUserIDList {
programor_guo's avatar
err log  
programor_guo 已提交
151 152
		i := imdb.DeleteUser(userID)
		if i == 0 {
programor_guo's avatar
err log  
programor_guo 已提交
153
			log.NewError(req.OperationID, "delete user error", userID)
W
wenxu12345 已提交
154 155 156 157 158 159 160 161 162 163
			common.ErrCode = 201
			common.ErrMsg = "some uid deleted failed"
			resp.FailedUserIDList = append(resp.FailedUserIDList, userID)
		}
	}
	log.NewInfo(req.OperationID, "DeleteUsers rpc return ", resp.String())
	return &resp, nil
}

func (s *userServer) GetAllUserID(_ context.Context, req *pbUser.GetAllUserIDReq) (*pbUser.GetAllUserIDResp, error) {
W
wenxu12345 已提交
164
	log.NewInfo(req.OperationID, "GetAllUserID args ", req.String())
programor_guo's avatar
programor_guo 已提交
165
	if !token_verify.IsMangerUserID(req.OpUserID) {
W
wenxu12345 已提交
166 167 168 169 170 171 172 173 174 175 176 177 178 179
		log.NewError(req.OperationID, "IsMangerUserID false ", req.OpUserID)
		return &pbUser.GetAllUserIDResp{CommonResp: &pbUser.CommonResp{ErrCode: constant.ErrAccess.ErrCode, ErrMsg: constant.ErrAccess.ErrMsg}}, nil
	}
	uidList, err := imdb.SelectAllUserID()
	if err != nil {
		log.NewError(req.OperationID, "SelectAllUserID false ", err.Error())
		return &pbUser.GetAllUserIDResp{CommonResp: &pbUser.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}}, nil
	} else {
		log.NewInfo(req.OperationID, "GetAllUserID rpc return ", pbUser.GetAllUserIDResp{CommonResp: &pbUser.CommonResp{}, UserIDList: uidList})
		return &pbUser.GetAllUserIDResp{CommonResp: &pbUser.CommonResp{}, UserIDList: uidList}, nil
	}
}

func (s *userServer) AccountCheck(_ context.Context, req *pbUser.AccountCheckReq) (*pbUser.AccountCheckResp, error) {
W
wenxu12345 已提交
180
	log.NewInfo(req.OperationID, "AccountCheck args ", req.String())
programor_guo's avatar
programor_guo 已提交
181
	if !token_verify.IsMangerUserID(req.OpUserID) {
W
wenxu12345 已提交
182 183 184 185
		log.NewError(req.OperationID, "IsMangerUserID false ", req.OpUserID)
		return &pbUser.AccountCheckResp{CommonResp: &pbUser.CommonResp{ErrCode: constant.ErrAccess.ErrCode, ErrMsg: constant.ErrAccess.ErrMsg}}, nil
	}
	uidList, err := imdb.SelectSomeUserID(req.CheckUserIDList)
programor_guo's avatar
programor_guo 已提交
186
	log.NewDebug(req.OperationID, "from db uid list is:", uidList)
W
wenxu12345 已提交
187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209
	if err != nil {
		log.NewError(req.OperationID, "SelectSomeUserID failed ", err.Error(), req.CheckUserIDList)
		return &pbUser.AccountCheckResp{CommonResp: &pbUser.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}}, nil
	} else {
		var r []*pbUser.AccountCheckResp_SingleUserStatus
		for _, v := range req.CheckUserIDList {
			temp := new(pbUser.AccountCheckResp_SingleUserStatus)
			temp.UserID = v
			if utils.IsContain(v, uidList) {
				temp.AccountStatus = constant.Registered
			} else {
				temp.AccountStatus = constant.UnRegistered
			}
			r = append(r, temp)
		}
		resp := pbUser.AccountCheckResp{CommonResp: &pbUser.CommonResp{ErrCode: 0, ErrMsg: ""}, ResultList: r}
		log.NewInfo(req.OperationID, "AccountCheck rpc return ", resp.String())
		return &resp, nil
	}

}

func (s *userServer) UpdateUserInfo(ctx context.Context, req *pbUser.UpdateUserInfoReq) (*pbUser.UpdateUserInfoResp, error) {
W
wenxu12345 已提交
210 211
	log.NewInfo(req.OperationID, "UpdateUserInfo args ", req.String())
	if !token_verify.CheckAccess(req.OpUserID, req.UserInfo.UserID) {
W
wenxu12345 已提交
212 213 214 215
		log.NewError(req.OperationID, "CheckAccess false ", req.OpUserID, req.UserInfo.UserID)
		return &pbUser.UpdateUserInfoResp{CommonResp: &pbUser.CommonResp{ErrCode: constant.ErrAccess.ErrCode, ErrMsg: constant.ErrAccess.ErrMsg}}, nil
	}

W
wenxu12345 已提交
216
	var user db.User
W
wenxu12345 已提交
217
	utils.CopyStructFields(&user, req.UserInfo)
W
wenxu12345 已提交
218
	if req.UserInfo.Birth != 0 {
W
wenxu12345 已提交
219
		user.Birth = utils.UnixSecondToTime(int64(req.UserInfo.Birth))
W
wenxu12345 已提交
220
	}
W
wenxu12345 已提交
221 222 223 224 225 226 227 228
	err := imdb.UpdateUserInfo(user)
	if err != nil {
		log.NewError(req.OperationID, "UpdateUserInfo failed ", err.Error(), user)
		return &pbUser.UpdateUserInfoResp{CommonResp: &pbUser.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}}, nil
	}
	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImFriendName)
	client := pbFriend.NewFriendClient(etcdConn)
	newReq := &pbFriend.GetFriendListReq{
W
wenxu12345 已提交
229
		CommID: &pbFriend.CommID{OperationID: req.OperationID, FromUserID: req.UserInfo.UserID, OpUserID: req.OpUserID},
W
wenxu12345 已提交
230 231 232 233 234 235 236
	}

	RpcResp, err := client.GetFriendList(context.Background(), newReq)
	if err != nil {
		log.NewError(req.OperationID, "GetFriendList failed ", err.Error(), newReq)
		return &pbUser.UpdateUserInfoResp{CommonResp: &pbUser.CommonResp{}}, nil
	}
W
wenxu12345 已提交
237
	for _, v := range RpcResp.FriendInfoList {
W
wenxu12345 已提交
238 239
		chat.FriendInfoChangedNotification(req.OperationID, req.OpUserID, req.UserInfo.UserID, v.FriendUser.UserID)
	}
W
wenxu12345 已提交
240
	chat.SelfInfoUpdatedNotification(req.OperationID, req.UserInfo.UserID, req.OpUserID)
W
wenxu12345 已提交
241 242
	return &pbUser.UpdateUserInfoResp{CommonResp: &pbUser.CommonResp{}}, nil
}