feat(users) add async handler for reset used space
This commit is contained in:
parent
e05ef9b5fd
commit
4dcd2c56ca
8 changed files with 142 additions and 4 deletions
|
@ -9,7 +9,9 @@ import (
|
|||
"github.com/ihexxa/quickshare/src/worker"
|
||||
)
|
||||
|
||||
const MsgTypeSha1 = "sha1"
|
||||
const (
|
||||
MsgTypeSha1 = "sha1"
|
||||
)
|
||||
|
||||
type Sha1Params struct {
|
||||
FilePath string
|
||||
|
|
48
src/handlers/multiusers/async_handlers.go
Normal file
48
src/handlers/multiusers/async_handlers.go
Normal file
|
@ -0,0 +1,48 @@
|
|||
package multiusers
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"path/filepath"
|
||||
|
||||
"github.com/ihexxa/quickshare/src/worker"
|
||||
)
|
||||
|
||||
const (
|
||||
MsgTypeResetUsedSpace = "reset-used-space"
|
||||
)
|
||||
|
||||
type UsedSpaceParams struct {
|
||||
UserID uint64
|
||||
UserHomePath string
|
||||
}
|
||||
|
||||
func (h *MultiUsersSvc) resetUsedSpace(msg worker.IMsg) error {
|
||||
params := &UsedSpaceParams{}
|
||||
err := json.Unmarshal([]byte(msg.Body()), params)
|
||||
if err != nil {
|
||||
return fmt.Errorf("fail to unmarshal sha1 msg: %w", err)
|
||||
}
|
||||
|
||||
usedSpace := int64(0)
|
||||
dirQueue := []string{params.UserHomePath}
|
||||
for len(dirQueue) > 0 {
|
||||
dirPath := dirQueue[0]
|
||||
dirQueue = dirQueue[1:]
|
||||
|
||||
infos, err := h.deps.FS().ListDir(dirPath)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
for _, info := range infos {
|
||||
if info.IsDir() {
|
||||
dirQueue = append(dirQueue, filepath.Join(dirPath, info.Name()))
|
||||
} else {
|
||||
usedSpace += info.Size()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return h.deps.Users().ResetUsed(params.UserID, usedSpace)
|
||||
}
|
|
@ -1,6 +1,7 @@
|
|||
package multiusers
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"path/filepath"
|
||||
|
@ -16,6 +17,7 @@ import (
|
|||
"github.com/ihexxa/quickshare/src/db/userstore"
|
||||
"github.com/ihexxa/quickshare/src/depidx"
|
||||
q "github.com/ihexxa/quickshare/src/handlers"
|
||||
"github.com/ihexxa/quickshare/src/worker/localworker"
|
||||
)
|
||||
|
||||
var (
|
||||
|
@ -48,6 +50,7 @@ func NewMultiUsersSvc(cfg gocfg.ICfg, deps *depidx.Deps) (*MultiUsersSvc, error)
|
|||
apiRuleCname(userstore.AdminRole, "GET", "/v1/users/list"): true,
|
||||
apiRuleCname(userstore.AdminRole, "GET", "/v1/users/self"): true,
|
||||
apiRuleCname(userstore.AdminRole, "PATCH", "/v1/users/preferences"): true,
|
||||
apiRuleCname(userstore.AdminRole, "PUT", "/v1/users//used-space"): true,
|
||||
apiRuleCname(userstore.AdminRole, "POST", "/v1/roles/"): true,
|
||||
apiRuleCname(userstore.AdminRole, "DELETE", "/v1/roles/"): true,
|
||||
apiRuleCname(userstore.AdminRole, "GET", "/v1/roles/list"): true,
|
||||
|
@ -77,6 +80,7 @@ func NewMultiUsersSvc(cfg gocfg.ICfg, deps *depidx.Deps) (*MultiUsersSvc, error)
|
|||
apiRuleCname(userstore.AdminRole, "GET", "/v1/fs/sharings/dirs"): true,
|
||||
apiRuleCname(userstore.AdminRole, "GET", "/v1/fs/sharings/ids"): true,
|
||||
apiRuleCname(userstore.AdminRole, "POST", "/v1/fs/hashes/sha1"): true,
|
||||
|
||||
// user rules
|
||||
apiRuleCname(userstore.UserRole, "GET", "/"): true,
|
||||
apiRuleCname(userstore.UserRole, "GET", publicPath): true,
|
||||
|
@ -125,11 +129,14 @@ func NewMultiUsersSvc(cfg gocfg.ICfg, deps *depidx.Deps) (*MultiUsersSvc, error)
|
|||
apiRuleCname(userstore.VisitorRole, "GET", "/v1/fs/sharings/dirs"): true,
|
||||
}
|
||||
|
||||
return &MultiUsersSvc{
|
||||
handlers := &MultiUsersSvc{
|
||||
cfg: cfg,
|
||||
deps: deps,
|
||||
apiACRules: apiACRules,
|
||||
}, nil
|
||||
}
|
||||
deps.Workers().AddHandler(MsgTypeResetUsedSpace, handlers.resetUsedSpace)
|
||||
|
||||
return handlers, nil
|
||||
}
|
||||
|
||||
func (h *MultiUsersSvc) Init(adminName, adminPwd string) (string, error) {
|
||||
|
@ -707,3 +714,43 @@ func (h *MultiUsersSvc) SetPreferences(c *gin.Context) {
|
|||
}
|
||||
c.JSON(q.Resp(200))
|
||||
}
|
||||
|
||||
type ResetUsedSpaceReq struct {
|
||||
UserID uint64 `json:"userID,string"`
|
||||
}
|
||||
|
||||
func (h *MultiUsersSvc) ResetUsedSpace(c *gin.Context) {
|
||||
req := &ResetUsedSpaceReq{}
|
||||
if err := c.ShouldBindJSON(&req); err != nil {
|
||||
c.JSON(q.ErrResp(c, 400, err))
|
||||
return
|
||||
}
|
||||
|
||||
userInfo, err := h.deps.Users().GetUser(req.UserID)
|
||||
if err != nil {
|
||||
c.JSON(q.ErrResp(c, 500, err))
|
||||
return
|
||||
}
|
||||
msg, err := json.Marshal(UsedSpaceParams{
|
||||
UserID: req.UserID,
|
||||
UserHomePath: userInfo.Name,
|
||||
})
|
||||
if err != nil {
|
||||
c.JSON(q.ErrResp(c, 500, err))
|
||||
return
|
||||
}
|
||||
|
||||
err = h.deps.Workers().TryPut(
|
||||
localworker.NewMsg(
|
||||
h.deps.ID().Gen(),
|
||||
map[string]string{localworker.MsgTypeKey: MsgTypeResetUsedSpace},
|
||||
string(msg),
|
||||
),
|
||||
)
|
||||
if err != nil {
|
||||
c.JSON(q.ErrResp(c, 500, err))
|
||||
return
|
||||
}
|
||||
|
||||
c.JSON(q.Resp(200))
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue