mirror of
https://codeberg.org/shroff/phylum.git
synced 2026-02-09 04:59:36 -06:00
73 lines
1.8 KiB
Go
73 lines
1.8 KiB
Go
package fs
|
|
|
|
import (
|
|
"errors"
|
|
"time"
|
|
|
|
"github.com/google/uuid"
|
|
"github.com/jackc/pgx/v5"
|
|
"github.com/shroff/phylum/server/internal/core/db"
|
|
"github.com/sirupsen/logrus"
|
|
)
|
|
|
|
func (r Resource) DeleteChildRecursive(name string, hardDelete bool) (ResourceInfo, error) {
|
|
if !r.hasPermission(PermissionWrite) {
|
|
return ResourceInfo{}, ErrInsufficientPermissions
|
|
}
|
|
|
|
c, err := r.f.db.ChildResourceByName(r.f.ctx, db.ChildResourceByNameParams{Parent: r.ID(), Name: name})
|
|
if err != nil {
|
|
if errors.Is(err, pgx.ErrNoRows) {
|
|
err = ErrResourceNotFound
|
|
}
|
|
return ResourceInfo{}, err
|
|
}
|
|
if err := r.f.deleteRecursive(c.ID, r.ID(), hardDelete, false); err != nil {
|
|
return ResourceInfo{}, err
|
|
}
|
|
deleted := time.Now()
|
|
r.Info.deleted = &deleted
|
|
return r.Info, nil
|
|
}
|
|
|
|
func (r Resource) DeleteRecursive(hardDelete bool) (ResourceInfo, error) {
|
|
if r.ParentID() == nil {
|
|
return ResourceInfo{}, ErrInsufficientPermissions
|
|
}
|
|
parent, err := r.f.ResourceByID(*r.ParentID())
|
|
if err == nil && !parent.hasPermission(PermissionWrite) {
|
|
err = ErrInsufficientPermissions
|
|
}
|
|
if err != nil {
|
|
return ResourceInfo{}, err
|
|
}
|
|
if err := r.f.deleteRecursive(r.ID(), r.ID(), hardDelete, false); err != nil {
|
|
return ResourceInfo{}, err
|
|
}
|
|
deleted := time.Now()
|
|
r.Info.deleted = &deleted
|
|
return r.Info, nil
|
|
}
|
|
|
|
func (f filesystem) deleteRecursive(id, parent uuid.UUID, hardDelete, preserveRoot bool) error {
|
|
var deleted []db.DeleteRecursiveRow
|
|
err := f.db.WithTx(f.ctx, func(d *db.DbHandler) error {
|
|
var err error
|
|
if deleted, err = d.DeleteRecursive(f.ctx, db.DeleteRecursiveParams{ID: id, PreserveRoot: preserveRoot}); err != nil {
|
|
return err
|
|
}
|
|
|
|
return d.UpdateResourceModified(f.ctx, parent)
|
|
})
|
|
|
|
if err == nil && hardDelete {
|
|
errors := f.cs.DeleteAll(deleted)
|
|
for _, err := range errors {
|
|
logrus.Warn(err)
|
|
}
|
|
}
|
|
|
|
return err
|
|
|
|
}
|