You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Open-IM-Server/internal/rpc/user/user.go

193 lines
5.8 KiB

3 years ago
package user
import (
2 years ago
"OpenIM/internal/common/check"
"OpenIM/internal/common/convert"
"OpenIM/internal/common/notification"
"OpenIM/pkg/common/config"
"OpenIM/pkg/common/constant"
"OpenIM/pkg/common/db/controller"
"OpenIM/pkg/common/db/relation"
tablerelation "OpenIM/pkg/common/db/table/relation"
"OpenIM/pkg/common/tokenverify"
"OpenIM/pkg/common/tracelog"
registry "OpenIM/pkg/discoveryregistry"
2 years ago
"OpenIM/pkg/errs"
2 years ago
"OpenIM/pkg/proto/sdkws"
pbuser "OpenIM/pkg/proto/user"
"OpenIM/pkg/utils"
3 years ago
"context"
3 years ago
"google.golang.org/grpc"
3 years ago
)
type userServer struct {
controller.UserDatabase
notification *notification.Check
userCheck *check.UserCheck
ConversationChecker *check.ConversationChecker
RegisterCenter registry.SvcDiscoveryRegistry
friendCheck *check.FriendChecker
3 years ago
}
2 years ago
func Start(client registry.SvcDiscoveryRegistry, server *grpc.Server) error {
2 years ago
db, err := relation.NewGormDB()
if err != nil {
return err
}
2 years ago
if err := db.AutoMigrate(&tablerelation.UserModel{}); err != nil {
return err
}
users := make([]*tablerelation.UserModel, 0)
if len(config.Config.Manager.AppManagerUid) != len(config.Config.Manager.Nickname) {
2 years ago
return errs.ErrConfig.Wrap("len(config.Config.Manager.AppManagerUid) != len(config.Config.Manager.Nickname)")
}
for k, v := range config.Config.Manager.AppManagerUid {
users = append(users, &tablerelation.UserModel{UserID: v, Nickname: config.Config.Manager.Nickname[k]})
}
2 years ago
u := &userServer{
2 years ago
UserDatabase: controller.NewUserDatabase(relation.NewUserGorm(db)),
2 years ago
notification: notification.NewCheck(client),
userCheck: check.NewUserCheck(client),
RegisterCenter: client,
}
pbuser.RegisterUserServer(server, u)
2 years ago
return u.UserDatabase.InitOnce(context.Background(), users)
3 years ago
}
// ok
func (s *userServer) GetDesignateUsers(ctx context.Context, req *pbuser.GetDesignateUsersReq) (resp *pbuser.GetDesignateUsersResp, err error) {
resp = &pbuser.GetDesignateUsersResp{}
users, err := s.FindWithError(ctx, req.UserIDs)
if err != nil {
return nil, err
}
resp.UsersInfo, err = (*convert.DBUser)(nil).DB2PB(users)
if err != nil {
return nil, err
}
return resp, nil
3 years ago
}
// ok
func (s *userServer) UpdateUserInfo(ctx context.Context, req *pbuser.UpdateUserInfoReq) (resp *pbuser.UpdateUserInfoResp, err error) {
resp = &pbuser.UpdateUserInfoResp{}
2 years ago
err = tokenverify.CheckAccessV3(ctx, req.UserInfo.UserID)
if err != nil {
return nil, err
3 years ago
}
user, err := convert.NewPBUser(req.UserInfo).Convert()
2 years ago
if err != nil {
return nil, err
3 years ago
}
err = s.Update(ctx, []*tablerelation.UserModel{user})
if err != nil {
return nil, err
}
2 years ago
friends, err := s.friendCheck.GetFriendIDs(ctx, req.UserInfo.UserID)
3 years ago
if err != nil {
return nil, err
2 years ago
}
go func() {
for _, v := range friends {
2 years ago
s.notification.FriendInfoUpdatedNotification(ctx, req.UserInfo.UserID, v, tracelog.GetOpUserID(ctx))
}
}()
s.notification.UserInfoUpdatedNotification(ctx, tracelog.GetOpUserID(ctx), req.UserInfo.UserID)
return resp, nil
3 years ago
}
3 years ago
// ok
func (s *userServer) SetGlobalRecvMessageOpt(ctx context.Context, req *pbuser.SetGlobalRecvMessageOptReq) (resp *pbuser.SetGlobalRecvMessageOptResp, err error) {
resp = &pbuser.SetGlobalRecvMessageOptResp{}
if _, err := s.FindWithError(ctx, []string{req.UserID}); err != nil {
return nil, err
}
m := make(map[string]interface{}, 1)
m["global_recv_msg_opt"] = req.GlobalRecvMsgOpt
if err := s.UpdateByMap(ctx, req.UserID, m); err != nil {
return nil, err
}
s.notification.UserInfoUpdatedNotification(ctx, req.UserID, req.UserID)
return resp, nil
}
// ok
func (s *userServer) AccountCheck(ctx context.Context, req *pbuser.AccountCheckReq) (resp *pbuser.AccountCheckResp, err error) {
resp = &pbuser.AccountCheckResp{}
if utils.Duplicate(req.CheckUserIDs) {
2 years ago
return nil, errs.ErrArgs.Wrap("userID repeated")
}
2 years ago
err = tokenverify.CheckAdmin(ctx)
if err != nil {
return nil, err
}
users, err := s.Find(ctx, req.CheckUserIDs)
if err != nil {
return nil, err
}
userIDs := make(map[string]interface{}, 0)
for _, v := range users {
userIDs[v.UserID] = nil
}
for _, v := range req.CheckUserIDs {
temp := &pbuser.AccountCheckRespSingleUserStatus{UserID: v}
if _, ok := userIDs[v]; ok {
temp.AccountStatus = constant.Registered
} else {
temp.AccountStatus = constant.UnRegistered
}
resp.Results = append(resp.Results, temp)
}
return resp, nil
}
// ok
func (s *userServer) GetPaginationUsers(ctx context.Context, req *pbuser.GetPaginationUsersReq) (resp *pbuser.GetPaginationUsersResp, err error) {
resp = &pbuser.GetPaginationUsersResp{}
usersDB, total, err := s.Page(ctx, req.Pagination.PageNumber, req.Pagination.ShowNumber)
if err != nil {
return nil, err
2 years ago
}
resp.Total = int32(total)
resp.Users, err = (*convert.DBUser)(nil).DB2PB(usersDB)
return resp, nil
3 years ago
}
// ok
func (s *userServer) UserRegister(ctx context.Context, req *pbuser.UserRegisterReq) (resp *pbuser.UserRegisterResp, err error) {
resp = &pbuser.UserRegisterResp{}
2 years ago
if utils.DuplicateAny(req.Users, func(e *sdkws.UserInfo) string { return e.UserID }) {
2 years ago
return nil, errs.ErrArgs.Wrap("userID repeated")
}
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 {
2 years ago
return nil, errs.ErrRegisteredAlready.Wrap("userID registered already")
}
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
}
return resp, nil
}
func (s *userServer) GetGlobalRecvMessageOpt(ctx context.Context, req *pbuser.GetGlobalRecvMessageOptReq) (resp *pbuser.GetGlobalRecvMessageOptResp, err error) {
resp = &pbuser.GetGlobalRecvMessageOptResp{}
user, err := s.FindWithError(ctx, []string{req.UserID})
if err != nil {
return nil, err
}
resp.GlobalRecvMsgOpt = user[0].GlobalRecvMsgOpt
return resp, nil
}