src/Controller/ClientSideAdvertiserController.php line 114

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Config;
  4. use App\Entity\Tune\AffiliateInfo;
  5. use App\Entity\Employees;
  6. use App\Entity\AgentControl;
  7. use App\Entity\MmpMobileApps;
  8. use App\Entity\MmpOffers;
  9. use App\Entity\MmpReports;
  10. use App\Entity\Tune\OfferInfo;
  11. use App\Entity\NewsletterBuilder;
  12. use App\Entity\OfferGeoRelationship;
  13. use App\Services\AffiliateHasofferAPI;
  14. use App\Services\Alerts;
  15. use App\Services\Aws\ElasticCache;
  16. use App\Services\Aws\S3;
  17. use App\Services\BrandHasofferAPI;
  18. use App\Services\ChartComponents;
  19. use App\Services\Common;
  20. use App\Services\FinancialToolsComponents;
  21. use App\Services\ImpressionsApis;
  22. use App\Services\Metrics24APICalls;
  23. use App\Services\MmpComponents;
  24. use App\Services\MysqlQueries;
  25. use App\Services\UsersComponents;
  26. use App\Traits\TrafficReportTrait;
  27. use Doctrine\Persistence\ManagerRegistry;
  28. use Mmoreram\GearmanBundle\Service\GearmanClientInterface;
  29. use Symfony\Component\Routing\Annotation\Route;
  30. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  31. use Symfony\Component\HttpFoundation\JsonResponse;
  32. use Symfony\Component\HttpFoundation\Request;
  33. use App\Repository\MafoAdvertiserCabinetManagerMappingWithMafoAdvertiserRepository;
  34. use Symfony\Component\HttpFoundation\Response;
  35. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  36. use function GuzzleHttp\json_encode;
  37. /**
  38.  *
  39.  * @Route("/api/client/advertiser", name="client_advertiser_", host="%advertisers_subdomain%")
  40.  */
  41. class ClientSideAdvertiserController extends AbstractController
  42. {
  43.     use TrafficReportTrait;
  44.     private $commonCalls;
  45.     private $doctrine;
  46.     private $mysqlQueries;
  47.     private $financialToolsComponents;
  48.     private $alerts;
  49.     private $brandHasofferApi;
  50.     private $mmpComponents;
  51.     private $affiliateHasofferAPI;
  52.     private $usersComponents;
  53.     private $elasticCache;
  54.     private $projectDir;
  55.     private $s3;
  56.     private $impressionsApis;
  57.     private $metrics24APICalls;
  58.     private $gearmanClientInterface;
  59.     private $mappingRepository;
  60.     public function __construct(
  61.         Common $commonCalls,
  62.         ManagerRegistry $doctrine,
  63.         MysqlQueries $mysqlQueries,
  64.         MafoAdvertiserCabinetManagerMappingWithMafoAdvertiserRepository $mappingRepository,
  65.         FinancialToolsComponents $financialToolsComponents,
  66.         Alerts $alerts,
  67.         BrandHasofferApi $brandHasofferApi,
  68.         MmpComponents $mmpComponents,
  69.         AffiliateHasofferAPI $affiliateHasofferAPI,
  70.         UsersComponents $usersComponents,
  71.         ElasticCache $elasticCache,
  72.         S3 $s3,
  73.         ImpressionsApis $impressionsApis,
  74.         Metrics24APICalls $metrics24APICalls,
  75.         GearmanClientInterface $gearmanClientInterface,
  76.         string $projectDir
  77.     ) {
  78.         $this->commonCalls $commonCalls;
  79.         $this->doctrine $doctrine;
  80.         $this->mysqlQueries $mysqlQueries;
  81.         $this->financialToolsComponents $financialToolsComponents;
  82.         $this->alerts $alerts;
  83.         $this->brandHasofferApi $brandHasofferApi;
  84.         $this->mmpComponents $mmpComponents;
  85.         $this->affiliateHasofferAPI $affiliateHasofferAPI;
  86.         $this->usersComponents $usersComponents;
  87.         $this->elasticCache $elasticCache;
  88.         $this->s3 $s3;
  89.         $this->impressionsApis $impressionsApis;
  90.         $this->metrics24APICalls $metrics24APICalls;
  91.         $this->gearmanClientInterface $gearmanClientInterface;
  92.         $this->projectDir $projectDir;
  93.         $this->mappingRepository $mappingRepository;
  94.     }
  95.     /**
  96.      * @Route("/validate", name="validate", methods={"GET"})
  97.      */
  98.     public function getValidateAction(Request $request)
  99.     {
  100.         return new JsonResponse(true);
  101.     }
  102.     /**
  103.      * @Route("/login", name="login")
  104.      */
  105.     public function indexAction(AuthenticationUtils $authenticationUtils)
  106.     {
  107.         // get the login error if there is one
  108.         $error $authenticationUtils->getLastAuthenticationError();
  109.         // last username entered by the user
  110.         $lastUsername $authenticationUtils->getLastUsername();
  111.         return $this->render('/advertiser/login/index.html.twig', [
  112.             'last_username' => $lastUsername,
  113.             'error' => $error,
  114.         ]);
  115.     }
  116.     /**
  117.      * @Route("/details", name="get_advertiser_details",  methods={"GET"})
  118.      */
  119.     public function getAdvertiserDetails(Request $request): Response
  120.     {
  121.         $advertiserInfo $this->getUser();
  122.         $advertiserData = [
  123.             'id' => $advertiserInfo->getId(),
  124.             'email' => $advertiserInfo->getEmail(),
  125.             'firstName' => $advertiserInfo->getFirstName(),
  126.             'lastName' => $advertiserInfo->getLastName(),
  127.             'status' => $advertiserInfo->getStatus(),
  128.             'lastLoginAt' => $advertiserInfo->getLastLoginAt(),
  129.             'dateUpdated' => $advertiserInfo->getDateUpdated(),
  130.         ];
  131.         return $this->json($advertiserData);
  132.     }
  133.     /**
  134.      * @Route("/report-columns/{report}", name="get_report_columns", methods={"GET"})
  135.      */
  136.     public function getReportColumnsAction(Request $request$report)
  137.     {
  138.         if (in_array($reportarray_keys(Config::TABLE_COLUMNS_WITH_JSON_FILE))) {
  139.             return new JsonResponse(array_values($this->commonCalls->getDataFromJsonFile(Config::TABLE_COLUMNS_WITH_JSON_FILE[$report])));
  140.         } else {
  141.             return new JsonResponse(array_values(Config::REPORT_COLUMN_MAPPING[$report]));
  142.         }
  143.     }
  144.     /**
  145.      * @Route("/countries", name="get_countries", methods={"GET"})
  146.      */
  147.     public function getCountriesAction()
  148.     {
  149.         $countryList = [];
  150.         foreach (Config::COUNTRIES as $key => $value) {
  151.             $countryList[$key] = [
  152.                 'value' => $key,
  153.                 'label' => $key ' - ' $value['name']
  154.             ];
  155.         }
  156.         ksort($countryList);
  157.         return new JsonResponse(array_values($countryList));
  158.     }
  159.     /**
  160.      * @Route("/boolean-select", name="get_boolean_select", methods={"GET"})
  161.      */
  162.     public function getBooleanSelectAction(Request $request)
  163.     {
  164.         return new JsonResponse([
  165.             [
  166.                 'value' => 1,
  167.                 'label' => 'YES',
  168.             ],
  169.             [
  170.                 'value' => 0,
  171.                 'label' => 'NO',
  172.             ],
  173.         ]);
  174.     }
  175.     /**
  176.      * @Route("/mmp-offer-events-by-advertiser", name="get_mmp_offer_events", methods={"GET"})
  177.      */
  178.     public function getMmpOfferEventsAction(Request $request)
  179.     {
  180.         $advertiserInfo $this->getUser();
  181.         $advertiserId $advertiserInfo->getId();
  182.         $mappedAdvertiserIds $this->getMappedAdvertiserManagersId($advertiserId);
  183.         $mmpOffersEvents $this->doctrine->getRepository(MmpOffers::class)->getEventsByAdvertiserIds($mappedAdvertiserIds);
  184.         $arr = [];
  185.         foreach ($mmpOffersEvents as $value) {
  186.             $eventName $value['defaultRevenueEvent'];
  187.             $arr[] = [
  188.                 'value' => $eventName,
  189.                 'label' => $eventName " [ID: {$eventName}]"
  190.             ];
  191.         }
  192.         return new JsonResponse(array_values($arr));
  193.     }
  194.     /**
  195.      * @Route("/offers-by-advertiser", name="get_offers_by_advertiser_id", methods={"GET"})
  196.      */
  197.     public function getOffersByAdvertiserAction(Request $request)
  198.     {
  199.         $advertiserInfo $this->getUser();
  200.         $advertiserId $advertiserInfo->getId();
  201.         $mappedAdvertiserIds $this->getMappedAdvertiserManagersId($advertiserId);
  202.         $offers = [];
  203.         $offersByAdvertiser $this->doctrine->getRepository(MmpOffers::class)->getMmpOfferDataByAdvertiserIds($mappedAdvertiserIds);
  204.         foreach ($offersByAdvertiser as $key => $value) {
  205.             $offers[] = [
  206.                 'value' => $value['id'],
  207.                 'label' => $value['id'] . ' - ' $value['offerName']
  208.             ];
  209.         }
  210.         return new JsonResponse($offers);
  211.     }
  212.     /**
  213.      * @Route("/mmp-tracking-system-global-network-report", name="get_mmp-tracking-system-global-network-report", methods={"GET"})
  214.      */
  215.     public function getMmpTrackingSystemForGlobalNetworkReportAction(Request $request)
  216.     {
  217.         $mmpTrackingSystem = [];
  218.         foreach (Config::MMP_TRACKING_SYSTEM_ADVERTISER_CABINET_SIMPLIFIED as $key => $value) {
  219.             $mmpTrackingSystem[] = [
  220.                 'value' => $key,
  221.                 'label' => $value
  222.             ];
  223.         }
  224.         return new JsonResponse($mmpTrackingSystem);
  225.     }
  226.     /**
  227.      * @Route("/mmp-mobile-app-info-by-advertiser", name="get_mmp-mobile-app-info-by-advertiser", methods={"GET"})
  228.      */
  229.     public function getMmpMobileAppByAdvertiser(Request $request): JsonResponse
  230.     {
  231.         try {
  232.             $advertiserInfo $this->getUser();
  233.             $advertiserId $advertiserInfo->getId();
  234.             $mappedAdvertiserIds $this->getMappedAdvertiserManagersId($advertiserId);
  235.             // Get status from request, default to active status if not provided
  236.             $status $request->query->get('status'Config::ACTIVE_STATUS);
  237.             // Convert status to an array if it's a string (e.g., comma-separated or single value)
  238.             if (!is_array($status)) {
  239.                 $status explode(','$status);
  240.             }
  241.             // Get search keyword from request (default to null if not provided)
  242.             $search $request->query->get('search'null);
  243.             // Fetch MMP mobile apps based on advertiserId and status and search keyword
  244.             $mmpMobileApps $this->doctrine
  245.                 ->getRepository(MmpMobileApps::class)
  246.                 ->getMmpMobileAppForAdvertiser($mappedAdvertiserIds$status$search);
  247.             // Format the response
  248.             $formattedMmpMobileApp array_map(function ($app) {
  249.                 return [
  250.                     'value' => $app['bundleId'],
  251.                     'label' => $app['bundleId'] . " - " $app['appName'],
  252.                 ];
  253.             }, $mmpMobileApps);
  254.             return new JsonResponse($formattedMmpMobileApp);
  255.         } catch (\Exception $e) {
  256.             return new JsonResponse(
  257.                 [
  258.                     'success' => false,
  259.                     'message' => 'Failed to fetch MMP mobile apps.',
  260.                     'error' => $e->getMessage(),
  261.                 ],
  262.                 Response::HTTP_INTERNAL_SERVER_ERROR
  263.             );
  264.         }
  265.     }
  266.     /**
  267.      * @Route("/mapped-ho-offers-with-mmp-offers", name="_mapped_ho_offers_with_mmp_offers")
  268.      */
  269.     public function getMappedHoOffersWithMmpOffers(Request $request)
  270.     {
  271.         $advertiserInfo $this->getUser();
  272.         $advertiserId $advertiserInfo->getId();
  273.         $mappedAdvertiserIds $this->getMappedAdvertiserManagersId($advertiserId);
  274.         $hoOfferByAdvertiser $this->doctrine->getRepository(OfferInfo::class)->getOfferDataByAdvertiserIds($mappedAdvertiserIds);
  275.         $offerData = [];
  276.         foreach ($hoOfferByAdvertiser as $key => $value) {
  277.             $offerData[] = [
  278.                 'value' => $value['offerId'],
  279.                 'label' => $value['name']
  280.             ];
  281.         }
  282.         return new JsonResponse(array_values($offerData));
  283.     }
  284.     /**
  285.      * @Route("/traffic-report", methods={"GET"})
  286.      */
  287.     public function getTrafficReport(Request $request)
  288.     {
  289.         ini_set('memory_limit''512M');
  290.         $selectedColumns $request->query->get('data') != '' $request->query->get('data') : [];
  291.         $validationError $this->validateTrafficReportFields($selectedColumns);
  292.         if ($validationError !== null) {
  293.             return new JsonResponse($validationErrorConfig::HTTP_STATUS_CODE_BAD_REQUEST);
  294.         }
  295.         $advertiserData $this->getAdvertiserManagerData();
  296.         $formattedTrafficReportArray $advertiserData['formattedArray'];
  297.         $mappedAdvertiserIds $advertiserData['$mappedAdvertiserIds'];
  298.         if (empty($mappedAdvertiserIds)) {
  299.             return new JsonResponse([
  300.                 'response' => [
  301.                     'success' => true,
  302.                     'httpStatus' => Config::HTTP_STATUS_CODE_OK,
  303.                     'data' => [],
  304.                     'message' => 'No data available.',
  305.                     'error' => null                ]
  306.             ], Config::HTTP_STATUS_CODE_OK);
  307.         }
  308.         $filtersSelected $request->query->get('filters') ?? [];
  309.         $excludedFlagForFilters $request->query->get('excludedFlagForFilters') ?? [];
  310.         $processedFilters $this->processTrafficReportFilters(
  311.             $filtersSelected,
  312.             $excludedFlagForFilters,
  313.             $formattedTrafficReportArray['MULTISELECT_MAFO_ADVERTISERS']
  314.         );
  315.         $filters $processedFilters['filters'];
  316.         $excludedFiltersFlags $processedFilters['excludedFiltersFlags'];
  317. //        $selectedColumns = $request->query->get('data') != '' ? $request->query->get('data') : [];
  318.         $groupedColumns $request->query->get('groups') != '' $request->query->get('groups') : [];
  319.         $dateStart date('Y-m-d'strtotime($request->query->get('startDate')));
  320.         $dateEnd date('Y-m-d'strtotime($request->query->get('endDate')));
  321.         $eventTimestampFrom strtotime($dateStart);
  322.         $eventTimeStampTo strtotime($dateEnd);
  323.         $sortBy $request->query->get('sortBy') ?? Config::REPORTS_PAGINATION_MMP_REPORT_DEFAULT_SORT_BY;
  324.         $sortType $request->query->get('sortType') ?? Config::REPORTS_PAGINATION_DEFAULT_SORT_TYPE;
  325.         $page $request->query->get('page') ?? Config::REPORTS_PAGINATION_DEFAULT_PAGE_NUMBER;
  326.         $limit $request->query->get('limit') ?? Config::REPORTS_PAGINATION_DEFAULT_PAGE_SIZE;
  327.         $downloadDataAsCSV $request->query->get('downloadCSV') == 'true';
  328.         $tableColumns $this->commonCalls->changeColumnVisibilityForTable(
  329.             array_values($this->commonCalls->getDataFromJsonFile(Config::JSON_FILE_GLOBAL_NETWORK_REPORT)),
  330.             $selectedColumns,
  331.             []
  332.         );
  333. //        $tableColumns = $this->modifyTableColumnHeaders($tableColumns);
  334.         $finalReportData $this->mmpComponents->getMmpCumulativeData(
  335.             $filters,
  336.             $excludedFiltersFlags,
  337.             $eventTimestampFrom,
  338.             $eventTimeStampTo,
  339.             $selectedColumns,
  340.             $groupedColumns
  341.         );
  342.         $finalReportData $this->mmpComponents->normalizeMmpSource($finalReportData);
  343.         foreach ($tableColumns as $key => $value) {
  344.             if (isset($value['aggregate']) && $value['aggregate'] == 'sum') {
  345.                 $num round(array_sum(array_column($finalReportData$value['accessor'])), 2);
  346.                 if ($value['category'] == 'statistics') {
  347.                     $tableColumns[$key]['Footer'] = number_format($num);
  348.                 } else {
  349.                     $tableColumns[$key]['Footer'] = number_format($num2);
  350.                 }
  351.             }
  352.         }
  353.         if ($downloadDataAsCSV) {
  354.             $this->commonCalls->downloadCSV($tableColumns$finalReportData'Traffic Report ' $dateStart '_' $dateEnd);
  355.         } else {
  356.             $finalReportData array_values($finalReportData);
  357.             if (sizeof($finalReportData)) {
  358.                 $entity $finalReportData[0];
  359.                 if (array_key_exists($sortBy$entity)) {
  360.                     $sortFlag 3;
  361.                     if ($sortType == Config::SORT_TYPE_ASC) {
  362.                         $sortFlag 4;
  363.                     }
  364.                     array_multisort(array_column($finalReportData$sortBy), $sortFlag$finalReportData);
  365.                 }
  366.             }
  367.             $offset $limit * ($page 1);
  368.             $totalRecordCount sizeof($finalReportData);
  369.             $noOfPages ceil($totalRecordCount $limit);
  370.             return new JsonResponse([
  371.                 'response' => [
  372.                     'success' => true,
  373.                     'httpStatus' => Config::HTTP_STATUS_CODE_OK,
  374.                     'data' => [
  375.                         'tableColumns' => $tableColumns,
  376.                         'data' => array_slice($finalReportData$offset$limit),
  377.                         'metaData' => [
  378.                             'total' => $totalRecordCount,
  379.                             'limit' => (int)$limit,
  380.                             'page' => (int)$page,
  381.                             'pages' => (int)$noOfPages,
  382.                         ]
  383.                     ],
  384.                     'error' => null
  385.                 ]
  386.             ], Config::HTTP_STATUS_CODE_OK);
  387.         }
  388.     }
  389.     /**
  390.      * @Route("/dashboard-chart-data", name="dashboard-chart-data", methods={"GET"})
  391.      */
  392.     public function getAllDashboardChartData(Request $requestChartComponents $chartComponents): JsonResponse
  393.     {
  394.         $advertiserData $this->getAdvertiserManagerData();
  395.         $filtersSelected['MULTISELECT_MAFO_ADVERTISERS'] = $advertiserData['$mappedAdvertiserIds'];
  396.         $filters = [];
  397.         if (isset($filtersSelected)) {
  398.             foreach ($filtersSelected as $key => $value) {
  399.                 $key === Config::MULTISELECT_MAFO_ADVERTISERS $filters['mafoAdvertiserIds'] = $value false;
  400.             }
  401.         }
  402.         $dateStart date('Y-m-d'strtotime($request->query->get('dateStart')));
  403.         $dateEnd date('Y-m-d'strtotime($request->query->get('dateEnd')));
  404.         $sortBy $request->query->get('sortBy');
  405.         $pullFromCache $request->query->get('pullFromCache');
  406.         $sortType Config::DASHBOARD_PAGINATION_DEFAULT_SORT_TYPE;
  407.         $chartsToGenerate Config::ADVERTISER_CABINET;
  408.         $eventTimestampFrom strtotime($dateStart);
  409.         $eventTimeStampTo strtotime($dateEnd);
  410.         try {
  411.             $data $chartComponents->getDashboardData(
  412.                 $eventTimestampFrom,
  413.                 $eventTimeStampTo,
  414.                 $sortBy,
  415.                 $sortType,
  416.                 (bool) $pullFromCache,
  417.                 $chartsToGenerate,
  418.                 $filters
  419.             );
  420.             return new JsonResponse([
  421.                 'response' => [
  422.                     'success' => true,
  423.                     'httpStatus' => Config::HTTP_STATUS_CODE_OK,
  424.                     'data' => $data,
  425.                     'error' => null
  426.                 ]
  427.             ], Config::HTTP_STATUS_CODE_OK);
  428.         } catch (\Exception $e) {
  429.             return new JsonResponse([
  430.                 'success' => false,
  431.                 'message' => 'Error retrieving dashboard data: ' $e->getMessage()
  432.             ], 500);
  433.         }
  434.     }
  435. }