From df991abe98a67b4f646447b6849f24a97d2adc46 Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Fri, 7 Jul 2023 18:55:52 +0800 Subject: [PATCH] :art: Improve create workspace interaction https://github.com/siyuan-note/siyuan/issues/8700 --- kernel/api/router.go | 1 + kernel/api/workspace.go | 43 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/kernel/api/router.go b/kernel/api/router.go index cd50cbc19..fa69ad0a9 100644 --- a/kernel/api/router.go +++ b/kernel/api/router.go @@ -47,6 +47,7 @@ func ServeAPI(ginServer *gin.Engine) { ginServer.Handle("POST", "/api/system/setWorkspaceDir", model.CheckAuth, model.CheckReadonly, setWorkspaceDir) ginServer.Handle("POST", "/api/system/getWorkspaces", model.CheckAuth, getWorkspaces) ginServer.Handle("POST", "/api/system/getMobileWorkspaces", model.CheckAuth, getMobileWorkspaces) + ginServer.Handle("POST", "/api/system/checkWorkspaceDir", model.CheckAuth, model.CheckReadonly, checkWorkspaceDir) ginServer.Handle("POST", "/api/system/createWorkspaceDir", model.CheckAuth, model.CheckReadonly, createWorkspaceDir) ginServer.Handle("POST", "/api/system/removeWorkspaceDir", model.CheckAuth, model.CheckReadonly, removeWorkspaceDir) ginServer.Handle("POST", "/api/system/setAppearanceMode", model.CheckAuth, setAppearanceMode) diff --git a/kernel/api/workspace.go b/kernel/api/workspace.go index c898981e7..09a4dfaa6 100644 --- a/kernel/api/workspace.go +++ b/kernel/api/workspace.go @@ -34,6 +34,49 @@ import ( "github.com/siyuan-note/siyuan/kernel/util" ) +func checkWorkspaceDir(c *gin.Context) { + ret := gulu.Ret.NewResult() + defer c.JSON(http.StatusOK, ret) + + arg, ok := util.JsonArg(c, ret) + if !ok { + return + } + + path := arg["path"].(string) + if isInvalidWorkspacePath(path) { + ret.Code = -1 + ret.Msg = "This workspace name is not allowed, please use another name" + return + } + + if !gulu.File.IsExist(path) { + ret.Code = -1 + ret.Msg = "This workspace does not exist" + return + } + + entries, err := os.ReadDir(path) + if nil != err { + ret.Code = -1 + ret.Msg = fmt.Sprintf("read workspace dir [%s] failed: %s", path, err) + } + + var existsConf, existsData bool + for _, entry := range entries { + existsConf = "conf" == entry.Name() && entry.IsDir() + existsData = "data" == entry.Name() && entry.IsDir() + } + + if existsConf { + existsConf = gulu.File.IsExist(filepath.Join(path, "conf", "conf.json")) + } + + ret.Data = map[string]interface{}{ + "isWorkspace": existsConf && existsData, + } +} + func createWorkspaceDir(c *gin.Context) { ret := gulu.Ret.NewResult() defer c.JSON(http.StatusOK, ret)