[server] Move copy/move into Resource

This commit is contained in:
Abhishek Shroff
2024-10-25 01:07:46 +05:30
parent 1ac824e4c3
commit 4670da07c1
8 changed files with 31 additions and 38 deletions

View File

@@ -30,7 +30,7 @@ func handleCpRequest(c *gin.Context) {
panic(err)
}
if r, _, err := fs.Copy(r, params.Target, params.ID, true, params.Overwrite); err != nil {
if r, _, err := r.Copy(params.Target, params.ID, true, params.Overwrite); err != nil {
panic(err)
} else {
c.JSON(200, r)

View File

@@ -29,7 +29,7 @@ func handleMvRequest(c *gin.Context) {
panic(err)
}
if r, _, err := fs.Move(r, params.Target, params.Overwrite); err != nil {
if r, _, err := r.Move(params.Target, params.Overwrite); err != nil {
panic(err)
} else {
c.JSON(200, r)

View File

@@ -90,7 +90,7 @@ func moveFiles(fs FileSystem, srcPath, dstPath string, overwrite bool) (status i
}
return http.StatusInternalServerError, err
} else {
if _, deleted, err := fs.Move(src, dstPath, overwrite); err != nil {
if _, deleted, err := src.Move(dstPath, overwrite); err != nil {
if e, ok := err.(*errors.Error); ok {
return e.Status, e
}
@@ -116,7 +116,7 @@ func copyFiles(fs FileSystem, srcPath, dstPath string, overwrite bool, depth int
return http.StatusInternalServerError, err
} else {
id, _ := uuid.NewUUID()
if _, deleted, err := fs.Copy(src, dstPath, id, depth != 0, overwrite); err != nil {
if _, deleted, err := src.Copy(dstPath, id, depth != 0, overwrite); err != nil {
if e, ok := err.(*errors.Error); ok {
return e.Status, e
}

View File

@@ -15,7 +15,6 @@ import (
"strings"
"time"
"github.com/google/uuid"
"github.com/shroff/phylum/server/internal/api/serve"
"github.com/shroff/phylum/server/internal/core/fs"
)
@@ -38,8 +37,6 @@ type Handler struct {
type FileSystem interface {
ResourceByPath(name string) (fs.Resource, error)
CreateResourceByPath(name string, dir, recursive bool) (fs.Resource, 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)
}
func (h *Handler) stripPrefix(p string) (string, int, error) {

View File

@@ -32,7 +32,7 @@ func setupCpCommand() *cobra.Command {
}
id, _ := uuid.NewUUID()
if _, _, err := f.Copy(src, args[1], id, true, force); err != nil {
if _, _, err := src.Copy(args[1], id, true, force); err != nil {
fmt.Println("cannot copy'" + srcPathOrUUID + "' to '" + args[1] + "': " + err.Error())
os.Exit(1)
}

View File

@@ -24,7 +24,7 @@ func setupMvCommand() *cobra.Command {
force, _ := cmd.Flags().GetBool("force")
if _, _, err := f.Move(src, args[1], force); err != nil {
if _, _, err := src.Move(args[1], force); err != nil {
fmt.Println("cannot move'" + srcPathOrUUID + "' to '" + args[1] + "': " + err.Error())
os.Exit(1)
}

View File

@@ -10,13 +10,13 @@ import (
"github.com/sirupsen/logrus"
)
func (f filesystem) Move(r Resource, target string, overwrite bool) (Resource, bool, error) {
func (r Resource) Move(target string, overwrite bool) (Resource, bool, error) {
if r.ParentID == nil {
return Resource{}, false, ErrInsufficientPermissions
}
// Check source directory permissions
parent, err := f.ResourceByID(*r.ParentID)
parent, err := r.f.ResourceByID(*r.ParentID)
if err != nil {
return Resource{}, false, err
}
@@ -25,7 +25,7 @@ func (f filesystem) Move(r Resource, target string, overwrite bool) (Resource, b
}
// Check destParent directory permissions (if applicable)
destParent, destName, err := f.targetByPathOrUUID(r, target)
destParent, destName, err := r.f.targetByPathOrUUID(r, target)
if err != nil {
if errors.Is(err, ErrResourceNotFound) {
err = ErrParentNotFound
@@ -35,14 +35,14 @@ func (f filesystem) Move(r Resource, target string, overwrite bool) (Resource, b
if !destParent.hasPermission(PermissionWrite) {
return Resource{}, false, ErrInsufficientPermissions
}
if res, err := f.db.ResourceByID(f.ctx, db.ResourceByIDParams{Root: r.ID, ResourceID: destParent.ID, Username: f.username}); err != nil || res.Found {
if res, err := r.f.db.ResourceByID(r.f.ctx, db.ResourceByIDParams{Root: r.ID, ResourceID: destParent.ID, Username: r.f.username}); err != nil || res.Found {
return Resource{}, false, ErrResourceMoveTargetSubdirectory
}
var result Resource
var deleted = false
return result, deleted, f.db.WithTx(f.ctx, func(dbh *db.DbHandler) error {
f = f.withDb(dbh)
return result, deleted, r.f.db.WithTx(r.f.ctx, func(dbh *db.DbHandler) error {
f := r.f.withDb(dbh)
if overwrite {
if err := destParent.DeleteChildRecursive(destName, false); err == nil {
deleted = true
@@ -62,14 +62,14 @@ func (f filesystem) Move(r Resource, target string, overwrite bool) (Resource, b
})
}
func (f filesystem) Copy(src Resource, target string, id uuid.UUID, recursive, overwrite bool) (Resource, bool, error) {
func (r Resource) Copy(target string, id uuid.UUID, recursive, overwrite bool) (Resource, bool, error) {
// Check source directory permissions
if !src.hasPermission(PermissionRead) {
if !r.hasPermission(PermissionRead) {
return Resource{}, false, ErrInsufficientPermissions
}
// Check dest directory permissions
destParent, destName, err := f.targetByPathOrUUID(src, target)
destParent, destName, err := r.f.targetByPathOrUUID(r, target)
if err != nil {
if errors.Is(err, ErrResourceNotFound) {
err = ErrParentNotFound
@@ -85,9 +85,9 @@ func (f filesystem) Copy(src Resource, target string, id uuid.UUID, recursive, o
}
var tree []db.ReadDirRow
if recursive && src.Dir {
if recursive && r.Dir {
var err error
tree, err = f.db.ReadDir(f.ctx, db.ReadDirParams{ID: src.ID, IncludeRoot: false, Recursive: true})
tree, err = r.f.db.ReadDir(r.f.ctx, db.ReadDirParams{ID: r.ID, IncludeRoot: false, Recursive: true})
if err != nil {
return Resource{}, false, err
}
@@ -95,20 +95,20 @@ func (f filesystem) Copy(src Resource, target string, id uuid.UUID, recursive, o
create := make([]db.CreateResourcesParams, 0, len(tree)+1)
copy := make(map[uuid.UUID]uuid.UUID)
ids := make(map[string]uuid.UUID)
if src.Dir {
if r.Dir {
ids[""] = id
} else {
copy[src.ID] = id
copy[r.ID] = id
}
create = append(create, db.CreateResourcesParams{
ID: id,
Parent: destParent.ID,
Name: destName,
Dir: src.Dir,
ContentSize: src.ContentSize,
ContentType: src.ContentType,
ContentSha256: src.ContentSHA256,
Dir: r.Dir,
ContentSize: r.ContentSize,
ContentType: r.ContentType,
ContentSha256: r.ContentSHA256,
})
for _, src := range tree {
id, _ := uuid.NewUUID()
@@ -132,8 +132,8 @@ func (f filesystem) Copy(src Resource, target string, id uuid.UUID, recursive, o
}
var deleted = false
err = f.db.WithTx(f.ctx, func(dbh *db.DbHandler) error {
f := f.withDb(dbh)
err = r.f.db.WithTx(r.f.ctx, func(dbh *db.DbHandler) error {
f := r.f.withDb(dbh)
if overwrite {
if err := destParent.DeleteChildRecursive(destName, false); err == nil {
deleted = true
@@ -153,7 +153,7 @@ func (f filesystem) Copy(src Resource, target string, id uuid.UUID, recursive, o
if err == nil {
func() {
for k, v := range copy {
if err := f.cs.CopyContents(k, v); err != nil {
if err := r.f.cs.CopyContents(k, v); err != nil {
logrus.Warn("unable to copy " + k.String() + " to " + v.String() + ": " + err.Error())
}
}
@@ -162,17 +162,17 @@ func (f filesystem) Copy(src Resource, target string, id uuid.UUID, recursive, o
}
var dest = Resource{
f: f,
f: r.f,
ID: id,
ParentID: &destParent.ID,
Name: destName,
Dir: src.Dir,
Dir: r.Dir,
Created: time.Now(),
Modified: time.Now(),
Deleted: nil,
ContentSize: src.ContentSize,
ContentType: src.ContentType,
ContentSHA256: src.ContentSHA256,
ContentSize: r.ContentSize,
ContentType: r.ContentType,
ContentSHA256: r.ContentSHA256,
Permissions: "{}",
// Not Needed
// UserPermissions: ??

View File

@@ -23,10 +23,6 @@ type FileSystem interface {
ResourceByID(id uuid.UUID) (Resource, error)
ResourceByPath(path string) (Resource, error)
ResourceByPathOrUUID(pathOrUUID string) (Resource, 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)
}
func Open(ctx context.Context, username string, root uuid.UUID) FileSystem {