From 9b831b967a329d8e7235754511dcca230c224dee Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Thu, 23 Nov 2023 22:10:01 +0800 Subject: [PATCH] :art: Support doc/snapshot history for database table view https://github.com/siyuan-note/siyuan/issues/9567 --- kernel/api/av.go | 40 +++++++++++++++++++++++++++++++ kernel/api/router.go | 1 + kernel/model/attribute_view.go | 44 ++++++++++++++++++++++++++++++++++ 3 files changed, 85 insertions(+) diff --git a/kernel/api/av.go b/kernel/api/av.go index 9ef04273f..229efe737 100644 --- a/kernel/api/av.go +++ b/kernel/api/av.go @@ -26,6 +26,46 @@ import ( "github.com/siyuan-note/siyuan/kernel/util" ) +func renderSnapshotAttributeView(c *gin.Context) { + ret := gulu.Ret.NewResult() + defer c.JSON(http.StatusOK, ret) + + arg, ok := util.JsonArg(c, ret) + if !ok { + return + } + + index := arg["snapshot"].(string) + id := arg["id"].(string) + view, attrView, err := model.RenderRepoSnapshotAttributeView(index, id) + if nil != err { + ret.Code = -1 + ret.Msg = err.Error() + return + } + + var views []map[string]interface{} + for _, v := range attrView.Views { + view := map[string]interface{}{ + "id": v.ID, + "name": v.Name, + "type": v.LayoutType, + } + + views = append(views, view) + } + + ret.Data = map[string]interface{}{ + "name": attrView.Name, + "id": attrView.ID, + "viewType": view.GetType(), + "viewID": view.GetID(), + "views": views, + "view": view, + "isMirror": av.IsMirror(attrView.ID), + } +} + func renderHistoryAttributeView(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 b686f80f2..3fc9feb00 100644 --- a/kernel/api/router.go +++ b/kernel/api/router.go @@ -376,6 +376,7 @@ func ServeAPI(ginServer *gin.Engine) { ginServer.Handle("POST", "/api/av/renderAttributeView", model.CheckAuth, renderAttributeView) ginServer.Handle("POST", "/api/av/renderHistoryAttributeView", model.CheckAuth, renderHistoryAttributeView) + 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) diff --git a/kernel/model/attribute_view.go b/kernel/model/attribute_view.go index 658c39572..27f5a768d 100644 --- a/kernel/model/attribute_view.go +++ b/kernel/model/attribute_view.go @@ -30,6 +30,7 @@ import ( "github.com/88250/lute/ast" "github.com/88250/lute/parse" "github.com/Masterminds/sprig/v3" + "github.com/siyuan-note/dejavu/entity" "github.com/siyuan-note/filelock" "github.com/siyuan-note/logging" "github.com/siyuan-note/siyuan/kernel/av" @@ -184,6 +185,49 @@ func GetBlockAttributeViewKeys(blockID string) (ret []*BlockAttributeViewKeys) { return } +func RenderRepoSnapshotAttributeView(indexID, avID string) (viewable av.Viewable, attrView *av.AttributeView, err error) { + repo, err := newRepository() + if nil != err { + return + } + + index, err := repo.GetIndex(indexID) + if nil != err { + return + } + + files, err := repo.GetFiles(index) + if nil != err { + return + } + var avFile *entity.File + for _, f := range files { + if "/storage/av/"+avID+".json" == f.Path { + avFile = f + break + } + } + + if nil == avFile { + return + } + + data, readErr := repo.OpenFile(avFile) + if nil != readErr { + logging.LogErrorf("read attribute view [%s] failed: %s", avID, readErr) + return + } + + attrView = &av.AttributeView{} + if err = gulu.JSON.UnmarshalJSON(data, attrView); nil != err { + logging.LogErrorf("unmarshal attribute view [%s] failed: %s", avID, err) + return + } + + viewable, err = renderAttributeView(attrView) + return +} + func RenderHistoryAttributeView(avID, created string) (viewable av.Viewable, attrView *av.AttributeView, err error) { createdUnix, parseErr := strconv.ParseInt(created, 10, 64) if nil != parseErr {