src/Controller/ClientSideAdvertiserController.php line 96

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