src/Controller/ClientSideAdvertiserController.php line 97

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