Spaces:
Running
Running
package handles | |
import ( | |
"path" | |
"strings" | |
"github.com/alist-org/alist/v3/internal/errs" | |
"github.com/alist-org/alist/v3/internal/model" | |
"github.com/alist-org/alist/v3/internal/op" | |
"github.com/alist-org/alist/v3/internal/search" | |
"github.com/alist-org/alist/v3/pkg/utils" | |
"github.com/alist-org/alist/v3/server/common" | |
"github.com/gin-gonic/gin" | |
"github.com/pkg/errors" | |
) | |
type SearchReq struct { | |
model.SearchReq | |
Password string `json:"password"` | |
} | |
type SearchResp struct { | |
model.SearchNode | |
Type int `json:"type"` | |
} | |
func Search(c *gin.Context) { | |
var ( | |
req SearchReq | |
err error | |
) | |
if err = c.ShouldBind(&req); err != nil { | |
common.ErrorResp(c, err, 400) | |
return | |
} | |
user := c.MustGet("user").(*model.User) | |
req.Parent, err = user.JoinPath(req.Parent) | |
if err != nil { | |
common.ErrorResp(c, err, 400) | |
return | |
} | |
if err := req.Validate(); err != nil { | |
common.ErrorResp(c, err, 400) | |
return | |
} | |
nodes, total, err := search.Search(c, req.SearchReq) | |
if err != nil { | |
common.ErrorResp(c, err, 500) | |
return | |
} | |
var filteredNodes []model.SearchNode | |
for _, node := range nodes { | |
if !strings.HasPrefix(node.Parent, user.BasePath) { | |
continue | |
} | |
meta, err := op.GetNearestMeta(node.Parent) | |
if err != nil && !errors.Is(errors.Cause(err), errs.MetaNotFound) { | |
continue | |
} | |
if !common.CanAccess(user, meta, path.Join(node.Parent, node.Name), req.Password) { | |
continue | |
} | |
filteredNodes = append(filteredNodes, node) | |
} | |
common.SuccessResp(c, common.PageResp{ | |
Content: utils.MustSliceConvert(filteredNodes, nodeToSearchResp), | |
Total: total, | |
}) | |
} | |
func nodeToSearchResp(node model.SearchNode) SearchResp { | |
return SearchResp{ | |
SearchNode: node, | |
Type: utils.GetObjType(node.Name, node.IsDir), | |
} | |
} | |