[server] Move delete functionality from filesystem into resource

This commit is contained in:
Abhishek Shroff
2024-10-25 00:16:16 +05:30
parent af10d60b82
commit d196afd8d9
15 changed files with 71 additions and 41 deletions

View File

@@ -17,7 +17,7 @@ func handleRmRequest(c *gin.Context) {
if err != nil {
panic(err)
}
if err := fs.DeleteRecursive(r, true); err != nil {
if err := r.DeleteRecursive(true); err != nil {
panic(err)
}

View File

@@ -38,7 +38,6 @@ type Handler struct {
type FileSystem interface {
ResourceByPath(name string) (fs.Resource, error)
CreateResourceByPath(name string, dir, recursive bool) (fs.Resource, error)
DeleteRecursive(r fs.Resource, hardDelete bool) error
Move(r fs.Resource, target string, overwrite bool) (fs.Resource, bool, error)
Copy(r fs.Resource, target string, id uuid.UUID, recursive, overwrite bool) (fs.Resource, bool, error)
ReadDir(r serve.Resource, recursive bool) ([]serve.Resource, error)
@@ -249,7 +248,7 @@ func (h *Handler) handleDelete(_ http.ResponseWriter, r *http.Request) (status i
return http.StatusNotFound, err
}
return http.StatusMethodNotAllowed, err
} else if err := h.FileSystem.DeleteRecursive(r, false); err != nil {
} else if err := r.DeleteRecursive(false); err != nil {
return http.StatusMethodNotAllowed, err
}
return http.StatusNoContent, nil

View File

@@ -113,7 +113,7 @@ func setupImportCommand() *cobra.Command {
err = db.Get().WithTx(ctx, func(dbh *db.DbHandler) error {
f := f.WithDb(dbh)
if force {
if err := f.DeleteChildRecursive(destParent, destName, false); !errors.Is(err, fs.ErrResourceNotFound) {
if err := destParent.DeleteChildRecursive(destName, false); !errors.Is(err, fs.ErrResourceNotFound) {
return err
}
} else {

View File

@@ -29,7 +29,7 @@ func setupRmCommand() *cobra.Command {
}
}
f.DeleteRecursive(r, true)
r.DeleteRecursive(true)
},
}
cmd.Flags().BoolP("recursive", "r", false, "Recursive (required for directories)")

View File

@@ -44,7 +44,7 @@ func (f filesystem) Move(r Resource, target string, overwrite bool) (Resource, b
return result, deleted, f.db.WithTx(f.ctx, func(dbh *db.DbHandler) error {
f = f.withDb(dbh)
if overwrite {
if err := f.DeleteChildRecursive(destParent, destName, false); err == nil {
if err := destParent.DeleteChildRecursive(destName, false); err == nil {
deleted = true
} else if !errors.Is(err, ErrResourceNotFound) {
return err
@@ -56,7 +56,7 @@ func (f filesystem) Move(r Resource, target string, overwrite bool) (Resource, b
}
return err
} else {
result = ResourceFromDB(r, 0, "", "")
result = ResourceFromDB(r)
return nil
}
})
@@ -135,7 +135,7 @@ func (f filesystem) Copy(src Resource, target string, id uuid.UUID, recursive, o
err = f.db.WithTx(f.ctx, func(dbh *db.DbHandler) error {
f := f.withDb(dbh)
if overwrite {
if err := f.DeleteChildRecursive(destParent, destName, false); err == nil {
if err := destParent.DeleteChildRecursive(destName, false); err == nil {
deleted = true
} else if !errors.Is(err, ErrResourceNotFound) {
return err
@@ -162,6 +162,7 @@ func (f filesystem) Copy(src Resource, target string, id uuid.UUID, recursive, o
}
var dest = Resource{
f: f,
ID: id,
ParentID: &destParent.ID,
Name: destName,

View File

@@ -3,6 +3,7 @@ package fs
import (
"errors"
"strings"
"time"
"github.com/google/uuid"
"github.com/shroff/phylum/server/internal/core/db"
@@ -63,5 +64,29 @@ func (f filesystem) CreateMemberResource(r Resource, id uuid.UUID, name string,
if err != nil {
return Resource{}, err
}
return ResourceFromDB(result, r.UserPermissions, r.Path+"/"+result.Name, p), nil
var deleted *time.Time
if result.Deleted.Valid {
deleted = &result.Deleted.Time
}
path := r.Path + "/" + result.Name
if r.Path == "/" {
path = result.Name
}
return Resource{
f: f,
ID: result.ID,
ParentID: result.Parent,
Name: result.Name,
Created: result.Created.Time,
Modified: result.Modified.Time,
Deleted: deleted,
Dir: result.Dir,
ContentSize: result.ContentSize,
ContentType: result.ContentType,
ContentSHA256: result.ContentSha256,
Permissions: string(result.Permissions),
Path: path,
UserPermissions: r.UserPermissions,
InheritedPermissions: p,
}, nil
}

View File

@@ -9,36 +9,36 @@ import (
"github.com/sirupsen/logrus"
)
func (f filesystem) DeleteChildRecursive(r Resource, name string, hardDelete bool) error {
func (r Resource) DeleteChildRecursive(name string, hardDelete bool) error {
if !r.hasPermission(PermissionWrite) {
return ErrInsufficientPermissions
}
id, err := f.db.ChildResourceIDByName(f.ctx, db.ChildResourceIDByNameParams{Parent: r.ID, Name: name})
id, err := r.f.db.ChildResourceIDByName(r.f.ctx, db.ChildResourceIDByNameParams{Parent: r.ID, Name: name})
if err != nil {
if errors.Is(err, pgx.ErrNoRows) {
return ErrResourceNotFound
}
return err
}
return deleteRecursive(f, id, r.ID, hardDelete)
return r.f.deleteRecursive(id, r.ID, hardDelete)
}
func (f filesystem) DeleteRecursive(r Resource, hardDelete bool) error {
func (r Resource) DeleteRecursive(hardDelete bool) error {
if r.ParentID == nil {
return ErrInsufficientPermissions
}
parent, err := f.ResourceByID(*r.ParentID)
parent, err := r.f.ResourceByID(*r.ParentID)
if err != nil {
return err
}
if !parent.hasPermission(PermissionWrite) {
return ErrInsufficientPermissions
}
return deleteRecursive(f, r.ID, parent.ID, hardDelete)
return r.f.deleteRecursive(r.ID, parent.ID, hardDelete)
}
func deleteRecursive(f filesystem, id, parent uuid.UUID, hardDelete bool) error {
func (f filesystem) deleteRecursive(id, parent uuid.UUID, hardDelete bool) error {
var deleted []db.DeleteRecursiveRow
err := f.db.WithTx(f.ctx, func(d *db.DbHandler) error {
var err error

View File

@@ -9,14 +9,14 @@ import (
)
func (f filesystem) ResourceByPath(path string) (Resource, error) {
return resourceFromResult(f.db.ResourceByPath(f.ctx, db.ResourceByPathParams{Root: f.rootID, Path: path, Username: f.username}))
return f.resourceFromResult(f.db.ResourceByPath(f.ctx, db.ResourceByPathParams{Root: f.rootID, Path: path, Username: f.username}))
}
func (f filesystem) ResourceByID(id uuid.UUID) (Resource, error) {
return resourceFromResult(f.db.ResourceByID(f.ctx, db.ResourceByIDParams{Root: f.rootID, ResourceID: id, Username: f.username}))
return f.resourceFromResult(f.db.ResourceByID(f.ctx, db.ResourceByIDParams{Root: f.rootID, ResourceID: id, Username: f.username}))
}
func resourceFromResult(r db.ResourceResult, err error) (Resource, error) {
func (f filesystem) resourceFromResult(r db.ResourceResult, err error) (Resource, error) {
if err == pgx.ErrNoRows || !r.Found || (r.UserPermission&PermissionRead == 0) {
err = ErrResourceNotFound
}
@@ -29,6 +29,7 @@ func resourceFromResult(r db.ResourceResult, err error) (Resource, error) {
delTime = &r.Deleted.Time
}
return Resource{
f: f,
ID: r.ID,
ParentID: r.Parent,
Name: r.Name,

View File

@@ -33,10 +33,6 @@ type FileSystem interface {
ReadDir(r serve.Resource, recursive bool) ([]serve.Resource, error)
ProcessResources(r serve.Resource, depth int, fn func(serve.Resource) error) error
// delete.go
DeleteChildRecursive(r Resource, name string, hardDelete bool) error
DeleteRecursive(r Resource, hardDelete bool) error
// copy_move.go
Move(r Resource, target string, overwrite bool) (Resource, bool, error)
Copy(r Resource, target string, id uuid.UUID, recursive, overwrite bool) (Resource, bool, error)

View File

@@ -61,6 +61,7 @@ func (f filesystem) ReadDir(sr serve.Resource, recursive bool) ([]serve.Resource
path = c.Path
}
result[i] = Resource{
f: f,
ID: c.ID,
ParentID: c.Parent,
Name: c.Name,

View File

@@ -34,6 +34,7 @@ func (f filesystem) ResourceByPath(path string) (Resource, error) {
}
return Resource{
f: f,
id: r.ID,
name: r.Name,
dir: r.Dir,
@@ -66,6 +67,7 @@ func (f filesystem) ReadDir(r Resource, recursive bool) ([]Resource, error) {
for i, c := range children {
result[i] = Resource{
f: f,
id: c.ID,
name: c.Name,
dir: c.Dir,

View File

@@ -7,6 +7,7 @@ import (
)
type Resource struct {
f filesystem
id uuid.UUID
name string
dir bool

View File

@@ -8,6 +8,7 @@ import (
)
type Resource struct {
f filesystem
ID uuid.UUID `json:"id"`
ParentID *uuid.UUID `json:"parent"`
Name string `json:"name"`
@@ -33,25 +34,28 @@ func (r Resource) FSContentSize() int64 { return r.ContentSize }
func (r Resource) FSContentSHA256() string { return r.ContentSHA256 }
func (r Resource) FSContentType() string { return r.ContentType }
func ResourceFromDB(r db.Resource, userPermissions int32, path, inheritedPermissions string) Resource {
func ResourceFromDB(r db.Resource) Resource {
var deleted *time.Time
if r.Deleted.Valid {
deleted = &r.Deleted.Time
}
return Resource{
ID: r.ID,
ParentID: r.Parent,
Name: r.Name,
Created: r.Created.Time,
Modified: r.Modified.Time,
Deleted: deleted,
Dir: r.Dir,
ContentSize: r.ContentSize,
ContentType: r.ContentType,
ContentSHA256: r.ContentSha256,
Permissions: string(r.Permissions),
Path: path,
UserPermissions: userPermissions,
InheritedPermissions: inheritedPermissions,
ID: r.ID,
ParentID: r.Parent,
Name: r.Name,
Created: r.Created.Time,
Modified: r.Modified.Time,
Deleted: deleted,
Dir: r.Dir,
ContentSize: r.ContentSize,
ContentType: r.ContentType,
ContentSHA256: r.ContentSha256,
Permissions: string(r.Permissions),
// Not Needed
// f: f,
// Path: "",
// UserPermissions: 0,
// InheritedPermissions: "",
}
}

View File

@@ -28,5 +28,5 @@ func (f filesystem) UpdatePermissions(r Resource, username string, permission Pe
if err != nil {
return Resource{}, err
}
return ResourceFromDB(res, r.UserPermissions, r.Path, r.InheritedPermissions), nil
return ResourceFromDB(res), nil
}

View File

@@ -15,7 +15,7 @@ func (m manager) SharedResources(u User) ([]fs.Resource, error) {
result := make([]fs.Resource, len(res))
for i, r := range res {
result[i] = fs.ResourceFromDB(r, 0, "", "")
result[i] = fs.ResourceFromDB(r)
}
return result, err
}
@@ -37,7 +37,7 @@ func (m manager) Bookmarks(u User) ([]fs.Resource, error) {
result := make([]fs.Resource, len(res))
for i, r := range res {
result[i] = fs.ResourceFromDB(r, 0, "", "")
result[i] = fs.ResourceFromDB(r)
}
return result, err
}