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)