From 9cd6d6f84b95bf1d8d0eefa6aaa301b011657b63 Mon Sep 17 00:00:00 2001 From: hexxa Date: Tue, 24 Aug 2021 21:35:28 +0800 Subject: [PATCH] feat(server): support SetUser api --- src/handlers/multiusers/handlers.go | 28 +++++++++++++++++++++ src/server/server.go | 1 + src/server/server_users_test.go | 39 +++++++++++++++++++++++++++-- src/userstore/user_store.go | 1 + 4 files changed, 67 insertions(+), 2 deletions(-) diff --git a/src/handlers/multiusers/handlers.go b/src/handlers/multiusers/handlers.go index ce994b7..95f09f5 100644 --- a/src/handlers/multiusers/handlers.go +++ b/src/handlers/multiusers/handlers.go @@ -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)) +} diff --git a/src/server/server.go b/src/server/server.go index ef3fed2..c2c7f3e 100644 --- a/src/server/server.go +++ b/src/server/server.go @@ -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) diff --git a/src/server/server_users_test.go b/src/server/server_users_test.go index 8c8cca6..3f70bdd 100644 --- a/src/server/server_users_test.go +++ b/src/server/server_users_test.go @@ -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) diff --git a/src/userstore/user_store.go b/src/userstore/user_store.go index bb62b19..e76950f 100644 --- a/src/userstore/user_store.go +++ b/src/userstore/user_store.go @@ -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)) }