Explorar o código

:art: Add internal kernel API `/api/repo/getRepoFile` https://github.com/siyuan-note/siyuan/issues/10101

Daniel hai 1 ano
pai
achega
ae2fb32569
Modificáronse 3 ficheiros con 66 adicións e 10 borrados
  1. 34 0
      kernel/api/repo.go
  2. 1 0
      kernel/api/router.go
  3. 31 10
      kernel/model/repository.go

+ 34 - 0
kernel/api/repo.go

@@ -18,14 +18,48 @@ package api
 
 import (
 	"fmt"
+	"mime"
 	"net/http"
+	"path/filepath"
 
 	"github.com/88250/gulu"
+	"github.com/gabriel-vasile/mimetype"
 	"github.com/gin-gonic/gin"
 	"github.com/siyuan-note/siyuan/kernel/model"
 	"github.com/siyuan-note/siyuan/kernel/util"
 )
 
+func getRepoFile(c *gin.Context) {
+	// Add internal kernel API `/api/repo/getRepoFile` https://github.com/siyuan-note/siyuan/issues/10101
+
+	ret := gulu.Ret.NewResult()
+	defer c.JSON(http.StatusOK, ret)
+
+	arg, ok := util.JsonArg(c, ret)
+	if !ok {
+		return
+	}
+
+	id := arg["id"].(string)
+	data, p, err := model.GetRepoFile(id)
+	if nil != err {
+		ret.Code = -1
+		ret.Msg = err.Error()
+		return
+	}
+
+	contentType := mime.TypeByExtension(filepath.Ext(p))
+	if "" == contentType {
+		if m := mimetype.Detect(data); nil != m {
+			contentType = m.String()
+		}
+	}
+	if "" == contentType {
+		contentType = "application/octet-stream"
+	}
+	c.Data(http.StatusOK, contentType, data)
+}
+
 func openRepoSnapshotDoc(c *gin.Context) {
 	ret := gulu.Ret.NewResult()
 	defer c.JSON(http.StatusOK, ret)

+ 1 - 0
kernel/api/router.go

@@ -363,6 +363,7 @@ func ServeAPI(ginServer *gin.Engine) {
 	ginServer.Handle("POST", "/api/repo/downloadCloudSnapshot", model.CheckAuth, model.CheckReadonly, downloadCloudSnapshot)
 	ginServer.Handle("POST", "/api/repo/diffRepoSnapshots", model.CheckAuth, diffRepoSnapshots)
 	ginServer.Handle("POST", "/api/repo/openRepoSnapshotDoc", model.CheckAuth, openRepoSnapshotDoc)
+	ginServer.Handle("POST", "/api/repo/getRepoFile", model.CheckAuth, getRepoFile)
 
 	ginServer.Handle("POST", "/api/riff/createRiffDeck", model.CheckAuth, model.CheckReadonly, createRiffDeck)
 	ginServer.Handle("POST", "/api/riff/renameRiffDeck", model.CheckAuth, model.CheckReadonly, renameRiffDeck)

+ 31 - 10
kernel/model/repository.go

@@ -57,18 +57,25 @@ import (
 	"github.com/studio-b12/gowebdav"
 )
 
-func init() {
-	subscribeRepoEvents()
-}
+func GetRepoFile(fileID string) (ret []byte, p string, err error) {
+	if 1 > len(Conf.Repo.Key) {
+		err = errors.New(Conf.Language(26))
+		return
+	}
 
-type Snapshot struct {
-	*dejavu.Log
-	TypesCount []*TypeCount `json:"typesCount"`
-}
+	repo, err := newRepository()
+	if nil != err {
+		return
+	}
 
-type TypeCount struct {
-	Type  string `json:"type"`
-	Count int    `json:"count"`
+	file, err := repo.GetFile(fileID)
+	if nil != err {
+		return
+	}
+
+	ret, err = repo.OpenFile(file)
+	p = file.Path
+	return
 }
 
 func OpenRepoSnapshotDoc(fileID string) (content string, isProtyleDoc bool, updated int64, err error) {
@@ -327,6 +334,16 @@ func parseTreeInSnapshot(data []byte, luteEngine *lute.Lute) (isProtyleDoc bool,
 	return
 }
 
+type Snapshot struct {
+	*dejavu.Log
+	TypesCount []*TypeCount `json:"typesCount"`
+}
+
+type TypeCount struct {
+	Type  string `json:"type"`
+	Count int    `json:"count"`
+}
+
 func GetRepoSnapshots(page int) (ret []*Snapshot, pageCount, totalCount int, err error) {
 	ret = []*Snapshot{}
 	if 1 > len(Conf.Repo.Key) {
@@ -1570,6 +1587,10 @@ func newRepository() (ret *dejavu.Repo, err error) {
 	return
 }
 
+func init() {
+	subscribeRepoEvents()
+}
+
 func subscribeRepoEvents() {
 	eventbus.Subscribe(eventbus.EvtIndexBeforeWalkData, func(context map[string]interface{}, path string) {
 		msg := fmt.Sprintf(Conf.Language(158), path)