feat: logs download events

This commit is contained in:
Brock H Caldwell
2025-11-01 23:58:15 -05:00
parent c4e8e9b35e
commit d28b743684
12 changed files with 195 additions and 2 deletions

View File

@@ -4,17 +4,22 @@ namespace App\Download\Action\Handler;
use App\Download\Action\Command\DeleteDownloadCommand;
use App\Download\Action\Result\DeleteDownloadResult;
use App\Download\DownloadEvents;
use App\Download\Framework\Repository\DownloadRepository;
use App\EventLog\Action\Command\AddEventLogCommand;
use App\Library\Action\Command\DeleteMediaFileCommand;
use App\Library\Action\Handler\DeleteMediaFileHandler;
use App\Monitor\MonitorEvents;
use OneToMany\RichBundle\Contract\CommandInterface;
use OneToMany\RichBundle\Contract\HandlerInterface;
use OneToMany\RichBundle\Contract\ResultInterface;
use Symfony\Component\Messenger\MessageBusInterface;
/** @implements HandlerInterface<DeleteDownloadCommand, DeleteDownloadResult> */
readonly class DeleteDownloadHandler implements HandlerInterface
{
public function __construct(
private MessageBusInterface $bus,
private DownloadRepository $downloadRepository,
private DeleteMediaFileHandler $deleteMediaFileHandler,
) {}
@@ -31,6 +36,13 @@ readonly class DeleteDownloadHandler implements HandlerInterface
}
$this->downloadRepository->delete($command->downloadId);
$this->bus->dispatch(new AddEventLogCommand(
$download->getUser(),
DownloadEvents::DOWNLOAD_DELETED->type(),
DownloadEvents::DOWNLOAD_DELETED->message(),
(array) $download
));
return new DeleteDownloadResult(
status: 200,
message: 'Success',

View File

@@ -4,18 +4,22 @@ namespace App\Download\Action\Handler;
use App\Download\Action\Command\DownloadMediaCommand;
use App\Download\Action\Result\DownloadMediaResult;
use App\Download\DownloadEvents;
use App\Download\Framework\Repository\DownloadRepository;
use App\Download\Downloader\DownloaderInterface;
use App\EventLog\Action\Command\AddEventLogCommand;
use App\User\Framework\Repository\UserRepository;
use OneToMany\RichBundle\Contract\CommandInterface;
use OneToMany\RichBundle\Contract\HandlerInterface;
use OneToMany\RichBundle\Contract\ResultInterface;
use Symfony\Component\Messenger\Exception\UnrecoverableMessageHandlingException;
use Symfony\Component\Messenger\MessageBusInterface;
/** @implements HandlerInterface<DownloadMediaCommand, DownloadMediaResult> */
readonly class DownloadMediaHandler implements HandlerInterface
{
public function __construct(
private MessageBusInterface $bus,
private DownloaderInterface $downloader,
private DownloadRepository $downloadRepository,
private UserRepository $userRepository,
@@ -23,9 +27,17 @@ readonly class DownloadMediaHandler implements HandlerInterface
public function handle(CommandInterface $command): ResultInterface
{
$user = $this->userRepository->find($command->userId);
$this->bus->dispatch(new AddEventLogCommand(
$user,
DownloadEvents::DOWNLOAD_STARTED->type(),
DownloadEvents::DOWNLOAD_STARTED->message(),
(array) $command
));
if (null === $command->downloadId) {
$download = $this->downloadRepository->insert(
$this->userRepository->find($command->userId),
$user,
$command->url,
$command->title,
$command->filename,
@@ -57,6 +69,12 @@ readonly class DownloadMediaHandler implements HandlerInterface
throw new UnrecoverableMessageHandlingException($exception->getMessage(), 500);
}
$this->bus->dispatch(new AddEventLogCommand(
$user,
DownloadEvents::DOWNLOAD_FINISHED->type(),
DownloadEvents::DOWNLOAD_FINISHED->message(),
(array) $command
));
return new DownloadMediaResult(200, "Success.");
}
}

View File

@@ -0,0 +1,34 @@
<?php
namespace App\Download;
enum DownloadEvents
{
case DOWNLOAD_ADDED;
case DOWNLOAD_STARTED;
case DOWNLOAD_FINISHED;
case DOWNLOAD_DELETED;
case DOWNLOAD_ERROR;
public function type(): string
{
return match ($this) {
self::DOWNLOAD_ADDED => 'download_added',
self::DOWNLOAD_STARTED => 'download_started',
self::DOWNLOAD_FINISHED => 'download_finished',
self::DOWNLOAD_DELETED => 'download_deleted',
self::DOWNLOAD_ERROR => 'download_error',
};
}
public function message(): string
{
return match ($this) {
self::DOWNLOAD_ADDED => 'A new download has been added.',
self::DOWNLOAD_STARTED => 'A download has started.',
self::DOWNLOAD_FINISHED => 'A download has finished.',
self::DOWNLOAD_DELETED => 'A download has been deleted.',
self::DOWNLOAD_ERROR => 'A download has encountered an error.',
};
}
}

View File

@@ -4,9 +4,12 @@ namespace App\Download\Downloader;
use App\Base\Service\Broadcaster;
use App\Base\Service\MediaFiles;
use App\Download\DownloadEvents;
use App\Download\Framework\Entity\Download;
use App\EventLog\Action\Command\AddEventLogCommand;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Cache\Adapter\RedisAdapter;
use Symfony\Component\Messenger\MessageBusInterface;
use Symfony\Component\Process\Exception\ProcessFailedException;
use Symfony\Component\Process\Process;
use Symfony\Contracts\Cache\CacheInterface;
@@ -17,6 +20,7 @@ class ProcessDownloader implements DownloaderInterface
* @var RedisAdapter $cache
*/
public function __construct(
private MessageBusInterface $bus,
private EntityManagerInterface $entityManager,
private MediaFiles $mediaFiles,
private CacheInterface $cache,
@@ -88,6 +92,12 @@ class ProcessDownloader implements DownloaderInterface
}
} catch (ProcessFailedException $exception) {
$downloadEntity->setStatus('Failed');
$this->bus->dispatch(new AddEventLogCommand(
$downloadEntity->getUser()->getId(),
DownloadEvents::DOWNLOAD_ERROR->type(),
DownloadEvents::DOWNLOAD_ERROR->message() . ': ' . $exception->getMessage(),
(array) $downloadEntity
));
}
$this->entityManager->flush();

View File

@@ -11,7 +11,9 @@ use App\Download\Action\Input\DownloadMediaInput;
use App\Download\Action\Input\DownloadSeasonInput;
use App\Download\Action\Input\PauseDownloadInput;
use App\Download\Action\Input\ResumeDownloadInput;
use App\Download\DownloadEvents;
use App\Download\Framework\Repository\DownloadRepository;
use App\EventLog\Action\Command\AddEventLogCommand;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Messenger\MessageBusInterface;
@@ -41,6 +43,13 @@ class ApiController extends AbstractController
$input->downloadId = $download->getId();
$input->userId = $this->getUser()->getId();
$this->bus->dispatch(new AddEventLogCommand(
$this->getUser(),
DownloadEvents::DOWNLOAD_ADDED->type(),
DownloadEvents::DOWNLOAD_ADDED->message(),
(array) $download
));
try {
$this->bus->dispatch($input->toCommand());
} catch (\Throwable $exception) {