复制项目
This commit is contained in:
147
internal/rpc/admin/user.go
Normal file
147
internal/rpc/admin/user.go
Normal file
@@ -0,0 +1,147 @@
|
||||
// Copyright © 2023 OpenIM open source community. All rights reserved.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package admin
|
||||
|
||||
import (
|
||||
"context"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"git.imall.cloud/openim/protocol/wrapperspb"
|
||||
"github.com/openimsdk/tools/utils/datautil"
|
||||
|
||||
"git.imall.cloud/openim/chat/pkg/common/db/dbutil"
|
||||
admindb "git.imall.cloud/openim/chat/pkg/common/db/table/admin"
|
||||
"git.imall.cloud/openim/chat/pkg/common/mctx"
|
||||
"git.imall.cloud/openim/chat/pkg/protocol/admin"
|
||||
"git.imall.cloud/openim/chat/pkg/protocol/chat"
|
||||
"github.com/openimsdk/tools/errs"
|
||||
"github.com/openimsdk/tools/mcontext"
|
||||
)
|
||||
|
||||
func (o *adminServer) CancellationUser(ctx context.Context, req *admin.CancellationUserReq) (*admin.CancellationUserResp, error) {
|
||||
if _, err := mctx.CheckAdmin(ctx); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
empty := wrapperspb.String("")
|
||||
update := &chat.UpdateUserInfoReq{UserID: req.UserID, Account: empty, AreaCode: empty, PhoneNumber: empty, Email: empty}
|
||||
if err := o.Chat.UpdateUser(ctx, update); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &admin.CancellationUserResp{}, nil
|
||||
}
|
||||
|
||||
func (o *adminServer) BlockUser(ctx context.Context, req *admin.BlockUserReq) (*admin.BlockUserResp, error) {
|
||||
_, err := mctx.CheckAdmin(ctx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
_, err = o.Database.GetBlockInfo(ctx, req.UserID)
|
||||
if err == nil {
|
||||
return nil, errs.ErrArgs.WrapMsg("user already blocked")
|
||||
} else if !dbutil.IsDBNotFound(err) {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
t := &admindb.ForbiddenAccount{
|
||||
UserID: req.UserID,
|
||||
Reason: req.Reason,
|
||||
OperatorUserID: mcontext.GetOpUserID(ctx),
|
||||
CreateTime: time.Now(),
|
||||
}
|
||||
if err := o.Database.BlockUser(ctx, []*admindb.ForbiddenAccount{t}); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &admin.BlockUserResp{}, nil
|
||||
}
|
||||
|
||||
func (o *adminServer) UnblockUser(ctx context.Context, req *admin.UnblockUserReq) (*admin.UnblockUserResp, error) {
|
||||
if _, err := mctx.CheckAdmin(ctx); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if len(req.UserIDs) == 0 {
|
||||
return nil, errs.ErrArgs.WrapMsg("empty user id")
|
||||
}
|
||||
if datautil.Duplicate(req.UserIDs) {
|
||||
return nil, errs.ErrArgs.WrapMsg("duplicate user id")
|
||||
}
|
||||
bs, err := o.Database.FindBlockInfo(ctx, req.UserIDs)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if len(req.UserIDs) != len(bs) {
|
||||
ids := datautil.Single(req.UserIDs, datautil.Slice(bs, func(info *admindb.ForbiddenAccount) string { return info.UserID }))
|
||||
return nil, errs.ErrArgs.WrapMsg("user not blocked " + strings.Join(ids, ", "))
|
||||
}
|
||||
if err := o.Database.DelBlockUser(ctx, req.UserIDs); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &admin.UnblockUserResp{}, nil
|
||||
}
|
||||
|
||||
func (o *adminServer) SearchBlockUser(ctx context.Context, req *admin.SearchBlockUserReq) (*admin.SearchBlockUserResp, error) {
|
||||
if _, err := mctx.CheckAdmin(ctx); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
total, infos, err := o.Database.SearchBlockUser(ctx, req.Keyword, req.Pagination)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
userIDs := datautil.Slice(infos, func(info *admindb.ForbiddenAccount) string { return info.UserID })
|
||||
userMap, err := o.Chat.MapUserFullInfo(ctx, userIDs)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
users := make([]*admin.BlockUserInfo, 0, len(infos))
|
||||
for _, info := range infos {
|
||||
user := &admin.BlockUserInfo{
|
||||
UserID: info.UserID,
|
||||
Reason: info.Reason,
|
||||
OpUserID: info.OperatorUserID,
|
||||
CreateTime: info.CreateTime.UnixMilli(),
|
||||
}
|
||||
if userFull := userMap[info.UserID]; userFull != nil {
|
||||
user.Account = userFull.Account
|
||||
user.PhoneNumber = userFull.PhoneNumber
|
||||
user.AreaCode = userFull.AreaCode
|
||||
user.Email = userFull.Email
|
||||
user.Nickname = userFull.Nickname
|
||||
user.FaceURL = userFull.FaceURL
|
||||
user.Gender = userFull.Gender
|
||||
}
|
||||
users = append(users, user)
|
||||
}
|
||||
return &admin.SearchBlockUserResp{Total: uint32(total), Users: users}, nil
|
||||
}
|
||||
|
||||
func (o *adminServer) FindUserBlockInfo(ctx context.Context, req *admin.FindUserBlockInfoReq) (*admin.FindUserBlockInfoResp, error) {
|
||||
if _, err := mctx.CheckAdmin(ctx); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
list, err := o.Database.FindBlockUser(ctx, req.UserIDs)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
blocks := make([]*admin.BlockInfo, 0, len(list))
|
||||
for _, info := range list {
|
||||
blocks = append(blocks, &admin.BlockInfo{
|
||||
UserID: info.UserID,
|
||||
Reason: info.Reason,
|
||||
OpUserID: info.OperatorUserID,
|
||||
CreateTime: info.CreateTime.UnixMilli(),
|
||||
})
|
||||
}
|
||||
return &admin.FindUserBlockInfoResp{Blocks: blocks}, nil
|
||||
}
|
||||
Reference in New Issue
Block a user