|
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), |
|
} |
|
} |
|
|