user.go 14.4 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
	pbUser "Open_IM/pkg/proto/user"
	"Open_IM/pkg/utils"
	"context"
W
cms  
wangchuxiao 已提交
17 18
	"fmt"
	"google.golang.org/grpc"
W
wenxu12345 已提交
19 20 21 22 23 24 25 26 27 28 29 30
	"net"
	"strconv"
	"strings"
)

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

W
wenxu12345 已提交
31 32 33 34 35 36 37 38 39 40
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 已提交
41 42 43 44 45 46 47 48 49 50 51
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 已提交
52
	log.NewInfo("0", "listen network success, address ", registerAddress, listener)
W
wenxu12345 已提交
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
	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 已提交
69
	log.NewInfo("0", "rpc  user success")
W
wenxu12345 已提交
70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
}

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 已提交
90 91
	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 已提交
92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
}

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 已提交
108
		resp.ConversationOptResultList = append(resp.ConversationOptResultList, &pbUser.OptResult{ConversationID: v, Result: req.Opt})
W
wenxu12345 已提交
109 110 111 112 113 114 115
	}
	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 已提交
116
	m, err := db.DB.GetMultiConversationMsgOpt(req.FromUserID, req.ConversationIDList)
W
wenxu12345 已提交
117
	if err != nil {
programor_guo's avatar
programor_guo 已提交
118
		log.NewError(req.OperationID, "GetMultiConversationMsgOpt failed ", err.Error(), req.FromUserID, req.ConversationIDList)
W
wenxu12345 已提交
119 120 121 122
		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 已提交
123
		resp.ConversationOptResultList = append(resp.ConversationOptResultList, &pbUser.OptResult{ConversationID: k, Result: int32(v)})
W
wenxu12345 已提交
124 125 126 127 128 129 130
	}
	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 已提交
131
	m, err := db.DB.GetAllConversationMsgOpt(req.FromUserID)
W
wenxu12345 已提交
132
	if err != nil {
programor_guo's avatar
programor_guo 已提交
133
		log.NewError(req.OperationID, "GetAllConversationMsgOpt failed ", err.Error(), req.FromUserID)
W
wenxu12345 已提交
134 135 136 137
		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 已提交
138
		resp.ConversationOptResultList = append(resp.ConversationOptResultList, &pbUser.OptResult{ConversationID: k, Result: int32(v)})
W
wenxu12345 已提交
139 140 141 142 143 144
	}
	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 已提交
