src/Utils/MediaHelper.php line 303

Open in your IDE?
  1. <?php
  2. namespace App\Utils;
  3. use Doctrine\ORM\EntityManagerInterface;
  4. use Symfony\Component\HttpFoundation\RequestStack;
  5. use App\Exception\ResourceNotFoundException;
  6. use App\Entity\Media;
  7. use App\Entity\MediaGroup;
  8. use App\Entity\MediaGroupItem;
  9. use App\Entity\AdAnalyticsDaily;
  10. class MediaHelper 
  11. {
  12.     
  13.     protected $entityManager;
  14.     
  15.     public function __construct (
  16.         EntityManagerInterface $entityManager,
  17.         RequestStack $requestStack
  18.     ) {
  19.         $this->entityManager $entityManager;
  20.         $this->requestStack $requestStack;
  21.     }
  22.     
  23.     //Should move this to a separate file like "SiteHelper"
  24.     public function getSiteCode() {
  25.         $site_code null;
  26.         $request $this->requestStack->getCurrentRequest();
  27.         if($request) {
  28.             $session $request->getSession();
  29.             if($session) {
  30.                 $site_code $session->get("site");
  31.             }
  32.         }
  33.         return $site_code;
  34.     }
  35.     
  36.     public function getMediaById ($id 0)
  37.     {
  38.         $id = (int) $id;
  39.         $media $this->entityManager
  40.             ->getRepository(Media::class)
  41.             ->findOneBy([
  42.                 "id" => $id
  43.             ]);
  44.             
  45.         if ($media) {
  46.             return $media;
  47.         }
  48.         
  49.         throw new ResourceNotFoundException ("Media with Id {$id} - Not Found");
  50.     }
  51.     
  52.     public function getMediaByOldId ($id 0)
  53.     {
  54.         
  55.         $id = (int) $id;
  56.         $media $this->entityManager
  57.             ->getRepository(Media::class)
  58.             ->findOneBy([
  59.                 "old_id" => $id
  60.             ]);
  61.             
  62.         if ($media) {
  63.             return $media;
  64.         }
  65.         
  66.         throw new ResourceNotFoundException ("Media with old_id {$id} - Not Found");
  67.     }
  68.     
  69.     public function getMediaByName ($name "")
  70.     {
  71.         $media $this->entityManager
  72.             ->getRepository(Media::class)
  73.             ->findOneBy([
  74.                 "name" => $name
  75.             ]);
  76.             
  77.         if ($media) {
  78.             return $media;
  79.         }
  80.         
  81.         throw new ResourceNotFoundException ("Media with name {$name} - Not Found");
  82.     }
  83.     
  84.     public function getMediaGroupItemById ($id 0)
  85.     {
  86.         $id = (int) $id;
  87.         $mediaItem $this->entityManager
  88.             ->getRepository(MediaGroupItem::class)
  89.             ->findOneBy([
  90.                 "id" => $id
  91.             ]);
  92.             
  93.         if ($mediaItem) {
  94.             return $mediaItem;
  95.         }
  96.         
  97.         throw new ResourceNotFoundException ("Media Group Item with Id {$id} - Not Found");
  98.     }
  99.     
  100.     public function getMediaGroupItemByIdOrNull ($id 0)
  101.     {
  102.         $id = (int) $id;
  103.         $mediaItem $this->entityManager
  104.             ->getRepository(MediaGroupItem::class)
  105.             ->findOneBy([
  106.                 "id" => $id
  107.             ]);
  108.             
  109.         if ($mediaItem) {
  110.             return $mediaItem;
  111.         }
  112.         
  113.         return null;
  114.     }
  115.     
  116.     public function getMediaGroupByPosition ($position "")
  117.     {
  118.         $mediaGroup $this->entityManager
  119.             ->getRepository(MediaGroup::class)
  120.             ->findOneBy([
  121.                 "position" => $position
  122.             ]);
  123.             
  124.         if ($mediaGroup) {
  125.             
  126.             //Causing issues, see the soryBy function for details
  127.             //$mediaGroup = $mediaGroup->sortBy("random");
  128.             
  129.             return $mediaGroup;
  130.         }
  131.         
  132.         throw new ResourceNotFoundException ("Media group position: {$position} - Not Found");
  133.     }
  134.     
  135.     //Get X random active media group items (used for ads)
  136.     public function getRandomMediaGroupItems($mediaGroup$limit$site_code) {
  137.         
  138.         /*
  139.         $qb = $this->entityManager->createQueryBuilder();
  140.         
  141.         $qb->select('items')
  142.             ->from("App\Entity\MediaGroupItem", "items")
  143.             ->join("items.mediaGroup", "mg", "WITH", "mg.id = :mgId");
  144.         if($site_code) {
  145.             $qb->join("items.site", "s", "WITH", "s.id = :site")
  146.                 ->setParameter("site", $site_code);
  147.         }
  148.         $qb->setParameter("mgId", $mediaGroup->getId());
  149.         $qb->addSelect('RAND() as HIDDEN rand')->orderBy('rand()');
  150.         if($limit) {
  151.             $qb->setMaxResults($limit);
  152.         }
  153.         $results = $qb->getQuery()->getResult();
  154.         
  155.         return $results;
  156.         */
  157.         
  158.         $query implode(" ", array (
  159.                 "SELECT items",
  160.                 "FROM",
  161.                     "App\Entity\MediaGroupItem items",
  162.                 "JOIN",
  163.                     "items.mediaGroup mg",
  164.                 "JOIN",
  165.                     "items.site site",
  166.                 "WHERE",
  167.                     "mg.id = :mgId",
  168.                     "AND site.id = :site_code",
  169.                     "AND items.status = 1",
  170.                 //"Select RAND() as HIDDEN rand",
  171.                 "ORDER BY rand()",
  172.                 //"ORDER BY items.published_at DESC",
  173.             ));
  174.         
  175.         $query $this->entityManager
  176.             ->createQuery($query)
  177.             ->setParameter("mgId"$mediaGroup->getId())
  178.             ->setParameter("site_code"$site_code);
  179.             
  180.         if($limit) {
  181.             $query $query->setMaxResults($limit);
  182.         }
  183.         
  184.         $results $query->getResult();
  185.         
  186.         return $results;
  187.         
  188.     }
  189.     
  190.     public function getFirstItemByPosition($position "")
  191.     {
  192.         if(!$position) {
  193.             return null;
  194.         }
  195.         
  196.         try {
  197.             $mediaGroup $this->getMediaGroupByPosition($position);
  198.         } catch (\Exception $e) {
  199.             return null;
  200.         }
  201.         
  202.         return $mediaGroup->getFirstPublishedActiveMediaGroupItem($this->getSiteCode());
  203.         
  204.     }
  205.     public function getPopoutAdByCustomer($customer) {
  206.         
  207.         if(!$customer) {
  208.             return "";
  209.         }
  210.         $site_code $this->getSiteCode();
  211.         
  212.         $qb $this->entityManager->createQueryBuilder();
  213.         
  214.         $result $qb->select('item')
  215.             ->from("App\Entity\MediaGroupItem""item")
  216.             ->join("item.mediaGroup""mg""WITH""mg.position = 'ad-popout'")
  217.             ->join("item.customers""cu");
  218.         if($site_code) {
  219.             $qb->join("item.site""s""WITH""s.id = :site")
  220.                 ->setParameter("site"$site_code);
  221.         }
  222.         $result $qb->where("item.status = 1")
  223.             ->andWhere("cu.id = :cuid")
  224.             ->setMaxResults(1)
  225.             ->addOrderBy("item.published_at""DESC")
  226.             ->getQuery()
  227.             ->setParameter("cuid"$customer->getId())
  228.             ->getResult();
  229.             
  230.         if($result) {
  231.             return $result[0];
  232.         }
  233.         else {
  234.             return "";
  235.         }
  236.     }
  237.     public function getDefaultPopoutAd() {
  238.         
  239.         $site_code $this->getSiteCode();
  240.         if(!$site_code) {
  241.             return "";
  242.         }
  243.         
  244.         $qb $this->entityManager->createQueryBuilder();
  245.         
  246.         $result $qb->select('item')
  247.             ->from("App\Entity\MediaGroupItem""item")
  248.             ->join("item.mediaGroup""mg""WITH""mg.position = 'ad-popout'")
  249.             ->join("item.site""s""WITH""s.id = :site")
  250.             ->setParameter("site"$site_code)
  251.             ->where("item.status = 1")
  252.             ->andWhere("item.site_default = :site_default")
  253.             ->setParameter("site_default"$site_code)
  254.             ->setMaxResults(1)
  255.             ->addOrderBy("item.published_at""DESC")
  256.             ->getQuery()
  257.             ->getResult();
  258.             
  259.         if($result) {
  260.             return $result[0];
  261.         }
  262.         else {
  263.             return "";
  264.         }
  265.     }
  266.     //Exceptions for mega menu pinned ads
  267.     public function uriForPinned($uri$current_route) {
  268.         $uri rtrim($uri,"/");
  269.         if(in_array($current_route, ['forum''forums''forum_topic''forum_topic_edit'])) {
  270.             $uri "/forum";
  271.         }
  272.         else if(in_array($current_route, ['gallery_master'])) {
  273.             $uri "/roofing-galleries";
  274.         }
  275.         else if(in_array($current_route, ['events_master''event_master''events_month_master''events_day_master'])) {
  276.             $uri "/events";
  277.         }
  278.         else if(in_array($current_route, ['contests_master'])) {
  279.             $uri "/contests-and-games";
  280.         }
  281.         else if(in_array($current_route, ['promos_master'])) {
  282.             $uri "/promos-rebates";
  283.         }
  284.         else if(in_array($current_route, ['ebooks''ebooks_master''ebook''ebook_master'])) {
  285.             $uri "/ebooks";
  286.         }
  287.         else if(in_array($current_route, ['customerEbooks_master'])) {
  288.             $uri "/partner-ebooks";
  289.         }
  290.         else if(in_array($current_route, ['rlw-posts_master'])) {
  291.             if($site_code == 1) {
  292.                 $uri "/read-listen-watch-rcs";
  293.             }
  294.             else {
  295.                 $uri "/read-listen-watch";
  296.             }
  297.         }
  298.         else if(in_array($current_route, ['video_master'])) {
  299.             $uri "/videos";
  300.         }
  301.         else if(in_array($current_route, ['webinar_master'])) {
  302.             $uri "/partner-webinars";
  303.         }
  304.         else if(in_array($current_route, ['podcast_master']) || strpos($uri"/podcasts/") !== false) {
  305.             $uri "/podcasts";
  306.         }
  307.         
  308.         // || strpos($uri, "/events/") !== false
  309.         return $uri;
  310.     }
  311.     public function getPinnedAdByPosition($base_url$uri$current_route$ad_position) {
  312.         $site_code $this->getSiteCode();
  313.         
  314.         if(!$site_code) {
  315.             return "";
  316.         }
  317.         $uri $this->uriForPinned($uri$current_route);
  318.         
  319.         $qb $this->entityManager->createQueryBuilder();
  320.         
  321.         //TODO: look into how efficient this is and if it can be optimized
  322.         $result $qb->select('item')
  323.             ->from("App\Entity\MediaGroupItem""item")
  324.             ->join("item.mediaGroup""mg""WITH""mg.position = '{$ad_position}'")
  325.             ->join("item.site""s""WITH""s.id = :site")
  326.             ->setParameter("site"$site_code)
  327.             ->join("item.pins""p""WITH""p.site_id = :site")
  328.             ->setParameter("site"$site_code)
  329.             ->join("App\Entity\MegaMenu""mm""WITH""mm.uuid = p.mega_menu_uuid AND mm.status = 1")
  330.             ->leftJoin("App\Entity\MegaMenu""mm2""WITH""mm2.parent = mm.uuid and mm2.status = 1")
  331.             ->leftJoin("App\Entity\MegaMenu""mm3""WITH""mm3.parent = mm2.uuid and mm3.status = 1")
  332.             ->where("item.status = 1")
  333.             //->andWhere("mm.link = :link OR mm2.link = :link OR mm3.link = :link")
  334.             ->andWhere("mm.link = :link OR mm2.link = :link OR mm3.link = :link    OR mm.link = :link2 OR mm2.link = :link2 OR mm3.link = :link2")
  335.             ->setParameter("link"$base_url $uri)
  336.             ->setParameter("link2"$base_url $uri "/"//Some have trailing slashes. Should clean this up on save.
  337.             //->andWhere("item.site_default = :site_default")
  338.             ->setMaxResults(1)
  339.             ->addOrderBy("mm.position""ASC")
  340.             ->addOrderBy("mm2.position""ASC")
  341.             ->addOrderBy("mm3.position""ASC")
  342.             ->addOrderBy("item.published_at""DESC")
  343.             ->getQuery()
  344.             ->getResult();
  345.             
  346.         if($result) {
  347.             return $result[0];
  348.         }
  349.         else {
  350.             return "";
  351.         }
  352.     }
  353.     public function getContentByType ($type "") {
  354.         $site_code $this->getSiteCode();
  355.         $qb $this->entityManager->createQueryBuilder();
  356.         
  357.         $qb->select('c')
  358.             ->from("App\Entity\Content""c")
  359.             ->where("c.type = :type")
  360.             ->andWhere("c.status = 1 ");
  361.         if($site_code) {
  362.             $qb->join("c.site""s""WITH""s.id = :site")
  363.                 ->setParameter("site"$site_code);
  364.         }
  365.         $content $qb
  366.             ->setParameter("type"$type)
  367.             ->getQuery()->getResult();
  368.         
  369.         if($content) {
  370.             return $content;
  371.         }
  372.         return [];
  373.     }
  374.     
  375.     public function getAdsForAnalyticsAggregated($customer$startDate$endDate)
  376.     {
  377.         $query implode(" ", array (
  378.                 "SELECT DISTINCT item",
  379.                 "FROM",
  380.                     "App\Entity\MediaGroupItem item",
  381.                 "JOIN",
  382.                     "item.customers customer",
  383.                 "LEFT JOIN",
  384.                     "customer.prnt prnt",
  385.                 "JOIN",
  386.                     "item.ad_analytics_daily ad_analytics_daily",
  387.                 "WHERE",
  388.                     "(customer.id = :id OR prnt.id = :id)",
  389.                     "AND ad_analytics_daily.day BETWEEN :start AND :end",
  390.             ));
  391.         
  392.         $results $this->entityManager
  393.             ->createQuery($query)
  394.             ->setParameter("id"$customer->getId())
  395.             ->setParameter("start"$startDate)
  396.             ->setParameter("end"$endDate)
  397.         ->getResult();
  398.         
  399.         return $results;
  400.     }
  401.     
  402.     public function countAdImpressions($item$startDate$endDate$site_id="")
  403.     {
  404.         $query implode(" ", array (
  405.                 "SELECT COUNT(impression.traffic_data)",
  406.                 "FROM",
  407.                     "App\Entity\AdImpression impression",
  408.                 "WHERE",
  409.                     "impression.media_group_item = :mg",
  410.                     "AND (impression.requested_at BETWEEN :start AND :end)",
  411.                     
  412.                     ($site_id implode(" ", array (
  413.                         "AND impression.site_id = {$site_id}",
  414.                     )) : ""),
  415.                     
  416.             ));
  417.         
  418.         $count $this->entityManager
  419.             ->createQuery($query)
  420.             ->setParameter("mg"$item)
  421.             ->setParameter("start"$startDate)
  422.             ->setParameter("end"$endDate)
  423.         ->getResult();
  424.         
  425.         if (!empty($count)) {
  426.             return (int) $count[0][1];
  427.         }
  428.         
  429.         return 0;
  430.     }
  431.     
  432.     public function countAdImpressionsGroupedBySite($item$startDate$endDate)
  433.     {
  434.         $query implode(" ", array (
  435.                 "SELECT impression.site_id, COUNT(impression.traffic_data) as impressions",
  436.                 "FROM",
  437.                     "App\Entity\AdImpression impression",
  438.                 "JOIN",
  439.                     "impression.media_group_item item",
  440.                 "WHERE",
  441.                     "item.id = :id",
  442.                     "AND (impression.requested_at BETWEEN :start AND :end)",
  443.                 "GROUP BY impression.site_id",
  444.             ));
  445.         
  446.         $results $this->entityManager
  447.             ->createQuery($query)
  448.             ->setParameter("id"$item->getId())
  449.             ->setParameter("start"$startDate)
  450.             ->setParameter("end"$endDate)
  451.         ->getResult();
  452.         
  453.         return $results;
  454.     }
  455.     
  456.     public function countAdImpressionsAggregated($item$startDate$endDate$site_id="")
  457.     {
  458.         $query implode(" ", array (
  459.                 "SELECT SUM(ad_analytics_daily.impressions)",
  460.                 "FROM",
  461.                     "App\Entity\AdAnalyticsDaily ad_analytics_daily",
  462.                 "JOIN",
  463.                     "ad_analytics_daily.media_group_item item",
  464.                 "WHERE",
  465.                     "item.id = :id",
  466.                     "AND ad_analytics_daily.day BETWEEN :start AND :end",
  467.                     ($site_id implode(" ", [
  468.                         "AND ad_analytics_daily.site_id = {$site_id}",
  469.                     ]) : ""),
  470.             ));
  471.         
  472.         $count $this->entityManager
  473.             ->createQuery($query)
  474.             ->setParameter("id"$item)
  475.             ->setParameter("start"$startDate)
  476.             ->setParameter("end"$endDate)
  477.         ->getResult();
  478.         
  479.         if (!empty($count)) {
  480.             return (int) $count[0][1];
  481.         }
  482.         
  483.         return 0;
  484.     }
  485.     
  486.     public function countAdClicks($item$startDate$endDate$site_id="")
  487.     {
  488.         $query implode(" ", array (
  489.                 "SELECT COUNT(click.traffic_data)",
  490.                 "FROM",
  491.                     "App\Entity\AdClick click",
  492.                 "JOIN",
  493.                     "click.media_group_item item",
  494.                 "WHERE",
  495.                     "item.id = :id",
  496.                     "AND (click.requested_at BETWEEN :start AND :end)",
  497.                     
  498.                     ($site_id implode(" ", array (
  499.                         "AND click.site_id = {$site_id}",
  500.                     )) : ""),
  501.                     
  502.             ));
  503.         
  504.         $count $this->entityManager
  505.             ->createQuery($query)
  506.             ->setParameter("id"$item->getId())
  507.             ->setParameter("start"$startDate)
  508.             ->setParameter("end"$endDate)
  509.         ->getResult();
  510.         
  511.         if (!empty($count)) {
  512.             return (int) $count[0][1];
  513.         }
  514.         
  515.         return 0;
  516.     }
  517.     
  518.     public function countAdClicksGroupedBySite($item$startDate$endDate)
  519.     {
  520.         $query implode(" ", array (
  521.                 "SELECT click.site_id, COUNT(click.traffic_data) as views",
  522.                 "FROM",
  523.                     "App\Entity\AdClick click",
  524.                 "JOIN",
  525.                     "click.media_group_item item",
  526.                 "WHERE",
  527.                     "item.id = :id",
  528.                     "AND (click.requested_at BETWEEN :start AND :end)",
  529.                 "GROUP BY click.site_id",
  530.             ));
  531.         
  532.         $results $this->entityManager
  533.             ->createQuery($query)
  534.             ->setParameter("id"$item->getId())
  535.             ->setParameter("start"$startDate)
  536.             ->setParameter("end"$endDate)
  537.         ->getResult();
  538.         
  539.         return $results;
  540.     }
  541.     
  542.     public function countAdClicksAggregated($item$startDate$endDate$site_id="")
  543.     {
  544.         $query implode(" ", array (
  545.                 "SELECT SUM(ad_analytics_daily.views)",
  546.                 "FROM",
  547.                     "App\Entity\AdAnalyticsDaily ad_analytics_daily",
  548.                 "JOIN",
  549.                     "ad_analytics_daily.media_group_item media_group_item",
  550.                 "WHERE",
  551.                     "media_group_item.id = :id",
  552.                     "AND ad_analytics_daily.day BETWEEN :start AND :end",
  553.                     ($site_id implode(" ", [
  554.                         "AND ad_analytics_daily.site_id = {$site_id}",
  555.                     ]) : ""),
  556.             ));
  557.         
  558.         $sum $this->entityManager
  559.             ->createQuery($query)
  560.             ->setParameter("id"$item->getId())
  561.             ->setParameter("start"$startDate)
  562.             ->setParameter("end"$endDate)
  563.         ->getResult();
  564.         
  565.         if (!empty($sum)) {
  566.             return (int) $sum[0][1];
  567.         }
  568.         
  569.         return 0;
  570.     }
  571.     
  572.     public function countTotalAdImpressions($customer$startDate$endDate)
  573.     {
  574.         $query implode(" ", array (
  575.                 "SELECT COUNT(impression.traffic_data)",
  576.                 "FROM",
  577.                     "App\Entity\AdImpression impression",
  578.                 "JOIN",
  579.                     "impression.media_group_item item",
  580.                 "JOIN",
  581.                     "item.customers customer",
  582.                 "WHERE",
  583.                     "customer.id = :id",
  584.                     "AND (impression.requested_at BETWEEN :start AND :end)",
  585.             ));
  586.         
  587.         $count $this->entityManager
  588.             ->createQuery($query)
  589.             ->setParameter("id"$customer->getId())
  590.             ->setParameter("start"$startDate)
  591.             ->setParameter("end"$endDate)
  592.         ->getResult();
  593.         
  594.         if (!empty($count)) {
  595.             return (int) $count[0][1];
  596.         }
  597.         
  598.         return 0;
  599.     }
  600.     
  601.     public function countTotalAdImpressionsAggregated($customer$startDate$endDate)
  602.     {
  603.         $query implode(" ", array (
  604.                 "SELECT SUM(ad_analytics_daily.impressions)",
  605.                 "FROM",
  606.                     "App\Entity\AdAnalyticsDaily ad_analytics_daily",
  607.                 "JOIN",
  608.                     "ad_analytics_daily.media_group_item item",
  609.                 "JOIN",
  610.                     "item.customers customer",
  611.                 "WHERE",
  612.                     "customer.id = :id",
  613.                     "AND (ad_analytics_daily.day BETWEEN :start AND :end)",
  614.             ));
  615.         
  616.         $count $this->entityManager
  617.             ->createQuery($query)
  618.             ->setParameter("id"$customer->getId())
  619.             ->setParameter("start"$startDate)
  620.             ->setParameter("end"$endDate)
  621.         ->getResult();
  622.         
  623.         if (!empty($count)) {
  624.             return (int) $count[0][1];
  625.         }
  626.         
  627.         return 0;
  628.     }
  629.     
  630.     public function countTotalAdClicks($customer$startDate$endDate)
  631.     {
  632.         $query implode(" ", array (
  633.                 "SELECT COUNT(click.traffic_data)",
  634.                 "FROM",
  635.                     "App\Entity\AdClick click",
  636.                 "JOIN",
  637.                     "click.media_group_item item",
  638.                 "JOIN",
  639.                     "item.customers customer",
  640.                 "WHERE",
  641.                     "customer.id = :id",
  642.                     "AND (click.requested_at BETWEEN :start AND :end)",
  643.             ));
  644.         
  645.         $count $this->entityManager
  646.             ->createQuery($query)
  647.             ->setParameter("id"$customer->getId())
  648.             ->setParameter("start"$startDate)
  649.             ->setParameter("end"$endDate)
  650.         ->getResult();
  651.         
  652.         if (!empty($count)) {
  653.             return (int) $count[0][1];
  654.         }
  655.         
  656.         return 0;
  657.     }
  658.     
  659.     public function countTotalAdClicksAggregated($customer$startDate$endDate)
  660.     {
  661.         $query implode(" ", array (
  662.                 "SELECT SUM(ad_analytics_daily.views)",
  663.                 "FROM",
  664.                     "App\Entity\AdAnalyticsDaily ad_analytics_daily",
  665.                 "JOIN",
  666.                     "ad_analytics_daily.media_group_item item",
  667.                 "JOIN",
  668.                     "item.customers customer",
  669.                 "WHERE",
  670.                     "customer.id = :id",
  671.                     "AND (ad_analytics_daily.day BETWEEN :start AND :end)",
  672.             ));
  673.         
  674.         $count $this->entityManager
  675.             ->createQuery($query)
  676.             ->setParameter("id"$customer->getId())
  677.             ->setParameter("start"$startDate)
  678.             ->setParameter("end"$endDate)
  679.         ->getResult();
  680.         
  681.         if (!empty($count)) {
  682.             return (int) $count[0][1];
  683.         }
  684.         
  685.         return 0;
  686.     }
  687. }