Forráskód Böngészése

:art: Support exporting/importing S3 and WebDAV configurations https://github.com/siyuan-note/siyuan/issues/9566

Daniel 1 éve
szülő
commit
8ce4c7987b
2 módosított fájl, 90 hozzáadás és 0 törlés
  1. 2 0
      kernel/api/router.go
  2. 88 0
      kernel/api/sync.go

+ 2 - 0
kernel/api/router.go

@@ -218,6 +218,8 @@ func ServeAPI(ginServer *gin.Engine) {
 	ginServer.Handle("POST", "/api/sync/performBootSync", model.CheckAuth, model.CheckReadonly, performBootSync)
 	ginServer.Handle("POST", "/api/sync/getBootSync", model.CheckAuth, getBootSync)
 	ginServer.Handle("POST", "/api/sync/getSyncInfo", model.CheckAuth, getSyncInfo)
+	ginServer.Handle("POST", "/api/sync/exportSyncProviderS3", model.CheckAuth, exportSyncProviderS3)
+	ginServer.Handle("POST", "/api/sync/exportSyncProviderWebDAV", model.CheckAuth, exportSyncProviderWebDAV)
 
 	ginServer.Handle("POST", "/api/inbox/getShorthands", model.CheckAuth, getShorthands)
 	ginServer.Handle("POST", "/api/inbox/getShorthand", model.CheckAuth, getShorthand)

+ 88 - 0
kernel/api/sync.go

@@ -17,7 +17,11 @@
 package api
 
 import (
+	"github.com/siyuan-note/logging"
 	"net/http"
+	"os"
+	"path/filepath"
+	"time"
 
 	"github.com/88250/gulu"
 	"github.com/gin-gonic/gin"
@@ -26,6 +30,90 @@ import (
 	"github.com/siyuan-note/siyuan/kernel/util"
 )
 
+func exportSyncProviderWebDAV(c *gin.Context) {
+	ret := gulu.Ret.NewResult()
+	defer c.JSON(http.StatusOK, ret)
+
+	name := "siyuan-webdav-" + time.Now().Format("20060102150405") + ".json"
+	tmpDir := filepath.Join(util.TempDir, "export")
+	if err := os.MkdirAll(tmpDir, 0755); nil != err {
+		logging.LogErrorf("export WebDAV provider failed: %s", err)
+		ret.Code = -1
+		ret.Msg = err.Error()
+		return
+	}
+
+	webdav := model.Conf.Sync.WebDAV
+	if nil == webdav {
+		webdav = &conf.WebDAV{}
+	}
+
+	data, err := gulu.JSON.MarshalJSON(model.Conf.Sync.WebDAV)
+	if nil != err {
+		logging.LogErrorf("export WebDAV provider failed: %s", err)
+		ret.Code = -1
+		ret.Msg = err.Error()
+		return
+	}
+
+	dataStr := util.AESEncrypt(string(data))
+	tmp := filepath.Join(tmpDir, name)
+	if err = os.WriteFile(tmp, []byte(dataStr), 0644); nil != err {
+		logging.LogErrorf("export WebDAV provider failed: %s", err)
+		ret.Code = -1
+		ret.Msg = err.Error()
+		return
+	}
+
+	zipPath := "/export/" + name
+	ret.Data = map[string]interface{}{
+		"name": name,
+		"zip":  zipPath,
+	}
+}
+
+func exportSyncProviderS3(c *gin.Context) {
+	ret := gulu.Ret.NewResult()
+	defer c.JSON(http.StatusOK, ret)
+
+	name := "siyuan-s3-" + time.Now().Format("20060102150405") + ".json"
+	tmpDir := filepath.Join(util.TempDir, "export")
+	if err := os.MkdirAll(tmpDir, 0755); nil != err {
+		logging.LogErrorf("export S3 provider failed: %s", err)
+		ret.Code = -1
+		ret.Msg = err.Error()
+		return
+	}
+
+	s3 := model.Conf.Sync.S3
+	if nil == s3 {
+		s3 = &conf.S3{}
+	}
+
+	data, err := gulu.JSON.MarshalJSON(model.Conf.Sync.S3)
+	if nil != err {
+		logging.LogErrorf("export S3 provider failed: %s", err)
+		ret.Code = -1
+		ret.Msg = err.Error()
+		return
+	}
+
+	dataStr := util.AESEncrypt(string(data))
+	tmp := filepath.Join(tmpDir, name)
+	if err = os.WriteFile(tmp, []byte(dataStr), 0644); nil != err {
+		logging.LogErrorf("export S3 provider failed: %s", err)
+		ret.Code = -1
+		ret.Msg = err.Error()
+		return
+	}
+
+	zipPath := "/export/" + name
+	ret.Data = map[string]interface{}{
+		"name": name,
+		"zip":  zipPath,
+	}
+}
+
 func getSyncInfo(c *gin.Context) {
 	ret := gulu.Ret.NewResult()
 	defer c.JSON(http.StatusOK, ret)