src/Controller/SearchController.php line 68

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Model\Scan\Report;
  4. use App\Entity\Scan;
  5. use App\Model\Tag;
  6. use DateTime;
  7. use Doctrine\ORM\EntityNotFoundException;
  8. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  9. use Symfony\Component\HttpFoundation\Response;
  10. use Symfony\Component\HttpFoundation\Request;
  11. use Symfony\Component\HttpFoundation\JsonResponse;
  12. use Symfony\Component\Routing\Annotation\Route;
  13. /**
  14.  * Alerts Controller.
  15.  */
  16. class SearchController extends AbstractController
  17. {
  18.     const DATETIME_FORMAT 'Y-m-d';
  19.     const REQUEST_PARAM_NAME_AFFILIATE           'affiliate';
  20.     const REQUEST_PARAM_NAME_CAMPAIGN_ID         'campaignId';
  21.     const REQUEST_PARAM_NAME_DOMAINS             'domain';
  22.     const REQUEST_PARAM_NAME_LANDING_DOMAIN      'landingDomain';
  23.     const REQUEST_PARAM_NAME_TRAFFIC_SOURCE      'trafficSource';
  24.     const REQUEST_PARAM_NAME_STATUS              'status';
  25.     const REQUEST_PARAM_NAME_TAGS                'tags';
  26.     const REQUEST_PARAM_NAME_FIRST_TRACKING_LINK 'firstTrackingLink';
  27.     const ADVANCED_SEARCH_LABELS = [
  28.         self::REQUEST_PARAM_NAME_AFFILIATE           => 'Affiliate',
  29.         self::REQUEST_PARAM_NAME_CAMPAIGN_ID         => 'Campaign ID',
  30.         self::REQUEST_PARAM_NAME_DOMAINS             => 'Domain',
  31.         self::REQUEST_PARAM_NAME_LANDING_DOMAIN      => 'Landing Domain',
  32.         self::REQUEST_PARAM_NAME_TRAFFIC_SOURCE      => 'Source',
  33.         self::REQUEST_PARAM_NAME_STATUS              => 'Status',
  34.         self::REQUEST_PARAM_NAME_TAGS                => 'Tags',
  35.         self::REQUEST_PARAM_NAME_FIRST_TRACKING_LINK => 'First Tracking Link',
  36.     ];
  37.     const REQUEST_ADVANCED_SEARCH_PARAMS = array(
  38.         self::REQUEST_PARAM_NAME_AFFILIATE           => self::REQUEST_PARAM_NAME_AFFILIATE,
  39.         self::REQUEST_PARAM_NAME_CAMPAIGN_ID         => self::REQUEST_PARAM_NAME_CAMPAIGN_ID,
  40.         self::REQUEST_PARAM_NAME_DOMAINS             => self::REQUEST_PARAM_NAME_DOMAINS,
  41.         self::REQUEST_PARAM_NAME_LANDING_DOMAIN      => self::REQUEST_PARAM_NAME_LANDING_DOMAIN,
  42.         self::REQUEST_PARAM_NAME_TRAFFIC_SOURCE      => self::REQUEST_PARAM_NAME_TRAFFIC_SOURCE,
  43.         self::REQUEST_PARAM_NAME_STATUS              => self::REQUEST_PARAM_NAME_STATUS,
  44.         self::REQUEST_PARAM_NAME_TAGS                => self::REQUEST_PARAM_NAME_TAGS,
  45.         self::REQUEST_PARAM_NAME_FIRST_TRACKING_LINK => self::REQUEST_PARAM_NAME_FIRST_TRACKING_LINK,
  46.     );
  47.     /**
  48.      * Search Index.
  49.      *
  50.      * @Route(path="/search", name="search_index", methods={"GET"})
  51.      *
  52.      * @return Response
  53.      */
  54.     public function indexAction(): Response
  55.     {
  56.         return $this->render('search/list.html.twig', [
  57.             'statusLabels'         => Scan::SEARCH_LABELS,
  58.             'trafficType'          => Scan::FLAG_TRAFFIC_LABELS,
  59.             'advancedSearchLabels' => self::ADVANCED_SEARCH_LABELS,
  60.             'requestParams'        => self::REQUEST_ADVANCED_SEARCH_PARAMS,
  61.             'tagTypes'             => Tag::TYPE_LABELS,
  62.         ]);
  63.     }
  64.     /**
  65.      * Gets Search list
  66.      *
  67.      * @Route(path="/search/list", name="search_list", methods={"GET"})
  68.      *
  69.      * @param Request $request
  70.      * @param Report  $report
  71.      * @return JsonResponse
  72.      * @throws EntityNotFoundException
  73.      */
  74.     public function listAction(Request $requestReport $report): JsonResponse
  75.     {
  76.         $from              $request->query->get('from'date("Y-m-d"));
  77.         $to                $request->query->get('to'date("Y-m-d"));
  78.         $searchKeyWord     $request->query->get('search''');
  79.         $scanStatus        $request->query->get(self::REQUEST_PARAM_NAME_STATUS'');
  80.         $trafficType       $request->query->get(self::REQUEST_PARAM_NAME_TRAFFIC_SOURCE'');
  81.         $affiliates        $request->query->get(self::REQUEST_PARAM_NAME_AFFILIATE'');
  82.         $campaignId        $request->query->get(self::REQUEST_PARAM_NAME_CAMPAIGN_ID'');
  83.         $domain            $request->query->get(self::REQUEST_PARAM_NAME_DOMAINS'');
  84.         $landingDomain     $request->query->get(self::REQUEST_PARAM_NAME_LANDING_DOMAIN'');
  85.         $tags              $request->query->get(self::REQUEST_PARAM_NAME_TAGS'');
  86.         $firstTrackingLink $request->query->get(self::REQUEST_PARAM_NAME_FIRST_TRACKING_LINK'');
  87.         // case filter scan status None
  88.         $statusFilter = [];
  89.         if (($scanStatus || $scanStatus === (string) Scan::STATUS_LANDING_ISSUE) && $scanStatus !== 'None') {
  90.             $statusFilter explode(','$scanStatus);
  91.         }
  92.         $trafficFilter = [];
  93.         if ($trafficType && $trafficType !== 'None') {
  94.             $trafficFilter explode(','$trafficType);
  95.         }
  96.         $affiliateFilter = [];
  97.         if ($affiliates) {
  98.             $affiliateFilter explode('(||)'$affiliates);
  99.         }
  100.         $campaignIdFilter = [];
  101.         if ($campaignId) {
  102.             $campaignIdFilter explode('(||)'$campaignId);
  103.         }
  104.         $domainFilter = [];
  105.         if ($domain) {
  106.             $domainFilter explode('(||)'$domain);
  107.         }
  108.         $landingDomainFilter = [];
  109.         if ($landingDomain) {
  110.             $landingDomainFilter explode('(||)'$landingDomain);
  111.         }
  112.         $tagsFilter = [];
  113.         if ($tags && $tags !== 'None') {
  114.             $tagsFilter explode(','$tags);
  115.         }
  116.         if ($firstTrackingLink && $firstTrackingLink !== 'True') {
  117.             $firstTrackingLink '';
  118.         }
  119.         // if there are no filters provided return empty json
  120.         if (!($statusFilter || $trafficFilter || $affiliateFilter || $campaignIdFilter || $domainFilter
  121.             || $landingDomainFilter || $searchKeyWord || $tags)) {
  122.             return $this->json([]);
  123.         }
  124.         $from  DateTime::createFromFormat(self::DATETIME_FORMAT$from);
  125.         $to    DateTime::createFromFormat(self::DATETIME_FORMAT$to);
  126.         $scans $report->getScansForSearch($from$to$statusFilter$trafficFilter$affiliateFilter$campaignIdFilter$domainFilter$landingDomainFilter$tagsFilter$searchKeyWord, !empty($firstTrackingLink));
  127.         return $this->json($scans);
  128.     }
  129. }