diff --git a/kernel/api/block.go b/kernel/api/block.go index 36ff236d1..3e5ac4a37 100644 --- a/kernel/api/block.go +++ b/kernel/api/block.go @@ -30,6 +30,26 @@ import ( "github.com/siyuan-note/siyuan/kernel/util" ) +func transferBlockRef(c *gin.Context) { + ret := gulu.Ret.NewResult() + defer c.JSON(http.StatusOK, ret) + + arg, ok := util.JsonArg(c, ret) + if !ok { + return + } + + fromID := arg["fromID"].(string) + toID := arg["toID"].(string) + err := model.TransferBlockRef(fromID, toID) + if nil != err { + ret.Code = -1 + ret.Msg = err.Error() + ret.Data = map[string]interface{}{"closeTimeout": 7000} + return + } +} + func swapBlockRef(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 0961fe81e..0a2d07fec 100644 --- a/kernel/api/router.go +++ b/kernel/api/router.go @@ -170,6 +170,7 @@ func ServeAPI(ginServer *gin.Engine) { ginServer.Handle("POST", "/api/block/getHeadingChildrenIDs", model.CheckAuth, getHeadingChildrenIDs) ginServer.Handle("POST", "/api/block/getHeadingChildrenDOM", model.CheckAuth, getHeadingChildrenDOM) ginServer.Handle("POST", "/api/block/swapBlockRef", model.CheckAuth, swapBlockRef) + ginServer.Handle("POST", "/api/block/transferBlockRef", model.CheckAuth, transferBlockRef) ginServer.Handle("POST", "/api/file/getFile", model.CheckAuth, getFile) ginServer.Handle("POST", "/api/file/putFile", model.CheckAuth, putFile) diff --git a/kernel/model/block.go b/kernel/model/block.go index c48e11dcb..3671827a6 100644 --- a/kernel/model/block.go +++ b/kernel/model/block.go @@ -115,6 +115,43 @@ func RecentUpdatedBlocks() (ret []*Block) { return } +func TransferBlockRef(fromID, toID string) (err error) { + toTree, _ := loadTreeByBlockID(toID) + if nil == toTree { + err = ErrBlockNotFound + return + } + toNode := treenode.GetNodeInTree(toTree, toID) + if nil == toNode { + err = ErrBlockNotFound + return + } + toRefText := getNodeRefText(toNode) + + refIDs, _ := sql.QueryRefIDsByDefID(fromID, false) + for _, refID := range refIDs { + tree, _ := loadTreeByBlockID(refID) + if nil == tree { + continue + } + node := treenode.GetNodeInTree(tree, refID) + textMarks := node.ChildrenByType(ast.NodeTextMark) + for _, textMark := range textMarks { + if textMark.IsTextMarkType("block-ref") && textMark.TextMarkBlockRefID == fromID { + textMark.TextMarkBlockRefID = toID + if "s" == textMark.TextMarkBlockRefSubtype { + textMark.TextMarkTextContent = toRefText + } + } + } + + if err = indexWriteJSONQueue(tree); nil != err { + return + } + } + return +} + func SwapBlockRef(refID, defID string, includeChildren bool) (err error) { refTree, err := loadTreeByBlockID(refID) if nil != err {