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

229 lines
7.5 KiB
Go
Raw Normal View History

2021-12-27 16:48:05 +08:00
package user
import (
"context"
2023-05-06 18:51:10 +08:00
"strings"
2023-03-24 14:47:57 +08:00
"time"
2023-03-17 19:54:23 +08:00
2023-03-16 10:46:06 +08:00
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/config"
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/constant"
2023-04-26 11:19:49 +08:00
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/convert"
2023-03-28 19:24:59 +08:00
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/cache"
2023-03-16 10:46:06 +08:00
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/controller"
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/relation"
tablerelation "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/table/relation"
2023-03-28 19:24:59 +08:00
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/tx"
2023-03-21 12:28:21 +08:00
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/mcontext"
2023-03-16 10:46:06 +08:00
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/tokenverify"
registry "github.com/OpenIMSDK/Open-IM-Server/pkg/discoveryregistry"
"github.com/OpenIMSDK/Open-IM-Server/pkg/errs"
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/sdkws"
pbuser "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/user"
2023-04-23 19:50:42 +08:00
"github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient"
2023-04-26 11:19:49 +08:00
"github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient/notification"
2023-03-16 10:46:06 +08:00
"github.com/OpenIMSDK/Open-IM-Server/pkg/utils"
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-22 12:17:59 +08:00
controller.UserDatabase
2023-04-23 19:50:42 +08:00
notificationSender *notification.FriendNotificationSender
friendRpcClient *rpcclient.FriendClient
RegisterCenter registry.SvcDiscoveryRegistry
2021-12-27 16:48:05 +08:00
}
2023-03-02 12:00:31 +08:00
func Start(client registry.SvcDiscoveryRegistry, server *grpc.Server) error {
2023-03-03 17:42:26 +08:00
db, err := relation.NewGormDB()
2023-01-29 14:47:21 +08:00
if err != nil {
2023-02-14 19:34:19 +08:00
return err
2023-01-29 14:47:21 +08:00
}
2023-03-28 19:24:59 +08:00
rdb, err := cache.NewRedis()
if err != nil {
return err
}
2023-03-03 17:42:26 +08:00
if err := db.AutoMigrate(&tablerelation.UserModel{}); err != nil {
2023-02-14 19:34:19 +08:00
return err
2023-01-29 14:47:21 +08:00
}
2023-02-21 16:48:10 +08:00
users := make([]*tablerelation.UserModel, 0)
if len(config.Config.Manager.AppManagerUid) != len(config.Config.Manager.Nickname) {
2023-03-07 12:19:30 +08:00
return errs.ErrConfig.Wrap("len(config.Config.Manager.AppManagerUid) != len(config.Config.Manager.Nickname)")
2023-02-21 16:48:10 +08:00
}
for k, v := range config.Config.Manager.AppManagerUid {
users = append(users, &tablerelation.UserModel{UserID: v, Nickname: config.Config.Manager.Nickname[k]})
}
2023-03-28 19:24:59 +08:00
userDB := relation.NewUserGorm(db)
cache := cache.NewUserCacheRedis(rdb, userDB, cache.GetDefaultOpt())
2023-04-23 19:50:42 +08:00
database := controller.NewUserDatabase(userDB, cache, tx.NewGorm(db))
2023-03-02 12:00:31 +08:00
u := &userServer{
2023-04-23 19:50:42 +08:00
UserDatabase: database,
RegisterCenter: client,
friendRpcClient: rpcclient.NewFriendClient(client),
notificationSender: notification.NewFriendNotificationSender(client, notification.WithDBFunc(database.FindWithError)),
2023-03-02 12:00:31 +08:00
}
pbuser.RegisterUserServer(server, u)
2023-03-03 17:42:26 +08:00
return u.UserDatabase.InitOnce(context.Background(), users)
2021-12-28 15:33:47 +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-04-23 19:50:42 +08:00
resp.UsersInfo = convert.UsersDB2Pb(users)
2023-01-31 20:33:33 +08:00
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 10:58:30 +08:00
// 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-04-23 19:50:42 +08:00
user := convert.UserPb2DB(req.UserInfo)
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-03-16 12:07:21 +08:00
err = s.Update(ctx, user)
2023-01-29 14:47:21 +08:00
if err != nil {
return nil, err
}
2023-04-23 19:50:42 +08:00
friends, err := s.friendRpcClient.GetFriendIDs(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-04-23 19:50:42 +08:00
s.notificationSender.FriendInfoUpdatedNotification(ctx, req.UserInfo.UserID, v, mcontext.GetOpUserID(ctx))
2023-01-30 10:40:27 +08:00
}
}()
2023-04-23 19:50:42 +08:00
s.notificationSender.UserInfoUpdatedNotification(ctx, mcontext.GetOpUserID(ctx), req.UserInfo.UserID)
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-04-23 19:50:42 +08:00
s.notificationSender.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) {
2023-03-07 12:19:30 +08:00
return nil, errs.ErrArgs.Wrap("userID repeated")
2023-02-09 10:58:30 +08:00
}
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) {
2023-04-23 19:50:42 +08:00
var pageNumber, showNumber int32
if req.Pagination != nil {
pageNumber = req.Pagination.PageNumber
showNumber = req.Pagination.ShowNumber
}
users, total, err := s.Page(ctx, pageNumber, 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-04-23 19:50:42 +08:00
return &pbuser.GetPaginationUsersResp{Total: int32(total), Users: convert.UsersDB2Pb(users)}, err
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-03-24 14:47:57 +08:00
if len(req.Users) == 0 {
return nil, errs.ErrArgs.Wrap("users is empty")
}
2023-02-09 20:36:34 +08:00
if utils.DuplicateAny(req.Users, func(e *sdkws.UserInfo) string { return e.UserID }) {
2023-03-07 12:19:30 +08:00
return nil, errs.ErrArgs.Wrap("userID repeated")
2023-02-07 20:28:34 +08:00
}
2023-01-31 20:33:33 +08:00
userIDs := make([]string, 0)
2023-03-24 14:47:57 +08:00
for _, user := range req.Users {
if user.UserID == "" {
return nil, errs.ErrArgs.Wrap("userID is empty")
}
2023-05-06 18:51:10 +08:00
if strings.Contains(user.UserID, ":") {
return nil, errs.ErrArgs.Wrap("userID contains ':' is invalid userID")
}
2023-03-24 14:47:57 +08:00
userIDs = append(userIDs, user.UserID)
2023-01-31 20:33:33 +08:00
}
exist, err := s.IsExist(ctx, userIDs)
if err != nil {
return nil, err
}
if exist {
2023-03-07 12:19:30 +08:00
return nil, errs.ErrRegisteredAlready.Wrap("userID registered already")
2023-01-31 20:33:33 +08:00
}
2023-03-24 14:47:57 +08:00
now := time.Now()
users := make([]*tablerelation.UserModel, 0, len(req.Users))
for _, user := range req.Users {
users = append(users, &tablerelation.UserModel{
UserID: user.UserID,
Nickname: user.Nickname,
FaceURL: user.FaceURL,
Ex: user.Ex,
CreateTime: now,
AppMangerLevel: user.AppMangerLevel,
GlobalRecvMsgOpt: user.GlobalRecvMsgOpt,
})
}
if err := s.Create(ctx, users); err != nil {
2023-01-31 20:33:33 +08:00
return nil, err
}
2023-02-07 20:28:34 +08:00
return resp, nil
2023-01-31 20:33:33 +08:00
}
2023-02-20 11:45:11 +08:00
func (s *userServer) GetGlobalRecvMessageOpt(ctx context.Context, req *pbuser.GetGlobalRecvMessageOptReq) (resp *pbuser.GetGlobalRecvMessageOptResp, err error) {
user, err := s.FindWithError(ctx, []string{req.UserID})
if err != nil {
return nil, err
}
2023-04-23 19:50:42 +08:00
return &pbuser.GetGlobalRecvMessageOptResp{GlobalRecvMsgOpt: user[0].GlobalRecvMsgOpt}, nil
2023-02-20 11:45:11 +08:00
}
2023-03-17 19:54:23 +08:00
func (s *userServer) GetAllUserID(ctx context.Context, req *pbuser.GetAllUserIDReq) (resp *pbuser.GetAllUserIDResp, err error) {
userIDs, err := s.UserDatabase.GetAllUserID(ctx)
if err != nil {
return nil, err
}
2023-04-23 19:50:42 +08:00
return &pbuser.GetAllUserIDResp{UserIDs: userIDs}, nil
2023-03-17 19:54:23 +08:00
}