fix: delete instance data and remove legacy shared workspace support

This commit is contained in:
2026-10-15 10:55:21 +08:00
parent ee22603726
commit 22a5f64edc
16 changed files with 286 additions and 142 deletions
+14 -28
View File
@@ -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
}