diff --git a/kernel/api/av.go b/kernel/api/av.go index c3959bf7f..8207c9724 100644 --- a/kernel/api/av.go +++ b/kernel/api/av.go @@ -26,6 +26,35 @@ import ( "github.com/siyuan-note/siyuan/kernel/util" ) +func searchAttributeView(c *gin.Context) { + ret := gulu.Ret.NewResult() + defer c.JSON(http.StatusOK, ret) + + arg, _ := util.JsonArg(c, ret) + if nil == arg { + return + } + + keyword := arg["keyword"].(string) + page := 1 + pageArg := arg["page"] + if nil != pageArg { + page = int(pageArg.(float64)) + } + + pageSize := 10 + pageSizeArg := arg["pageSize"] + if nil != pageSizeArg { + pageSize = int(pageSizeArg.(float64)) + } + + results, total := model.SearchAttributeView(keyword, page, pageSize) + ret.Data = map[string]interface{}{ + "results": results, + "total": total, + } +} + func renderSnapshotAttributeView(c *gin.Context) { ret := gulu.Ret.NewResult() defer c.JSON(http.StatusOK, ret) diff --git a/kernel/api/router.go b/kernel/api/router.go index 49138e216..910dcf2bb 100644 --- a/kernel/api/router.go +++ b/kernel/api/router.go @@ -386,6 +386,7 @@ func ServeAPI(ginServer *gin.Engine) { ginServer.Handle("POST", "/api/av/renderSnapshotAttributeView", model.CheckAuth, renderSnapshotAttributeView) ginServer.Handle("POST", "/api/av/getAttributeViewKeys", model.CheckAuth, getAttributeViewKeys) ginServer.Handle("POST", "/api/av/setAttributeViewBlockAttr", model.CheckAuth, model.CheckReadonly, setAttributeViewBlockAttr) + ginServer.Handle("POST", "/api/av/searchAttributeView", model.CheckAuth, model.CheckReadonly, searchAttributeView) ginServer.Handle("POST", "/api/ai/chatGPT", model.CheckAuth, chatGPT) ginServer.Handle("POST", "/api/ai/chatGPTWithAction", model.CheckAuth, chatGPTWithAction) diff --git a/kernel/model/attribute_view.go b/kernel/model/attribute_view.go index 0c143f844..d077513f4 100644 --- a/kernel/model/attribute_view.go +++ b/kernel/model/attribute_view.go @@ -37,6 +37,63 @@ import ( "github.com/siyuan-note/siyuan/kernel/util" ) +type SearchAttributeViewResult struct { + AvID string `json:"avID"` + AvName string `json:"avName"` + BlockID string `json:"blockID"` +} + +func SearchAttributeView(keyword string, page int, pageSize int) (ret []*SearchAttributeViewResult, pageCount int) { + waitForSyncingStorages() + + ret = []*SearchAttributeViewResult{} + blocks, _, _, pageCount := FullTextSearchBlock(keyword, nil, nil, map[string]bool{"databaseBlock": true}, 0, 7, 0, page, pageSize) + trees := map[string]*parse.Tree{} + for _, block := range blocks { + tree := trees[block.RootID] + if nil == tree { + tree, _ = loadTreeByBlockID(block.ID) + if nil != tree { + trees[block.RootID] = tree + } + } + if nil == tree { + continue + } + + node := treenode.GetNodeInTree(tree, block.ID) + if nil == node { + continue + } + + if "" == node.AttributeViewID { + continue + } + + avID := node.AttributeViewID + attrView, _ := av.ParseAttributeView(avID) + if nil == attrView { + continue + } + + exist := false + for _, result := range ret { + if result.AvID == avID { + exist = true + break + } + } + if !exist { + ret = append(ret, &SearchAttributeViewResult{ + AvID: avID, + AvName: attrView.Name, + BlockID: block.ID, + }) + } + } + return +} + type BlockAttributeViewKeys struct { AvID string `json:"avID"` AvName string `json:"avName"`