mirror of
https://codeberg.org/shroff/phylum.git
synced 2026-01-07 12:10:26 -06:00
[server] Move delete functionality from filesystem into resource
This commit is contained in:
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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)")
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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: "",
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user