fix: deletes media file when download deleted

This commit is contained in:
2025-07-15 23:53:19 -05:00
parent a126871af8
commit 5e722dcbc7
16 changed files with 180 additions and 6 deletions

View File

@@ -0,0 +1,16 @@
<?php
namespace App\Library\Action\Command;
use OneToMany\RichBundle\Contract\CommandInterface;
/**
* @implements CommandInterface<DeleteMediaFileCommand>
*/
class DeleteMediaFileCommand implements CommandInterface
{
public function __construct(
public string $filename,
public ?int $downloadId = null,
) {}
}

View File

@@ -0,0 +1,42 @@
<?php
namespace App\Library\Action\Handler;
use App\Base\Service\MediaFiles;
use App\Download\Action\Result\DeleteMediaFileResult;
use App\Download\Framework\Entity\Download;
use App\Download\Framework\Repository\DownloadRepository;
use App\Library\Action\Command\DeleteMediaFileCommand;
use OneToMany\RichBundle\Contract\CommandInterface;
use OneToMany\RichBundle\Contract\HandlerInterface;
use OneToMany\RichBundle\Contract\ResultInterface;
/**
* @implements HandlerInterface<DeleteMediaFileCommand,DeleteMediaFileResult>
*/
class DeleteMediaFileHandler implements HandlerInterface
{
public function __construct(
private readonly DownloadRepository $downloadRepository,
private readonly MediaFiles $mediaFiles,
) {}
public function handle(CommandInterface $command): ResultInterface
{
/** @var Download $downloadRecord */
$downloadRecord = $this->downloadRepository->find($command->downloadId);
$filepath = $this->getFullFilepath($downloadRecord);
$result = $this->mediaFiles->removeFile($filepath);
return new DeleteMediaFileResult(
message: true === $result ? 'File removed' : 'File not removed',
filepath: $filepath,
isDeleted: $result
);
}
private function getFullFilepath(Download $download): string
{
return $this->mediaFiles->getPathByType($download->getMediaType()) . DIRECTORY_SEPARATOR . $download->getFilename();
}
}

View File

@@ -0,0 +1,29 @@
<?php
namespace App\Library\Action\Input;
use App\Library\Action\Command\DeleteMediaFileCommand;
use OneToMany\RichBundle\Attribute\SourceRequest;
use OneToMany\RichBundle\Contract\CommandInterface;
use OneToMany\RichBundle\Contract\InputInterface;
/**
* @implements InputInterface<DeleteMediaFileInput,DeleteMediaFileCommand>
*/
class DeleteMediaFileInput implements InputInterface
{
public function __construct(
#[SourceRequest('filename')]
public string $filename,
#[SourceRequest('downloadId', nullify: true)]
public ?int $downloadId = null,
) {}
public function toCommand(): CommandInterface
{
return new DeleteMediaFileCommand(
$this->filename,
$this->downloadId,
);
}
}

View File

@@ -0,0 +1,15 @@
<?php
namespace App\Library\Action\Result;
use OneToMany\RichBundle\Contract\ResultInterface;
/**
* @implements ResultInterface
*/
class DeleteMediaFileResult implements ResultInterface
{
public function __construct(
public string $status,
) {}
}