瀏覽代碼

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

Daniel 1 年之前
父節點
當前提交
cba9f59cfd
共有 2 個文件被更改,包括 116 次插入0 次删除
  1. 2 0
      kernel/api/router.go
  2. 114 0
      kernel/api/sync.go

+ 2 - 0
kernel/api/router.go

@@ -219,7 +219,9 @@ func ServeAPI(ginServer *gin.Engine) {
 	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/importSyncProviderS3", model.CheckAuth, importSyncProviderS3)
 	ginServer.Handle("POST", "/api/sync/exportSyncProviderWebDAV", model.CheckAuth, exportSyncProviderWebDAV)
+	ginServer.Handle("POST", "/api/sync/importSyncProviderWebDAV", model.CheckAuth, importSyncProviderWebDAV)
 
 	ginServer.Handle("POST", "/api/inbox/getShorthands", model.CheckAuth, getShorthands)
 	ginServer.Handle("POST", "/api/inbox/getShorthand", model.CheckAuth, getShorthand)

+ 114 - 0
kernel/api/sync.go

@@ -17,7 +17,9 @@
 package api
 
 import (
+	"encoding/hex"
 	"github.com/siyuan-note/logging"
+	"io"
 	"net/http"
 	"os"
 	"path/filepath"
@@ -30,6 +32,62 @@ import (
 	"github.com/siyuan-note/siyuan/kernel/util"
 )
 
+func importSyncProviderWebDAV(c *gin.Context) {
+	ret := gulu.Ret.NewResult()
+	defer c.JSON(200, ret)
+
+	form, err := c.MultipartForm()
+	if nil != err {
+		logging.LogErrorf("read upload file failed: %s", err)
+		ret.Code = -1
+		ret.Msg = err.Error()
+		return
+	}
+
+	files := form.File["file[]"]
+	if 1 != len(files) {
+		ret.Code = -1
+		ret.Msg = "invalid upload file"
+		return
+	}
+
+	f := files[0]
+	fh, err := f.Open()
+	if nil != err {
+		logging.LogErrorf("read upload file failed: %s", err)
+		ret.Code = -1
+		ret.Msg = err.Error()
+		return
+	}
+
+	data, err := io.ReadAll(fh)
+	fh.Close()
+	if nil != err {
+		logging.LogErrorf("read upload file failed: %s", err)
+		ret.Code = -1
+		ret.Msg = err.Error()
+		return
+	}
+
+	data = util.AESDecrypt(string(data))
+	data, _ = hex.DecodeString(string(data))
+	webdav := &conf.WebDAV{}
+	if err = gulu.JSON.UnmarshalJSON(data, webdav); nil != err {
+		logging.LogErrorf("import S3 provider failed: %s", err)
+		ret.Code = -1
+		ret.Msg = err.Error()
+		return
+	}
+
+	err = model.SetSyncProviderWebDAV(webdav)
+	if nil != err {
+		logging.LogErrorf("import S3 provider failed: %s", err)
+		ret.Code = -1
+		ret.Msg = err.Error()
+		return
+	}
+}
+
 func exportSyncProviderWebDAV(c *gin.Context) {
 	ret := gulu.Ret.NewResult()
 	defer c.JSON(http.StatusOK, ret)
@@ -72,6 +130,62 @@ func exportSyncProviderWebDAV(c *gin.Context) {
 	}
 }
 
+func importSyncProviderS3(c *gin.Context) {
+	ret := gulu.Ret.NewResult()
+	defer c.JSON(200, ret)
+
+	form, err := c.MultipartForm()
+	if nil != err {
+		logging.LogErrorf("read upload file failed: %s", err)
+		ret.Code = -1
+		ret.Msg = err.Error()
+		return
+	}
+
+	files := form.File["file[]"]
+	if 1 != len(files) {
+		ret.Code = -1
+		ret.Msg = "invalid upload file"
+		return
+	}
+
+	f := files[0]
+	fh, err := f.Open()
+	if nil != err {
+		logging.LogErrorf("read upload file failed: %s", err)
+		ret.Code = -1
+		ret.Msg = err.Error()
+		return
+	}
+
+	data, err := io.ReadAll(fh)
+	fh.Close()
+	if nil != err {
+		logging.LogErrorf("read upload file failed: %s", err)
+		ret.Code = -1
+		ret.Msg = err.Error()
+		return
+	}
+
+	data = util.AESDecrypt(string(data))
+	data, _ = hex.DecodeString(string(data))
+	s3 := &conf.S3{}
+	if err = gulu.JSON.UnmarshalJSON(data, s3); nil != err {
+		logging.LogErrorf("import S3 provider failed: %s", err)
+		ret.Code = -1
+		ret.Msg = err.Error()
+		return
+	}
+
+	err = model.SetSyncProviderS3(s3)
+	if nil != err {
+		logging.LogErrorf("import S3 provider failed: %s", err)
+		ret.Code = -1
+		ret.Msg = err.Error()
+		return
+	}
+}
+
 func exportSyncProviderS3(c *gin.Context) {
 	ret := gulu.Ret.NewResult()
 	defer c.JSON(http.StatusOK, ret)