145
	if !token_verify.IsMangerUserID(req.OpUserID) {
W
wenxu12345 已提交
146 147 148 149 150 151
		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 已提交
152 153
		i := imdb.DeleteUser(userID)
		if i == 0 {
programor_guo's avatar
err log  
programor_guo 已提交
154
			log.NewError(req.OperationID, "delete user error", userID)
W
wenxu12345 已提交
155 156 157 158 159 160 161 162 163 164
			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 已提交
165
	log.NewInfo(req.OperationID, "GetAllUserID args ", req.String())
programor_guo's avatar
programor_guo 已提交
166
	if !token_verify.IsMangerUserID(req.OpUserID) {
W
wenxu12345 已提交
167 168 169 170 171 172 173 174 175 176 177 178 179 180
		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 已提交
181
	log.NewInfo(req.OperationID, "AccountCheck args ", req.String())
programor_guo's avatar
programor_guo 已提交
182
	if !token_verify.IsMangerUserID(req.OpUserID) {
W
wenxu12345 已提交
183 184 185 186
		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 已提交
187
	log.NewDebug(req.OperationID, "from db uid list is:", uidList)
W
wenxu12345 已提交
188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210
	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 已提交
211 212
	log.NewInfo(req.OperationID, "UpdateUserInfo args ", req.String())
	if !token_verify.CheckAccess(req.OpUserID, req.UserInfo.UserID) {
W
wenxu12345 已提交
213 214 215 216
		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
cms  
wangchuxiao 已提交
217
	var user db.Users
W
wenxu12345 已提交
218
	utils.CopyStructFields(&user, req.UserInfo)
W
wenxu12345 已提交
219
	if req.UserInfo.Birth != 0 {
W
wenxu12345 已提交
220
		user.Birth = utils.UnixSecondToTime(int64(req.UserInfo.Birth))
W
wenxu12345 已提交
221
	}
W
wenxu12345 已提交
222 223 224 225 226 227 228 229
	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 已提交
230
		CommID: &pbFriend.CommID{OperationID: req.OperationID, FromUserID: req.UserInfo.UserID, OpUserID: req.OpUserID},
W
wenxu12345 已提交
231 232 233 234 235 236 237
	}

	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 已提交
238
	for _, v := range RpcResp.FriendInfoList {
W
wenxu12345 已提交
239
		chat.UserInfoUpdatedNotification(req.OperationID, req.UserInfo.UserID, v.FriendUser.UserID)
W
wenxu12345 已提交
240
	}
W
wenxu12345 已提交
241
	chat.UserInfoUpdatedNotification(req.OperationID, req.UserInfo.UserID, req.OpUserID)
W
wenxu12345 已提交
242 243
	return &pbUser.UpdateUserInfoResp{CommonResp: &pbUser.CommonResp{}}, nil
}
W
cms  
wangchuxiao 已提交
244 245

func (s *userServer) GetUser(ctx context.Context, req *pbUser.GetUserReq) (*pbUser.GetUserResp, error) {
W
cms  
wangchuxiao 已提交
246 247
	log.NewInfo(req.OperationID, "GetUser args ", req.String())
	resp := &pbUser.GetUserResp{User:&pbUser.User{}}
W
cms  
wangchuxiao 已提交
248 249 250 251
	user, err := imdb.GetUserByUserID(req.UserId)
	if err != nil {
		return resp, nil
	}
W
cms  
wangchuxiao 已提交
252 253 254 255 256 257
	resp.User = &pbUser.User{
		ProfilePhoto: user.FaceURL,
		Nickname:     user.Nickname,
		UserId:       user.UserID,
		CreateTime:   user.CreateTime.String(),
	}
W
cms  
wangchuxiao 已提交
258 259 260 261 262
	return resp, nil
}

func (s *userServer) GetUsers(ctx context.Context, req *pbUser.GetUsersReq) (*pbUser.GetUsersResp, error) {
	log.NewInfo(req.OperationID, "GetUsers args ", req.String())
W
cms  
wangchuxiao 已提交
263
	resp := &pbUser.GetUsersResp{User:[]*pbUser.User{}}
W
cms  
wangchuxiao 已提交
264 265 266 267
	users, err := imdb.GetUsers(req.Pagination.ShowNumber, req.Pagination.PageNumber)
	if err != nil {
		return resp, nil
	}
W
cms  
wangchuxiao 已提交
268 269 270 271 272
	usersNum, err := imdb.GetUsersNumCount()
	if err != nil {
		return resp, nil
	}
	resp.UserNum = int32(usersNum)
W
cms  
wangchuxiao 已提交
273
	for _, v := range users {
W
cms  
wangchuxiao 已提交
274 275 276 277 278 279 280 281 282 283 284
		isBlock, err := imdb.UserIsBlock(v.UserID)
		if err == nil {
			user := &pbUser.User{
				ProfilePhoto: v.FaceURL,
				UserId:       v.UserID,
				CreateTime:   v.CreateTime.String(),
				Nickname:     v.Nickname,
				IsBlock:	isBlock,
			}
			resp.User = append(resp.User, user)
		}
W
cms  
wangchuxiao 已提交
285
	}
W
cms  
wangchuxiao 已提交
286 287 288 289

	resp.Pagination = &sdkws.ResponsePagination{}
	resp.Pagination.ShowNumber = req.Pagination.ShowNumber
	resp.Pagination.CurrentPage = req.Pagination.PageNumber
W
cms  
wangchuxiao 已提交
290 291 292 293 294 295 296 297 298
	return resp, nil
}

func (s *userServer) ResignUser(ctx context.Context, req *pbUser.ResignUserReq) (*pbUser.ResignUserResp, error) {
	log.NewInfo(req.OperationID, "ResignUser args ", req.String())
	return &pbUser.ResignUserResp{}, nil
}

func (s *userServer) AlterUser(ctx context.Context, req *pbUser.AlterUserReq) (*pbUser.AlterUserResp, error) {
W
cms  
wangchuxiao 已提交
299
	log.NewInfo(req.OperationID, "AlterUser args ", req.String())
W
cms  
wangchuxiao 已提交
300 301 302 303
	return &pbUser.AlterUserResp{}, nil
}

func (s *userServer) AddUser(ctx context.Context, req *pbUser.AddUserReq) (*pbUser.AddUserResp, error) {
W
cms  
wangchuxiao 已提交
304 305 306 307 308 309 310
	log.NewInfo(req.OperationID, "AddUser args ", req.String())
	resp := &pbUser.AddUserResp{}
	err := imdb.AddUser(req.UserId, req.PhoneNumber, req.Name)
	if err != nil {
		return resp, constant.ErrDB
	}
	return resp, nil
W
cms  
wangchuxiao 已提交
311 312 313
}

func (s *userServer) BlockUser(ctx context.Context, req *pbUser.BlockUserReq) (*pbUser.BlockUserResp, error) {
W
cms  
wangchuxiao 已提交
314 315 316 317 318 319 320 321
	log.NewInfo(req.OperationID, "BlockUser args ", req.String())
	fmt.Println("BlockUser args ", req.String())
	resp := &pbUser.BlockUserResp{}
	err := imdb.BlockUser(req.UserId, req.EndDisableTime)
	if err != nil {
		return resp, constant.ErrDB
	}
	return resp, nil
W
cms  
wangchuxiao 已提交
322 323 324
}

func (s *userServer) UnBlockUser(ctx context.Context, req *pbUser.UnBlockUserReq) (*pbUser.UnBlockUserResp, error) {
W
cms  
wangchuxiao 已提交
325 326 327 328 329 330 331 332
	log.NewInfo(req.OperationID, "UnBlockUser args ", req.String())
	fmt.Println(req.UserId)
	resp := &pbUser.UnBlockUserResp{}
	err := imdb.UnBlockUser(req.UserId)
	if err != nil {
		return resp, constant.ErrDB
	}
	return resp, nil
W
cms  
wangchuxiao 已提交
333 334 335
}

func (s *userServer) GetBlockUsers(ctx context.Context, req *pbUser.GetBlockUsersReq) (*pbUser.GetBlockUsersResp, error) {
W
cms  
wangchuxiao 已提交
336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363
	log.NewInfo(req.OperationID, "GetBlockUsers args ", req.String())
	resp := &pbUser.GetBlockUsersResp{}
	blockUserIds, err := imdb.GetBlockUsersID(req.Pagination.ShowNumber, req.Pagination.PageNumber)
	if err != nil {
		return resp, constant.ErrDB
	}
	usersNum, err := imdb.GetBlockUsersNumCount()
	if err != nil {
		return resp, constant.ErrDB
	}
	resp.BlockUserNum = int32(usersNum)
	blockUsers, err := imdb.GetBlockUsers(blockUserIds)
	if err != nil {
		return resp, constant.ErrDB
	}
	for _, v := range blockUsers {
		resp.User = append(resp.User, &pbUser.User{
			ProfilePhoto: v.FaceURL,
			Nickname:     v.Nickname,
			UserId:       v.UserID,
			CreateTime:   v.CreateTime.String(),
			IsBlock:      true,
		})
	}
	resp.Pagination = &sdkws.ResponsePagination{}
	resp.Pagination.ShowNumber = req.Pagination.ShowNumber
	resp.Pagination.CurrentPage = req.Pagination.PageNumber
	return resp, nil
W
cms  
wangchuxiao 已提交
364
}