feat(server): support SetUser api

This commit is contained in:
hexxa 2021-08-24 21:35:28 +08:00 committed by Hexxa
parent c2673cd416
commit 9cd6d6f84b
4 changed files with 67 additions and 2 deletions

View file

@ -40,6 +40,7 @@ func NewMultiUsersSvc(cfg gocfg.ICfg, deps *depidx.Deps) (*MultiUsersSvc, error)
apiRuleCname(userstore.AdminRole, "POST", "/v1/users/logout"): true,
apiRuleCname(userstore.AdminRole, "GET", "/v1/users/isauthed"): true,
apiRuleCname(userstore.AdminRole, "PATCH", "/v1/users/pwd"): true,
apiRuleCname(userstore.AdminRole, "PATCH", "/v1/users/"): true,
apiRuleCname(userstore.AdminRole, "PATCH", "/v1/users/pwd/force-set"): true,
apiRuleCname(userstore.AdminRole, "POST", "/v1/users/"): true,
apiRuleCname(userstore.AdminRole, "DELETE", "/v1/users/"): true,
@ -74,6 +75,7 @@ func NewMultiUsersSvc(cfg gocfg.ICfg, deps *depidx.Deps) (*MultiUsersSvc, error)
apiRuleCname(userstore.UserRole, "POST", "/v1/users/logout"): true,
apiRuleCname(userstore.UserRole, "GET", "/v1/users/isauthed"): true,
apiRuleCname(userstore.UserRole, "PATCH", "/v1/users/pwd"): true,
apiRuleCname(userstore.UserRole, "PATCH", "/v1/users/"): true,
apiRuleCname(userstore.UserRole, "GET", "/v1/users/self"): true,
apiRuleCname(userstore.UserRole, "POST", "/v1/fs/files"): true,
apiRuleCname(userstore.UserRole, "DELETE", "/v1/fs/files"): true,
@ -584,3 +586,29 @@ func (h *MultiUsersSvc) Self(c *gin.Context) {
UsedSpace: user.UsedSpace,
})
}
type SetUserReq struct {
ID uint64 `json:"id,string"`
Role string `json:"role"`
UsedSpace int64 `json:"usedSpace,string"`
Quota *userstore.Quota `json:"quota"`
}
func (h *MultiUsersSvc) SetUser(c *gin.Context) {
req := &SetUserReq{}
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(q.ErrResp(c, 500, err))
return
}
err := h.deps.Users().SetInfo(req.ID, &userstore.User{
Role: req.Role,
Quota: req.Quota,
})
if err != nil {
c.JSON(q.ErrResp(c, 500, err))
return
}
c.JSON(q.Resp(200))
}

View file

@ -195,6 +195,7 @@ func initHandlers(router *gin.Engine, cfg gocfg.ICfg, deps *depidx.Deps) (*gin.E
usersAPI.DELETE("/", userHdrs.DelUser)
usersAPI.GET("/list", userHdrs.ListUsers)
usersAPI.GET("/self", userHdrs.Self)
usersAPI.PATCH("/", userHdrs.SetUser)
rolesAPI := v1.Group("/roles")
rolesAPI.POST("/", userHdrs.AddRole)

View file

@ -162,7 +162,7 @@ func TestUsersHandlers(t *testing.T) {
}
})
t.Run("test users APIs: Login-AddUser-ListUsers-DelUser-ListUsers", func(t *testing.T) {
t.Run("test users APIs: Login-AddUser-ListUsers-SetUser-ListUsers-DelUser-ListUsers", func(t *testing.T) {
resp, _, errs := usersCl.Login(adminName, adminNewPwd)
if len(errs) > 0 {
t.Fatal(errs)
@ -172,7 +172,7 @@ func TestUsersHandlers(t *testing.T) {
token := client.GetCookie(resp.Cookies(), su.TokenCookie)
userName, userPwd, userRole := "user_admin", "1234", userstore.UserRole
userName, userPwd, userRole := "new_user", "1234", userstore.UserRole
resp, auResp, errs := usersCl.AddUser(userName, userPwd, userRole, token)
if len(errs) > 0 {
t.Fatal(errs)
@ -211,6 +211,41 @@ func TestUsersHandlers(t *testing.T) {
}
}
newRole, newQuota := userstore.AdminRole, &userstore.Quota{
SpaceLimit: 3,
UploadSpeedLimit: 3,
DownloadSpeedLimit: 3,
}
resp, _, errs = usersCl.SetUser(newUserID, newRole, newQuota, token)
if len(errs) > 0 {
t.Fatal(errs)
} else if resp.StatusCode != 200 {
t.Fatal(resp.StatusCode)
}
resp, lsResp, errs = usersCl.ListUsers(token)
if len(errs) > 0 {
t.Fatal(errs)
} else if resp.StatusCode != 200 {
t.Fatal(resp.StatusCode)
}
for _, user := range lsResp.Users {
if user.ID == newUserID {
if user.Role != newRole {
t.Fatal(fmt.Errorf("incorrect role (%v)", user.Role))
}
if user.Quota.SpaceLimit != newQuota.SpaceLimit {
t.Fatal(fmt.Errorf("incorrect quota (%v)", newQuota.SpaceLimit))
}
if user.Quota.UploadSpeedLimit != newQuota.UploadSpeedLimit {
t.Fatal(fmt.Errorf("incorrect quota (%v)", newQuota.UploadSpeedLimit))
}
if user.Quota.DownloadSpeedLimit != newQuota.DownloadSpeedLimit {
t.Fatal(fmt.Errorf("incorrect quota (%v)", newQuota.DownloadSpeedLimit))
}
}
}
resp, _, errs = usersCl.DelUser(auResp.ID, token)
if len(errs) > 0 {
t.Fatal(errs)

View file

@ -315,6 +315,7 @@ func (us *KVUserStore) SetInfo(id uint64, user *User) error {
if err != nil {
return err
}
return us.store.SetStringIn(UsersNs, userID, string(infoBytes))
}