feat(server): support SetUser api
This commit is contained in:
parent
c2673cd416
commit
9cd6d6f84b
4 changed files with 67 additions and 2 deletions
|
@ -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, "POST", "/v1/users/logout"): true,
|
||||||
apiRuleCname(userstore.AdminRole, "GET", "/v1/users/isauthed"): true,
|
apiRuleCname(userstore.AdminRole, "GET", "/v1/users/isauthed"): true,
|
||||||
apiRuleCname(userstore.AdminRole, "PATCH", "/v1/users/pwd"): 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, "PATCH", "/v1/users/pwd/force-set"): true,
|
||||||
apiRuleCname(userstore.AdminRole, "POST", "/v1/users/"): true,
|
apiRuleCname(userstore.AdminRole, "POST", "/v1/users/"): true,
|
||||||
apiRuleCname(userstore.AdminRole, "DELETE", "/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, "POST", "/v1/users/logout"): true,
|
||||||
apiRuleCname(userstore.UserRole, "GET", "/v1/users/isauthed"): true,
|
apiRuleCname(userstore.UserRole, "GET", "/v1/users/isauthed"): true,
|
||||||
apiRuleCname(userstore.UserRole, "PATCH", "/v1/users/pwd"): 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, "GET", "/v1/users/self"): true,
|
||||||
apiRuleCname(userstore.UserRole, "POST", "/v1/fs/files"): true,
|
apiRuleCname(userstore.UserRole, "POST", "/v1/fs/files"): true,
|
||||||
apiRuleCname(userstore.UserRole, "DELETE", "/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,
|
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))
|
||||||
|
}
|
||||||
|
|
|
@ -195,6 +195,7 @@ func initHandlers(router *gin.Engine, cfg gocfg.ICfg, deps *depidx.Deps) (*gin.E
|
||||||
usersAPI.DELETE("/", userHdrs.DelUser)
|
usersAPI.DELETE("/", userHdrs.DelUser)
|
||||||
usersAPI.GET("/list", userHdrs.ListUsers)
|
usersAPI.GET("/list", userHdrs.ListUsers)
|
||||||
usersAPI.GET("/self", userHdrs.Self)
|
usersAPI.GET("/self", userHdrs.Self)
|
||||||
|
usersAPI.PATCH("/", userHdrs.SetUser)
|
||||||
|
|
||||||
rolesAPI := v1.Group("/roles")
|
rolesAPI := v1.Group("/roles")
|
||||||
rolesAPI.POST("/", userHdrs.AddRole)
|
rolesAPI.POST("/", userHdrs.AddRole)
|
||||||
|
|
|
@ -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)
|
resp, _, errs := usersCl.Login(adminName, adminNewPwd)
|
||||||
if len(errs) > 0 {
|
if len(errs) > 0 {
|
||||||
t.Fatal(errs)
|
t.Fatal(errs)
|
||||||
|
@ -172,7 +172,7 @@ func TestUsersHandlers(t *testing.T) {
|
||||||
|
|
||||||
token := client.GetCookie(resp.Cookies(), su.TokenCookie)
|
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)
|
resp, auResp, errs := usersCl.AddUser(userName, userPwd, userRole, token)
|
||||||
if len(errs) > 0 {
|
if len(errs) > 0 {
|
||||||
t.Fatal(errs)
|
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)
|
resp, _, errs = usersCl.DelUser(auResp.ID, token)
|
||||||
if len(errs) > 0 {
|
if len(errs) > 0 {
|
||||||
t.Fatal(errs)
|
t.Fatal(errs)
|
||||||
|
|
|
@ -315,6 +315,7 @@ func (us *KVUserStore) SetInfo(id uint64, user *User) error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
return us.store.SetStringIn(UsersNs, userID, string(infoBytes))
|
return us.store.SetStringIn(UsersNs, userID, string(infoBytes))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue