diff --git a/server/internal/api/v1/fs/cp.go b/server/internal/api/v1/fs/cp.go index 90082578..7b733c56 100644 --- a/server/internal/api/v1/fs/cp.go +++ b/server/internal/api/v1/fs/cp.go @@ -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) diff --git a/server/internal/api/v1/fs/mv.go b/server/internal/api/v1/fs/mv.go index 982c9eb7..28204ecc 100644 --- a/server/internal/api/v1/fs/mv.go +++ b/server/internal/api/v1/fs/mv.go @@ -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) diff --git a/server/internal/api/webdav/impl/copy_move.go b/server/internal/api/webdav/impl/copy_move.go index 4215d28f..2d68b1f5 100644 --- a/server/internal/api/webdav/impl/copy_move.go +++ b/server/internal/api/webdav/impl/copy_move.go @@ -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 } diff --git a/server/internal/api/webdav/impl/webdav.go b/server/internal/api/webdav/impl/webdav.go index 3e3e5f6b..9b9f2175 100644 --- a/server/internal/api/webdav/impl/webdav.go +++ b/server/internal/api/webdav/impl/webdav.go @@ -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) { diff --git a/server/internal/command/fs/cp.go b/server/internal/command/fs/cp.go index 9fbd5445..22188b4a 100644 --- a/server/internal/command/fs/cp.go +++ b/server/internal/command/fs/cp.go @@ -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) } diff --git a/server/internal/command/fs/mv.go b/server/internal/command/fs/mv.go index 4d52af11..ace7ad5f 100644 --- a/server/internal/command/fs/mv.go +++ b/server/internal/command/fs/mv.go @@ -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) } diff --git a/server/internal/core/fs/copy_move.go b/server/internal/core/fs/copy_move.go index a2015ab4..2fc9fd84 100644 --- a/server/internal/core/fs/copy_move.go +++ b/server/internal/core/fs/copy_move.go @@ -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: ?? diff --git a/server/internal/core/fs/fs.go b/server/internal/core/fs/fs.go index 958af57c..9776e5d8 100644 --- a/server/internal/core/fs/fs.go +++ b/server/internal/core/fs/fs.go @@ -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 {