<?php
namespace App\Controller\BackOffice;
use App\Entity\Version\AppFirmwareRelation;
use App\Entity\Version\APPVersion;
use App\Entity\Version\FirmwareVersion;
use App\Form\Type\BackOffice\Version\FirmwareVersionType;
use App\Model\PaginatedSearchCriteria;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Form\FormFactoryInterface;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
/**
* Class AnalysisMethodsController
* @package App\Controller\BackOffice
* @Route(path="versions/firmware")
*/
class FirmwareVersionController extends AbstractController
{
/**
* @var EntityManagerInterface
*/
private $entityManager;
/**
* @var FormFactoryInterface
*/
private $formFactory;
/**
* FirmwareVersionController constructor.
* @param EntityManagerInterface $entityManager
* @param FormFactoryInterface $formFactory
*/
public function __construct(EntityManagerInterface $entityManager, FormFactoryInterface $formFactory)
{
$this->entityManager = $entityManager;
$this->formFactory = $formFactory;
}
/**
* @param Request $request
* @return Response
* @Route(methods={"GET"})
*/
public function indexAction(Request $request): Response
{
$searchCriteria = new PaginatedSearchCriteria($request->query);
$searchCriteria->setPageSize(PaginatedSearchCriteria::BACKOFFICE_PAGINATION_SIZE);
$firmwareVersions = $this->entityManager
->getRepository(FirmwareVersion::class)
->search($searchCriteria);
return $this->render('/backOffice/version/firmware/index.html.twig', [
'versions' => $firmwareVersions,
]);
}
/**
* @param Request $request
* @return Response
* @Route(path="/new", methods={"GET", "POST"})
*/
public function newAction(Request $request): Response
{
$firmwareVersion = new FirmwareVersion();
$appVersions = $this->entityManager
->getRepository(AppVersion::class)
->findAll();
$versionForm = $this->formFactory
->create(FirmwareVersionType::class, $firmwareVersion, [
'app_versions' => $appVersions,
'compatible_apps' => [],
]);
$versionForm->handleRequest($request);
if ($versionForm->isSubmitted() && $versionForm->isValid()) {
$file = $versionForm->get('firmware')->getData();
$newFilename = $firmwareVersion->getGitHash().'.bin';
$file->move(
$this->getParameter('bin_directory'),
$newFilename
);
$firmwareVersion = $versionForm->getData();
$data = $versionForm->get('appVersions')->getData();
/** @var APPVersion $version */
foreach ($appVersions as $index => $version) {
if ($data[$index]) {
$relation = new AppFirmwareRelation();
$relation->setAppVersion($version);
$relation->setFirmwareVersion($firmwareVersion);
$this->entityManager->persist($relation);
}
}
$this->entityManager->persist($firmwareVersion);
$this->entityManager->flush();
return $this->redirectToRoute('app_backoffice_firmwareversion_edit', [
'firmwareVersion' => $firmwareVersion->getVersionId(),
]);
}
return $this->render('backOffice/version/firmware/new.html.twig', [
'versionForm' => $versionForm->createView(),
]);
}
/**
* @param Request $request
* @param $firmwareVersion
* @return Response
* @Route (path="/{firmwareVersion}", methods={"GET", "POST"})
* @noinspection DuplicatedCode
*/
public function editAction(Request $request, $firmwareVersion): Response
{
$firmwareVersion = $this->entityManager
->getRepository(FirmwareVersion::class)
->findOneBy(['versionId' => $firmwareVersion]);
if (!$firmwareVersion) {
throw $this->createNotFoundException();
}
$compatible = $this->entityManager
->getRepository(AppFirmwareRelation::class)
->findBy(['firmwareVersion' => $firmwareVersion]);
$indexed = [];
/** @var AppFirmwareRelation $v */
foreach ($compatible as $v) {
$indexed[] = $v->getAppVersion()->getVersionId();
}
$appVersions = $this->entityManager
->getRepository(APPVersion::class)
->findAll();
$versionForm = $this->formFactory
->create(FirmwareVersionType::class, $firmwareVersion, [
'app_versions' => $appVersions,
'compatible_apps' => $indexed,
'edit' => true,
'gitHashDisabled' => true,
]);
$versionForm->handleRequest($request);
if ($versionForm->isSubmitted() && $versionForm->isValid()) {
/** @var APPVersion $appVersion */
$firmwareVersion = $versionForm->getData();
$data = $versionForm->get('appVersions')->getData();
/** @var APPVersion $version */
foreach ($appVersions as $index => $version) {
if ($data[$index]) {
$relation = new AppFirmwareRelation();
$relation->setAppVersion($version);
$relation->setFirmwareVersion($firmwareVersion);
$this->entityManager->persist($relation);
} else {
$relations = $this->entityManager
->getRepository(AppFirmwareRelation::class)
->findBy(['firmwareVersion' => $firmwareVersion, 'appVersion' => $version]);
foreach ($relations as $relation) {
$this->entityManager->remove($relation);
}
}
}
$this->entityManager->persist($firmwareVersion);
$this->entityManager->flush();
return $this->redirectToRoute('app_backoffice_firmwareversion_index');
}
return $this->render('backOffice/version/firmware/edit.html.twig', [
'firmwareVersion' => $firmwareVersion,
'versionForm' => $versionForm->createView(),
]);
}
/**
* @param $firmwareVersion
* @return BinaryFileResponse
* @Route (path="/{firmwareVersion}/download", methods={"GET"})
*/
public function download($firmwareVersion): BinaryFileResponse
{
$firmware = $this->entityManager
->getRepository(FirmwareVersion::class)
->find($firmwareVersion);
if (!$firmware) {
throw $this->createNotFoundException('Firmware version not found');
}
$filename = $firmware->getGitHash().'.bin';
$filePath = $this->getParameter('bin_directory').DIRECTORY_SEPARATOR.$filename;
$response = $this->file($filePath, $filename);
$response->setPrivate();
$response->setCharset('utf-8');
return $response;
}
}