Files
many-notes/app/Actions/DeleteVaultNode.php
2025-02-02 18:06:49 +00:00

79 lines
1.7 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Actions;
use App\Models\VaultNode;
use Exception;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Storage;
use Throwable;
final readonly class DeleteVaultNode
{
/**
* Handles the action.
*
* @return array<int, VaultNode>
*/
public function handle(VaultNode $node, bool $deleteFromDisk = true): array
{
try {
DB::beginTransaction();
$deletedNodes = $this->deleteFromDatabase($node);
DB::commit();
} catch (Throwable) {
DB::rollBack();
throw new Exception(__('Something went wrong'));
}
if ($deleteFromDisk) {
$this->deleteFromDisk($node);
}
return $deletedNodes;
}
/**
* Deletes node from the database.
*
* @return array<int, VaultNode>
*/
private function deleteFromDatabase(VaultNode $node): array
{
$deletedNodes = [$node];
if (!$node->is_file) {
foreach ($node->children()->get() as $child) {
$deletedNodes = array_merge(
$deletedNodes,
$this->deleteFromDatabase($child),
);
}
}
$node->delete();
return $deletedNodes;
}
/**
* Deletes node from the disk.
*/
private function deleteFromDisk(VaultNode $node): void
{
$nodePath = new GetPathFromVaultNode()->handle($node);
if (!Storage::disk('local')->exists($nodePath)) {
return;
}
if ($node->is_file) {
Storage::disk('local')->delete($nodePath);
} else {
Storage::disk('local')->deleteDirectory($nodePath);
}
}
}