Skip to content

Commit

Permalink
feat: add some api about admin (#303)
Browse files Browse the repository at this point in the history
* feat: add some api about admin

* feat: add some api about admin

* fix: del the unuse method

* fix: Optimized code

* fix: fix the userID
  • Loading branch information
luhaoling authored Dec 15, 2023
1 parent 2efa337 commit 9284101
Show file tree
Hide file tree
Showing 15 changed files with 3,280 additions and 1,944 deletions.
3 changes: 2 additions & 1 deletion .github/workflows/scripts-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,8 @@ jobs:
-v "/etc/localtime:/etc/localtime" \
-e MYSQL_ROOT_PASSWORD="openIM123" \
--restart always \
mysql:5.7
mysql:5.7
sleep 30;
- name: start all services
run: |
sudo cp ./config/config.yaml.template ./config/config.yaml
Expand Down
20 changes: 20 additions & 0 deletions internal/api/admin.go
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,26 @@ func (o *AdminApi) AdminInfo(c *gin.Context) {
a2r.Call(admin.AdminClient.GetAdminInfo, o.adminClient, c)
}

func (o *AdminApi) ChangeAdminPassword(c *gin.Context) {
a2r.Call(admin.AdminClient.ChangeAdminPassword, o.adminClient, c)
}

func (o *AdminApi) AddAdminAccount(c *gin.Context) {
a2r.Call(admin.AdminClient.AddAdminAccount, o.adminClient, c)
}

func (o *AdminApi) AddUserAccount(c *gin.Context) {
a2r.Call(chat.ChatClient.AddUserAccount, o.chatClient, c)
}

func (o *AdminApi) DelAdminAccount(c *gin.Context) {
a2r.Call(admin.AdminClient.DelAdminAccount, o.adminClient, c)
}

func (o *AdminApi) SearchAdminAccount(c *gin.Context) {
a2r.Call(admin.AdminClient.SearchAdminAccount, o.adminClient, c)
}

func (o *AdminApi) AddDefaultFriend(c *gin.Context) {
a2r.Call(admin.AdminClient.AddDefaultFriend, o.adminClient, c)
}
Expand Down
97 changes: 51 additions & 46 deletions internal/api/router.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,27 +34,27 @@ func NewChatRoute(router gin.IRouter, discov discoveryregistry.SvcDiscoveryRegis
mw := NewMW(adminConn)
chat := NewChat(chatConn, adminConn)
account := router.Group("/account")
account.POST("/code/send", chat.SendVerifyCode) // 发送验证码
account.POST("/code/verify", chat.VerifyCode) // 校验验证码
account.POST("/register", mw.CheckAdminOrNil, chat.RegisterUser) // 注册
account.POST("/login", chat.Login) // 登录
account.POST("/password/reset", chat.ResetPassword) // 忘记密码
account.POST("/password/change", mw.CheckToken, chat.ChangePassword) // 修改密码
account.POST("/code/send", chat.SendVerifyCode) // Send verification code
account.POST("/code/verify", chat.VerifyCode) // Verify the verification code
account.POST("/register", mw.CheckAdminOrNil, chat.RegisterUser) // Register
account.POST("/login", chat.Login) // Login
account.POST("/password/reset", chat.ResetPassword) // Forgot password
account.POST("/password/change", mw.CheckToken, chat.ChangePassword) // Change password

user := router.Group("/user", mw.CheckToken)
user.POST("/update", chat.UpdateUserInfo) // 编辑个人资料
user.POST("/find/public", chat.FindUserPublicInfo) // 获取用户公开信息
user.POST("/find/full", chat.FindUserFullInfo) // 获取用户所有信息
user.POST("/search/full", chat.SearchUserFullInfo) // 搜索用户公开信息
user.POST("/search/public", chat.SearchUserPublicInfo) // 搜索用户所有信息
user.POST("/update", chat.UpdateUserInfo) // Edit personal information
user.POST("/find/public", chat.FindUserPublicInfo) // Get user's public information
user.POST("/find/full", chat.FindUserFullInfo) // Get all information of the user
user.POST("/search/full", chat.SearchUserFullInfo) // Search user's public information
user.POST("/search/public", chat.SearchUserPublicInfo) // Search all information of the user

router.POST("/friend/search", mw.CheckToken, chat.SearchFriend)

router.Group("/applet").POST("/find", mw.CheckToken, chat.FindApplet) // 小程序列表
router.Group("/applet").POST("/find", mw.CheckToken, chat.FindApplet) // Applet list

router.Group("/client_config").POST("/get", chat.GetClientConfig) // 获取客户端初始化配置
router.Group("/client_config").POST("/get", chat.GetClientConfig) // Get client initialization configuration

router.Group("/callback").POST("/open_im", chat.OpenIMCallback) // 回调
router.Group("/callback").POST("/open_im", chat.OpenIMCallback) // Callback

logs := router.Group("/logs", mw.CheckToken)
logs.POST("/upload", chat.UploadLogs)
Expand All @@ -72,56 +72,61 @@ func NewAdminRoute(router gin.IRouter, discov discoveryregistry.SvcDiscoveryRegi
mw := NewMW(adminConn)
admin := NewAdmin(chatConn, adminConn)
adminRouterGroup := router.Group("/account")
adminRouterGroup.POST("/login", admin.AdminLogin) // 登录
adminRouterGroup.POST("/update", mw.CheckAdmin, admin.AdminUpdateInfo) // 修改信息
adminRouterGroup.POST("/info", mw.CheckAdmin, admin.AdminInfo) // 获取信息
adminRouterGroup.POST("/login", admin.AdminLogin) // Login
adminRouterGroup.POST("/update", mw.CheckAdmin, admin.AdminUpdateInfo) // Modify information
adminRouterGroup.POST("/info", mw.CheckAdmin, admin.AdminInfo) // Get information
adminRouterGroup.POST("/change_password", mw.CheckAdmin, admin.ChangeAdminPassword) // Change admin account's password
adminRouterGroup.POST("/add_admin", mw.CheckAdmin, admin.AddAdminAccount) // Add admin account
adminRouterGroup.POST("/add_user", mw.CheckAdmin, admin.AddUserAccount) // Add user account
adminRouterGroup.POST("/del_admin", mw.CheckAdmin, admin.DelAdminAccount) // Delete admin
adminRouterGroup.POST("/search", mw.CheckAdmin, admin.SearchAdminAccount) // Get admin list

defaultRouter := router.Group("/default", mw.CheckAdmin)
defaultUserRouter := defaultRouter.Group("/user")
defaultUserRouter.POST("/add", admin.AddDefaultFriend) // 添加注册时默认好友
defaultUserRouter.POST("/del", admin.DelDefaultFriend) // 删除注册时默认好友
defaultUserRouter.POST("/find", admin.FindDefaultFriend) // 默认好友列表
defaultUserRouter.POST("/search", admin.SearchDefaultFriend) // 搜索注册时默认好友列表
defaultUserRouter.POST("/add", admin.AddDefaultFriend) // Add default friend at registration
defaultUserRouter.POST("/del", admin.DelDefaultFriend) // Delete default friend at registration
defaultUserRouter.POST("/find", admin.FindDefaultFriend) // Default friend list
defaultUserRouter.POST("/search", admin.SearchDefaultFriend) // Search default friend list at registration
defaultGroupRouter := defaultRouter.Group("/group")
defaultGroupRouter.POST("/add", admin.AddDefaultGroup) // 添加注册时默认群
defaultGroupRouter.POST("/del", admin.DelDefaultGroup) // 删除注册时默认群
defaultGroupRouter.POST("/find", admin.FindDefaultGroup) // 获取注册时默认群列表
defaultGroupRouter.POST("/search", admin.SearchDefaultGroup) // 获取注册时默认群列表
defaultGroupRouter.POST("/add", admin.AddDefaultGroup) // Add default group at registration
defaultGroupRouter.POST("/del", admin.DelDefaultGroup) // Delete default group at registration
defaultGroupRouter.POST("/find", admin.FindDefaultGroup) // Get default group list at registration
defaultGroupRouter.POST("/search", admin.SearchDefaultGroup) // Search default group list at registration

invitationCodeRouter := router.Group("/invitation_code", mw.CheckAdmin)
invitationCodeRouter.POST("/add", admin.AddInvitationCode) // 添加邀请码
invitationCodeRouter.POST("/gen", admin.GenInvitationCode) // 生成邀请码
invitationCodeRouter.POST("/del", admin.DelInvitationCode) // 删除邀请码
invitationCodeRouter.POST("/search", admin.SearchInvitationCode) // 搜索邀请码
invitationCodeRouter.POST("/add", admin.AddInvitationCode) // Add invitation code
invitationCodeRouter.POST("/gen", admin.GenInvitationCode) // Generate invitation code
invitationCodeRouter.POST("/del", admin.DelInvitationCode) // Delete invitation code
invitationCodeRouter.POST("/search", admin.SearchInvitationCode) // Search invitation code

forbiddenRouter := router.Group("/forbidden", mw.CheckAdmin)
ipForbiddenRouter := forbiddenRouter.Group("/ip")
ipForbiddenRouter.POST("/add", admin.AddIPForbidden) // 添加禁止注册登录IP
ipForbiddenRouter.POST("/del", admin.DelIPForbidden) // 删除禁止注册登录IP
ipForbiddenRouter.POST("/search", admin.SearchIPForbidden) // 搜索禁止注册登录IP
ipForbiddenRouter.POST("/add", admin.AddIPForbidden) // Add forbidden IP for registration/login
ipForbiddenRouter.POST("/del", admin.DelIPForbidden) // Delete forbidden IP for registration/login
ipForbiddenRouter.POST("/search", admin.SearchIPForbidden) // Search forbidden IPs for registration/login
userForbiddenRouter := forbiddenRouter.Group("/user")
userForbiddenRouter.POST("/add", admin.AddUserIPLimitLogin) // 添加限制用户在指定ip登录
userForbiddenRouter.POST("/del", admin.DelUserIPLimitLogin) // 删除用户在指定IP登录
userForbiddenRouter.POST("/search", admin.SearchUserIPLimitLogin) // 搜索限制用户在指定ip登录
userForbiddenRouter.POST("/add", admin.AddUserIPLimitLogin) // Add limit for user login on specific IP
userForbiddenRouter.POST("/del", admin.DelUserIPLimitLogin) // Delete user limit on specific IP for login
userForbiddenRouter.POST("/search", admin.SearchUserIPLimitLogin) // Search limit for user login on specific IP

appletRouterGroup := router.Group("/applet", mw.CheckAdmin)
appletRouterGroup.POST("/add", admin.AddApplet) // 添加小程序
appletRouterGroup.POST("/del", admin.DelApplet) // 删除小程序
appletRouterGroup.POST("/update", admin.UpdateApplet) // 修改小程序
appletRouterGroup.POST("/search", admin.SearchApplet) // 搜索小程序
appletRouterGroup.POST("/add", admin.AddApplet) // Add applet
appletRouterGroup.POST("/del", admin.DelApplet) // Delete applet
appletRouterGroup.POST("/update", admin.UpdateApplet) // Modify applet
appletRouterGroup.POST("/search", admin.SearchApplet) // Search applet

blockRouter := router.Group("/block", mw.CheckAdmin)
blockRouter.POST("/add", admin.BlockUser) // 封号
blockRouter.POST("/del", admin.UnblockUser) // 解封
blockRouter.POST("/search", admin.SearchBlockUser) // 搜索封号用户
blockRouter.POST("/add", admin.BlockUser) // Block user
blockRouter.POST("/del", admin.UnblockUser) // Unblock user
blockRouter.POST("/search", admin.SearchBlockUser) // Search blocked users

userRouter := router.Group("/user", mw.CheckAdmin)
userRouter.POST("/password/reset", admin.ResetUserPassword) // 重置用户密码
userRouter.POST("/password/reset", admin.ResetUserPassword) // Reset user password

initGroup := router.Group("/client_config", mw.CheckAdmin)
initGroup.POST("/get", admin.GetClientConfig) // 获取客户端初始化配置
initGroup.POST("/set", admin.SetClientConfig) // 设置客户端初始化配置
initGroup.POST("/del", admin.DelClientConfig) // 删除客户端初始化配置
initGroup.POST("/get", admin.GetClientConfig) // Get client initialization configuration
initGroup.POST("/set", admin.SetClientConfig) // Set client initialization configuration
initGroup.POST("/del", admin.DelClientConfig) // Delete client initialization configuration

statistic := router.Group("/statistic", mw.CheckAdmin)
statistic.POST("/new_user_count", admin.NewUserCount)
Expand Down
141 changes: 139 additions & 2 deletions internal/rpc/admin/admin.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,18 @@ package admin

import (
"context"

"crypto/md5"
"encoding/hex"
"fmt"
"github.com/OpenIMSDK/chat/pkg/common/db/cache"
"github.com/OpenIMSDK/tools/discoveryregistry"
"github.com/OpenIMSDK/tools/errs"
"github.com/OpenIMSDK/tools/log"
"github.com/OpenIMSDK/tools/mcontext"
"github.com/OpenIMSDK/tools/utils"
"google.golang.org/grpc"
"math/rand"
"time"

"github.com/OpenIMSDK/chat/pkg/common/config"
"github.com/OpenIMSDK/chat/pkg/common/constant"
Expand Down Expand Up @@ -95,6 +102,99 @@ func (o *adminServer) GetAdminInfo(ctx context.Context, req *admin.GetAdminInfoR
}, nil
}

func (o *adminServer) ChangeAdminPassword(ctx context.Context, req *admin.ChangeAdminPasswordReq) (*admin.ChangeAdminPasswordResp, error) {
user, err := o.Database.GetAdminUserID(ctx, req.UserID)
if err != nil {
return nil, err
}

if user.Password != o.passwordEncryption(req.CurrentPassword) {
return nil, errs.ErrInternalServer.Wrap("password error")
}

if err := o.Database.ChangePassword(ctx, req.UserID, o.passwordEncryption(req.NewPassword)); err != nil {
return nil, err
}
return &admin.ChangeAdminPasswordResp{}, nil
}

func (o *adminServer) AddAdminAccount(ctx context.Context, req *admin.AddAdminAccountReq) (*admin.AddAdminAccountResp, error) {
if err := o.CheckSuperAdmin(ctx); err != nil {
return nil, err
}

_, err := o.Database.GetAdmin(ctx, req.Account)
if err == nil {
return nil, errs.ErrRegisteredAlready.Wrap("the account is registered")
}

adm := &admin2.Admin{
Account: req.Account,
Password: o.passwordEncryption(req.Password),
FaceURL: req.FaceURL,
Nickname: req.Nickname,
UserID: o.genUserID(),
Level: 80,
CreateTime: time.Now(),
}
if err = o.Database.AddAdminAccount(ctx, adm); err != nil {
return nil, err
}
return &admin.AddAdminAccountResp{}, nil
}

func (o *adminServer) DelAdminAccount(ctx context.Context, req *admin.DelAdminAccountReq) (*admin.DelAdminAccountResp, error) {
if err := o.CheckSuperAdmin(ctx); err != nil {
return nil, err
}

if utils.Duplicate(req.UserIDs) {
return nil, errs.ErrArgs.Wrap("user ids is duplicate")
}

for _, userID := range req.UserIDs {
superAdmin, err := o.Database.GetAdminUserID(ctx, userID)
if err != nil {
return nil, err
}
if superAdmin.Level == constant.AdvancedUserLevel {
str := fmt.Sprintf("%s is superAdminID", userID)
return nil, errs.ErrNoPermission.Wrap(str)
}
}

if err := o.Database.DelAdminAccount(ctx, req.UserIDs); err != nil {
return nil, err
}
return &admin.DelAdminAccountResp{}, nil
}

func (o *adminServer) SearchAdminAccount(ctx context.Context, req *admin.SearchAdminAccountReq) (*admin.SearchAdminAccountResp, error) {
defer log.ZDebug(ctx, "return")

if err := o.CheckSuperAdmin(ctx); err != nil {
return nil, err
}

total, adminAccounts, err := o.Database.SearchAdminAccount(ctx, req.Pagination.PageNumber, req.Pagination.ShowNumber)
if err != nil {
return nil, err
}
accounts := make([]*admin.GetAdminInfoResp, 0, len(adminAccounts))
for _, v := range adminAccounts {
temp := &admin.GetAdminInfoResp{
Account: v.Account,
FaceURL: v.FaceURL,
Nickname: v.Nickname,
UserID: v.UserID,
Level: v.Level,
CreateTime: v.CreateTime.Unix(),
}
accounts = append(accounts, temp)
}
return &admin.SearchAdminAccountResp{Total: total, AdminAccounts: accounts}, nil
}

func (o *adminServer) AdminUpdateInfo(ctx context.Context, req *admin.AdminUpdateInfoReq) (*admin.AdminUpdateInfoResp, error) {
userID, err := mctx.CheckAdmin(ctx)
if err != nil {
Expand Down Expand Up @@ -133,7 +233,7 @@ func (o *adminServer) Login(ctx context.Context, req *admin.LoginReq) (*admin.Lo
}
return nil, err
}
if a.Password != req.Password {
if a.Password != o.passwordEncryption(req.Password) {
return nil, eerrs.ErrPassword.Wrap()
}
adminToken, err := o.CreateToken(ctx, &admin.CreateTokenReq{UserID: a.UserID, UserType: constant.AdminUser})
Expand Down Expand Up @@ -168,3 +268,40 @@ func (o *adminServer) ChangePassword(ctx context.Context, req *admin.ChangePassw
}
return &admin.ChangePasswordResp{}, nil
}

func (o *adminServer) genUserID() string {
const l = 10
data := make([]byte, l)
rand.Read(data)
chars := []byte("0123456789")
for i := 0; i < len(data); i++ {
if i == 0 {
data[i] = chars[1:][data[i]%9]
} else {
data[i] = chars[data[i]%10]
}
}
return string(data)
}

func (o *adminServer) passwordEncryption(password string) string {
paswd := md5.Sum([]byte(password))
return hex.EncodeToString(paswd[:])
}

func (o *adminServer) CheckSuperAdmin(ctx context.Context) error {
userID, err := mctx.CheckAdmin(ctx)
if err != nil {
return err
}

adminUser, err := o.Database.GetAdminUserID(ctx, userID)
if err != nil {
return err
}

if adminUser.Level != constant.AdvancedUserLevel {
return errs.ErrNoPermission.Wrap()
}
return nil
}
Loading

0 comments on commit 9284101

Please sign in to comment.