[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
+4 -3
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,
+26 -1
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
}
+7 -7
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
+4 -3
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,
-4
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)
+1
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,
@@ -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,
@@ -7,6 +7,7 @@ import (
)
type Resource struct {
f filesystem
id uuid.UUID
name string
dir bool
+19 -15
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: "",
}
}
+1 -1
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
}
+2 -2
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
}