<?php
namespace App\Controller;
use App\Entity\Scan;
use App\Model\Scan\Report as ScanReport;
use App\Model\Tag;
use DateTime;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
/**
* Alerts Controller.
*/
class AlertsController extends AbstractController
{
const DATETIME_FORMAT = 'Y-m-d';
/**
* Alerts Index.
*
* @Route(path="/alerts", name="alerts_index", methods={"GET"})
*
* @return Response
*/
public function indexAction(): Response
{
return $this->render('alerts/list.html.twig', [
'trafficType' => Scan::FLAG_TRAFFIC_LABELS,
'tagTypes' => Tag::TYPE_LABELS,
]);
}
/**
* Gets Alerts list
*
* @Route(path="/alerts/list", name="alerts_list", methods={"GET"})
*
* @param Request $request
* @param ScanReport $report
* @return JsonResponse
*/
public function listAction(Request $request, ScanReport $report): JsonResponse
{
$from = $request->query->get('from', date("Y-m-d"));
$to = $request->query->get('to', date("Y-m-d"));
$showAll = $request->query->get('showAll', 0);
$trafficType = $request->query->get('trafficType', '');
$tags = $request->query->get('tags', '');
$status = [Scan::STATUS_LANDING_ISSUE];
$trafficType = (!empty($trafficType) || $trafficType === "0") ? explode(',', $trafficType) : [];
$tags = (!empty($tags) || $tags === "0") ? explode(',', $tags) : [];
$from = DateTime::createFromFormat(self::DATETIME_FORMAT, $from);
$to = DateTime::createFromFormat(self::DATETIME_FORMAT, $to);
$alerts = $report->getAlerts($from, $to, $status, $showAll, $trafficType, $tags);
return $this->json($alerts);
}
/**
* Update Resolution
*
* @Route(path="/alerts/resolution/update", name="resolution_update", methods={"POST"})
*
* @param Request $request
* @param EntityManagerInterface $entityManager
* @return JsonResponse
*/
public function updateResolution(Request $request, EntityManagerInterface $entityManager): JsonResponse
{
$resolution = $request->get('resolution');
if (!isset(Scan::STATUS_RESOLUTION_LABELS[$resolution])) {
throw new BadRequestHttpException(sprintf("Scan with id %s , Error : Invalid resolution", $resolution));
}
$scanId = $request->get('scanId');
$scan = $entityManager->find(Scan::class, $scanId);
if (empty($scan)) {
throw new NotFoundHttpException('Scan not found!');
}
$response = [
'status' => true,
'message' => "Resolution of Scan has been updated",
];
try {
$scan->setResolution($resolution);
$entityManager->flush();
} catch (\Exception $e) {
$response = [
'status' => false,
'message' => $e->getMessage(),
];
}
return $this->json($response);
}
}