<?php
declare(strict_types=1);
namespace App\Form\EventSubscriber\MaxFirmware;
use App\Entity\MaxFirmware;
use App\Service\S3Service;
use Psr\Log\LoggerInterface;
use Sentry;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Form\FormError;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Contracts\Translation\TranslatorInterface;
class MaxFirmwareFileSubscriber implements EventSubscriberInterface
{
public function __construct(
private S3Service $s3Service,
private TranslatorInterface $translator,
private LoggerInterface $logger,
) {
}
public static function getSubscribedEvents(): array
{
return [FormEvents::POST_SUBMIT => 'onPostSubmit'];
}
public function onPostSubmit(FormEvent $event): void
{
$form = $event->getForm();
$entity = $event->getData();
if (! $entity instanceof MaxFirmware) {
return;
}
if (! $form->isValid()) {
return;
}
$file = $form->get('firmwareFile')->getData();
if (! $file instanceof UploadedFile) {
return;
}
$entity->setFirmwareFile($file);
$result = $this->s3Service->uploadFile($file, 'firmware', $entity->getVersion());
if ($result['status'] !== 'successful' || empty($result['awsUrl'])) {
$errorMsg = $result['errorMsg'] ?? 'Unknown S3 upload error';
$this->logger->error('Firmware upload failed: ' . $errorMsg);
Sentry\captureMessage('Firmware upload failed for version ' . $entity->getVersion() . ': ' . $errorMsg);
$form->addError(new FormError(
$this->translator->trans($errorMsg),
));
return;
}
$entity->setLink($result['awsUrl']);
}
}