fix: delete instance data and remove legacy shared workspace support
This commit is contained in:
+14
-28
@@ -80,40 +80,21 @@ func safeRel(p string) (string, error) {
|
||||
return c, nil
|
||||
}
|
||||
|
||||
func workspacePath(uid string) string { return path.Join("workspaces", uid, "files") }
|
||||
|
||||
func (a *API) openWorkspace(u store.User, instanceIDs ...string) (*os.Root, error) {
|
||||
instanceID := ""
|
||||
if len(instanceIDs) > 0 {
|
||||
instanceID = instanceIDs[0]
|
||||
func (a *API) openWorkspace(u store.User, instanceID string) (*os.Root, error) {
|
||||
if instanceID == "" {
|
||||
return nil, errors.New("instance required")
|
||||
}
|
||||
base, err := os.OpenRoot(a.root)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer base.Close()
|
||||
parts := []string{"workspaces", path.Join("workspaces", u.ID), workspacePath(u.ID)}
|
||||
if instanceID != "" {
|
||||
rel := path.Join("workspaces", u.ID, "instances", instanceID, "home")
|
||||
if err := rootSafe(base, rel, false); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return base.OpenRoot(rel)
|
||||
}
|
||||
for _, p := range parts {
|
||||
if err = rootSafe(base, p, true); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if err = base.Mkdir(p, 0750); err != nil && !errors.Is(err, os.ErrExist) {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
if err = base.Chown(workspacePath(u.ID), 1000, 1000); err != nil {
|
||||
rel := path.Join("workspaces", u.ID, "instances", instanceID, "home")
|
||||
if err := rootSafe(base, rel, false); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return base.OpenRoot(workspacePath(u.ID))
|
||||
return base.OpenRoot(rel)
|
||||
}
|
||||
|
||||
func rootSafe(root *os.Root, rel string, finalMayMissing bool) error {
|
||||
if rel == "." {
|
||||
return nil
|
||||
@@ -184,6 +165,10 @@ func (a *API) workspace(w http.ResponseWriter, r *http.Request) {
|
||||
a.readersMu.Unlock()
|
||||
}()
|
||||
}
|
||||
if r.URL.Path == "/api/ws/usage" {
|
||||
a.wsUsage(w, r, u)
|
||||
return
|
||||
}
|
||||
user := a.userLocks.Acquire(u.ID)
|
||||
root, err := a.openWorkspace(u, instanceID)
|
||||
user.Release()
|
||||
@@ -193,8 +178,6 @@ func (a *API) workspace(w http.ResponseWriter, r *http.Request) {
|
||||
}
|
||||
defer root.Close()
|
||||
switch strings.TrimPrefix(r.URL.Path, "/api/ws/") {
|
||||
case "usage":
|
||||
a.wsUsage(w, r, root, u)
|
||||
case "tree":
|
||||
a.wsTree(w, r, root, u)
|
||||
case "mkdir":
|
||||
@@ -219,7 +202,7 @@ func entry(root *os.Root, rel string) (os.FileInfo, error) {
|
||||
return root.Lstat(rel)
|
||||
}
|
||||
|
||||
func (a *API) wsUsage(w http.ResponseWriter, r *http.Request, root *os.Root, u store.User) {
|
||||
func (a *API) wsUsage(w http.ResponseWriter, r *http.Request, u store.User) {
|
||||
if r.Method != "GET" {
|
||||
fail(w, 405, "method not allowed")
|
||||
return
|
||||
@@ -537,6 +520,9 @@ func (a *API) userUsage(u store.User) (int64, error) {
|
||||
}
|
||||
defer base.Close()
|
||||
root, e := base.OpenRoot(path.Join("workspaces", u.ID))
|
||||
if errors.Is(e, os.ErrNotExist) {
|
||||
return 0, nil
|
||||
}
|
||||
if e != nil {
|
||||
return 0, e
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user