feat: delete monitors

This commit is contained in:
2025-06-01 09:25:12 -05:00
parent 785794790c
commit b1ccf3bf00
11 changed files with 232 additions and 32 deletions

View File

@@ -0,0 +1,13 @@
<?php
namespace App\Monitor\Action\Command;
use OneToMany\RichBundle\Contract\CommandInterface;
/** @implements CommandInterface<DeleteMonitorCommand> */
class DeleteMonitorCommand implements CommandInterface
{
public function __construct(
public string $monitorId,
) {}
}

View File

@@ -0,0 +1,36 @@
<?php
namespace App\Monitor\Action\Handler;
use App\Monitor\Action\Command\AddMonitorCommand;
use App\Monitor\Action\Command\DeleteMonitorCommand;
use App\Monitor\Action\Result\AddMonitorResult;
use App\Monitor\Action\Result\DeleteMonitorResult;
use App\Monitor\Framework\Entity\Monitor;
use App\Monitor\Framework\Repository\MonitorRepository;
use App\User\Framework\Repository\UserRepository;
use DateTimeImmutable;
use OneToMany\RichBundle\Contract\CommandInterface;
use OneToMany\RichBundle\Contract\HandlerInterface;
use OneToMany\RichBundle\Contract\ResultInterface;
/** @implements HandlerInterface<DeleteMonitorCommand, DeleteMonitorResult> */
readonly class DeleteMonitorHandler implements HandlerInterface
{
public function __construct(
private MonitorRepository $monitorRepository,
) {}
public function handle(CommandInterface $command): ResultInterface
{
$monitor = $this->monitorRepository->find($command->monitorId);
$this->monitorRepository->getEntityManager()->remove($monitor);
$this->monitorRepository->getEntityManager()->flush();
return new DeleteMonitorResult(
status: 'OK',
result: [],
monitor: $monitor
);
}
}

View File

@@ -0,0 +1,24 @@
<?php
namespace App\Monitor\Action\Input;
use App\Monitor\Action\Command\DeleteMonitorCommand;
use OneToMany\RichBundle\Attribute\SourceRoute;
use OneToMany\RichBundle\Contract\CommandInterface;
use OneToMany\RichBundle\Contract\InputInterface;
/** @implements InputInterface<DeleteMonitorInput, DeleteMonitorCommand> */
class DeleteMonitorInput implements InputInterface
{
public function __construct(
#[SourceRoute('monitorId')]
public int $monitorId,
) {}
public function toCommand(): CommandInterface
{
return new DeleteMonitorCommand(
$this->monitorId
);
}
}

View File

@@ -0,0 +1,15 @@
<?php
namespace App\Monitor\Action\Result;
use App\Monitor\Framework\Entity\Monitor;
use OneToMany\RichBundle\Contract\ResultInterface;
class DeleteMonitorResult implements ResultInterface
{
public function __construct(
public string $status,
public array $result,
public Monitor $monitor,
) {}
}

View File

@@ -2,8 +2,11 @@
namespace App\Monitor\Framework\Controller;
use App\Download\Action\Input\DeleteDownloadInput;
use App\Monitor\Action\Handler\AddMonitorHandler;
use App\Monitor\Action\Handler\DeleteMonitorHandler;
use App\Monitor\Action\Input\AddMonitorInput;
use App\Monitor\Action\Input\DeleteMonitorInput;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Bundle\SecurityBundle\Security;
use Symfony\Component\DependencyInjection\Attribute\Autowire;
@@ -43,4 +46,27 @@ class ApiController extends AbstractController
'message' => $response
]);
}
#[Route('/api/monitor/{monitorId}', name: 'api_monitor_delete', methods: ['DELETE'])]
public function deleteMonitor(
DeleteMonitorInput $input,
DeleteMonitorHandler $handler,
HubInterface $hub,
) {
$response = $handler->handle($input->toCommand());
$hub->publish(new Update(
'alerts',
$this->renderer->render('broadcast/Alert.stream.html.twig', [
'alert_id' => uniqid(),
'title' => 'Success',
'message' => "New monitor added for {$response->monitor->getTitle()}",
])
));
return $this->json([
'status' => 200,
'message' => $response
]);
}
}

View File

@@ -7,7 +7,9 @@ use App\User\Framework\Entity\User;
use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Serializer\Attribute\Ignore;
use Symfony\UX\Turbo\Attribute\Broadcast;
#[Broadcast(template: 'broadcast/Monitor.stream.html.twig')]
#[ORM\Entity(repositoryClass: MonitorRepository::class)]
class Monitor
{