mirror of
https://codeberg.org/shroff/phylum.git
synced 2026-01-05 19:21:23 -06:00
[server] Move copy/move into Resource
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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: ??
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user