Skip to content

Commit 3319f6e

Browse files
authored
feat(search): Optimized search result filtering and paging logic (#9287)
- Introduced the `filteredNodes` list to optimize the node filtering process - Filtered results based on the page limit during paging - Modified search logic to ensure nodes are within the user's base path - Added access permission checks for node metadata - Adjusted paging logic to avoid redundant node retrieval
1 parent d7723c3 commit 3319f6e

File tree

1 file changed

+27
-16
lines changed

1 file changed

+27
-16
lines changed

server/handles/search.go

Lines changed: 27 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -43,28 +43,39 @@ func Search(c *gin.Context) {
4343
common.ErrorResp(c, err, 400)
4444
return
4545
}
46-
nodes, total, err := search.Search(c, req.SearchReq)
47-
if err != nil {
48-
common.ErrorResp(c, err, 500)
49-
return
50-
}
51-
var filteredNodes []model.SearchNode
52-
for _, node := range nodes {
53-
if !strings.HasPrefix(node.Parent, user.BasePath) {
54-
continue
46+
var (
47+
filteredNodes []model.SearchNode
48+
)
49+
for len(filteredNodes) < req.PerPage {
50+
nodes, _, err := search.Search(c, req.SearchReq)
51+
if err != nil {
52+
common.ErrorResp(c, err, 500)
53+
return
5554
}
56-
meta, err := op.GetNearestMeta(node.Parent)
57-
if err != nil && !errors.Is(errors.Cause(err), errs.MetaNotFound) {
58-
continue
55+
if len(nodes) == 0 {
56+
break
5957
}
60-
if !common.CanAccessWithRoles(user, meta, path.Join(node.Parent, node.Name), req.Password) {
61-
continue
58+
for _, node := range nodes {
59+
if !strings.HasPrefix(node.Parent, user.BasePath) {
60+
continue
61+
}
62+
meta, err := op.GetNearestMeta(node.Parent)
63+
if err != nil && !errors.Is(errors.Cause(err), errs.MetaNotFound) {
64+
continue
65+
}
66+
if !common.CanAccessWithRoles(user, meta, path.Join(node.Parent, node.Name), req.Password) {
67+
continue
68+
}
69+
filteredNodes = append(filteredNodes, node)
70+
if len(filteredNodes) >= req.PerPage {
71+
break
72+
}
6273
}
63-
filteredNodes = append(filteredNodes, node)
74+
req.Page++
6475
}
6576
common.SuccessResp(c, common.PageResp{
6677
Content: utils.MustSliceConvert(filteredNodes, nodeToSearchResp),
67-
Total: total,
78+
Total: int64(len(filteredNodes)),
6879
})
6980
}
7081

0 commit comments

Comments
 (0)