diff --git a/kernel/api/av.go b/kernel/api/av.go index e4ebc6f0d..e6fdde5ca 100644 --- a/kernel/api/av.go +++ b/kernel/api/av.go @@ -28,6 +28,22 @@ import ( "github.com/siyuan-note/siyuan/kernel/util" ) +func removeUnusedAttributeView(c *gin.Context) { + ret := gulu.Ret.NewResult() + defer c.JSON(http.StatusOK, ret) + + arg, ok := util.JsonArg(c, ret) + if !ok { + return + } + + p := arg["path"].(string) + asset := model.RemoveUnusedAttributeView(p) + ret.Data = map[string]interface{}{ + "path": asset, + } +} + func removeUnusedAttributeViews(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 0865f08d9..3e5a24755 100644 --- a/kernel/api/router.go +++ b/kernel/api/router.go @@ -490,6 +490,8 @@ func ServeAPI(ginServer *gin.Engine) { ginServer.Handle("POST", "/api/av/getAttributeViewBoundBlockIDsByItemIDs", model.CheckAuth, getAttributeViewBoundBlockIDsByItemIDs) ginServer.Handle("POST", "/api/av/getAttributeViewItemIDsByBoundIDs", model.CheckAuth, getAttributeViewItemIDsByBoundIDs) ginServer.Handle("POST", "/api/av/getUnusedAttributeViews", model.CheckAuth, getUnusedAttributeViews) + ginServer.Handle("POST", "/api/av/removeUnusedAttributeViews", model.CheckAuth, removeUnusedAttributeViews) + ginServer.Handle("POST", "/api/av/removeUnusedAttributeView", model.CheckAuth, removeUnusedAttributeView) ginServer.Handle("POST", "/api/ai/chatGPT", model.CheckAuth, model.CheckAdminRole, chatGPT) ginServer.Handle("POST", "/api/ai/chatGPTWithAction", model.CheckAuth, model.CheckAdminRole, chatGPTWithAction) diff --git a/kernel/model/attribute_view.go b/kernel/model/attribute_view.go index b1ede8952..0cfcf36a0 100644 --- a/kernel/model/attribute_view.go +++ b/kernel/model/attribute_view.go @@ -46,6 +46,39 @@ import ( "github.com/xrash/smetrics" ) +func RemoveUnusedAttributeView(p string) (ret string) { + absPath := filepath.Join(util.DataDir, "storage", "av", p+".json") + if !filelock.IsExist(absPath) { + return absPath + } + + historyDir, err := GetHistoryDir(HistoryOpClean) + if err != nil { + logging.LogErrorf("get history dir failed: %s", err) + return + } + + newP := strings.TrimPrefix(absPath, util.DataDir) + historyPath := filepath.Join(historyDir, newP) + if filelock.IsExist(absPath) { + if err = filelock.Copy(absPath, historyPath); err != nil { + return + } + } + + if err = filelock.RemoveWithoutFatal(absPath); err != nil { + logging.LogErrorf("remove unused asset [%s] failed: %s", absPath, err) + util.PushErrMsg(fmt.Sprintf("%s", err), 7000) + return + } + ret = absPath + + IncSync() + + indexHistoryDir(filepath.Base(historyDir), util.NewLute()) + return +} + func RemoveUnusedAttributeViews() (ret []string) { ret = []string{} var size int64