src/Services/Sale/SaleCacheService.php line 61

Open in your IDE?
  1. <?php
  2. /**
  3.  * Created by PhpStorm.
  4.  * User: adv
  5.  * Date: 2018-12-17
  6.  * Time: 13:59
  7.  */
  8. namespace Slivki\Services\Sale;
  9. use Doctrine\ORM\EntityManagerInterface;
  10. use Slivki\Entity\Category;
  11. use Slivki\Entity\GeoLocation;
  12. use Slivki\Entity\Media;
  13. use Slivki\Entity\OfferPayedCategory;
  14. use Slivki\Entity\Sale;
  15. use Slivki\Repository\SaleRepository;
  16. use Slivki\Services\CacheService;
  17. use Slivki\Util\SoftCache;
  18. use Slivki\Util\TarantoolCache;
  19. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  20. use Symfony\Component\Security\Acl\Exception\Exception;
  21. use Symfony\Component\Serializer\Encoder\JsonEncoder;
  22. use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
  23. use Symfony\Component\Serializer\Serializer;
  24. class SaleCacheService extends CacheService {
  25.     const SPACE_NAME 'sale';
  26.     private $entityManager;
  27.     public function __construct(EntityManagerInterface $entityManager) {
  28.         $this->entityManager $entityManager;
  29.     }
  30.     public function reloadSaleCache($saleID$reloadMemcache true) {
  31.         $sale null;
  32.         if ($reloadMemcache) {
  33.             $sale $this->entityManager->getRepository(Sale::class)->reloadCacheForSale($saleID);
  34.         } else {
  35.             $sale $this->entityManager->getRepository(Sale::class)->findCached($saleID);
  36.         }
  37.         if (!$sale) {
  38.             $this->deleteSale($saleID);
  39.             return false;
  40.         }
  41.         $tarantool = new TarantoolCache(self::SPACE_NAME);
  42.         $tarantool->set($saleID, [$saleIDjson_encode($sale)]);
  43.         $this->cacheGeoLocations($saleID$sale->getGeoLocations()->toArray());
  44.         return $sale;
  45.     }
  46.     public function getSale($saleID$fullData false) {
  47.         $saleID = (int)$saleID;
  48.         $tarantool = new TarantoolCache(self::SPACE_NAME);
  49.         $data $tarantool->get($saleID);
  50.         if (!$data) {
  51.             return $this->entityManager->getRepository(Sale::class)->getActiveSaleByID($saleID);
  52.         }
  53.         $serializer = new Serializer([new ObjectNormalizer()], [new JsonEncoder()]);
  54.         /** @var Sale $sale */
  55.         $sale $serializer->deserialize($data[0][1], Sale::class, 'json');
  56.         $sale->fromJSON(json_decode($data[0][1]));
  57.         $sale->setIcon($this->entityManager->getRepository(Media::class)->getSaleIconMedia($sale->getID()));
  58.         if ($fullData) {
  59.             $sale->setGeoLocations($this->getGeoLocations(GeoLocation::TYPEGeoLocation::class, $saleID));
  60.         }
  61.         return $sale;
  62.     }
  63.     public function deleteSale($saleID) {
  64.         $tarantool = new TarantoolCache(self::SPACE_NAME);
  65.         $tarantool->callFunction('deleteSale', [(int)$saleID]);
  66.     }
  67.     public function getSalesByCategoryID($categoryID) {
  68.         $softCache = new SoftCache(SaleRepository::CACHE_NAME);
  69.         $saleListByCategory $softCache->get(SaleRepository::ACTIVE_SALES_BY_CATEGORY);
  70.         $tarantool = new TarantoolCache();
  71.         $sales = [];
  72.         if (isset($saleListByCategory[$categoryID])) {
  73.             $salesData $tarantool->callFunction('getSales', [$saleListByCategory[$categoryID]]);
  74.             if (!$salesData || (isset($salesData[0][0][0]) && count($salesData[0][0][0]) == 0)) {
  75.                 return [];
  76.             }
  77.             foreach ($salesData[0][0] as $data) {
  78.                 $sale $this->unserializeSale($data);
  79.                 if ($sale) {
  80.                     $sales[] = $sale;
  81.                 }
  82.             }
  83.         }
  84.         return $sales;
  85.     }
  86.     private function unserializeSale($data) {
  87.         if (count($data) == 0) {
  88.             return false;
  89.         }
  90.         $serializer = new Serializer([new ObjectNormalizer()], [new JsonEncoder()]);
  91.         /** @var Sale $sale */
  92.         $sale $serializer->deserialize($data[0][1], Sale::class, 'json');
  93.         $sale->fromJSON(json_decode($data[0][1]));
  94.         $sale->setGeoLocations($this->getGeoLocations(GeoLocation::TYPEGeoLocation::class, $data[0][0]));
  95.         $sale->setIcon($this->entityManager->getRepository(Media::class)->getSaleIconMedia($sale->getID()));
  96.         $sale->setFlierMedia($this->entityManager->getRepository(Media::class)->getFlierImageMedia($sale->getID()));
  97.         return $sale;
  98.     }
  99.     public function getSalesSorted($categoryID) {
  100.         $saleList $this->getSalesByCategoryID($categoryID);
  101.         $payedPositions $this->entityManager->getRepository(OfferPayedCategory::class)->findBy(
  102.             ['categoryID' => $categoryID], ['position' => 'asc']);
  103.         if ($payedPositions) {
  104.             foreach ($payedPositions as $position) {
  105.                 foreach ($saleList as $key => $sale) {
  106.                     if ($sale->getID() == $position->getEntityID()) {
  107.                         unset($saleList[$key]);
  108.                         array_splice($saleList$position->getPosition() - 10, [$sale]);
  109.                         break;
  110.                     }
  111.                 }
  112.             }
  113.         }
  114.         return $saleList;
  115.     }
  116.     public function getRelatedSales(Sale $sale, &$salesOffset) {
  117.         $result = [];
  118.         $this->getRelatedSalesByCategory($saleSaleRepository::POPULAR_SALE_CATEGORY_ID$resultfalse$salesOffset'popular');
  119.         $this->getRelatedSalesByCategory($saleCategory::SALE_VIDEO_GUIDE_CATEGORY_ID$resultfalse$salesOffset'new');
  120.         $categoryID null;
  121.         $entiityManager $this->entityManager;
  122.         $sale $entiityManager->merge($sale);
  123.         $entiityManager->detach($sale);
  124.         foreach ($sale->getCategories() as $category) {
  125.             if ($category->getEntityCount() > && !in_array($category->getID(), [SaleRepository::POPULAR_SALE_CATEGORY_IDSaleRepository::NEW_CATEGORY_IDCategory::PHOTOGUIDE_SALE_CATEGORY_ID])) {
  126.                 $categoryID $category->getID();
  127.                 break;
  128.             }
  129.         }
  130.         if (!$categoryID) {
  131.             foreach ($sale->getCategories() as $category) {
  132.                 if ($category->getID() == SaleRepository::POPULAR_SALE_CATEGORY_ID || $category->getEntityCount() < 4) {
  133.                     continue;
  134.                 }
  135.                 $categoryID $category->getID();
  136.                 if (in_array($categoryID, [SaleRepository::SOS_CATEGORY_IDSaleRepository::NEW_CATEGORY_IDCategory::PHOTOGUIDE_SALE_CATEGORY_ID])) {
  137.                     $this->getRelatedSalesByCategory($sale$categoryID$resulttrue$salesOffset'extra');
  138.                 } else {
  139.                     $this->getRelatedSalesByCategory($sale$categoryID$resultfalse$salesOffset'extra');
  140.                 }
  141.                 break;
  142.             }
  143.         } else {
  144.             $this->getRelatedSalesByCategory($sale$categoryID$result,  false$salesOffset'extra');
  145.         }
  146.         return $result;
  147.     }
  148.     private function getRelatedSalesByCategory(Sale $sale$categoryID, &$saleList$isFakeCategory, &$salesOffset$key) {
  149.         $count 0;
  150.         $limit 4;
  151.         $salesByCategory $this->getSalesSorted($categoryID);
  152.         $countSalesByCategory count($salesByCategory);
  153.         if (!isset($salesOffset[$key]) || $salesOffset[$key] * $limit >= ceil($countSalesByCategory 2)) {
  154.             $salesOffset[$key] = 0;
  155.         }
  156.         $salesByCategory array_slice($salesByCategory$salesOffset[$key] * $limit);
  157.         $salesOffset[$key]++;
  158.         foreach ($salesByCategory as $saleItem) {
  159.             if ($sale->getID() != $saleItem->getID()) {
  160.                 $found false;
  161.                 foreach ($saleList as $category) {
  162.                     foreach ($category as $saleListItem) {
  163.                         if ($saleListItem->getID() == $saleItem->getID()) {
  164.                             $found true;
  165.                             break;
  166.                         }
  167.                     }
  168.                 }
  169.                 if (!$found) {
  170.                     if($isFakeCategory) {
  171.                         $saleList[SaleRepository::FAKE_CATEGORY_ID][] = $saleItem;
  172.                     } else {
  173.                         $saleList[$categoryID][] = $saleItem;
  174.                     }
  175.                     $count++;
  176.                 }
  177.                 if ($count == $limit) {
  178.                     return;
  179.                 }
  180.             }
  181.         }
  182.     }
  183.     public function getActiveSalesGroupedByCategory() {
  184.         $saleCategoryList $this->entityManager->getRepository(Category::class)->getActiveCategories(0, array(Category::DEFAULT_CATEGORY_TYPE), Category::SALE_CATEGORY_ID);
  185.         $activeSalesAmount 0;
  186.         $salesList = [];
  187.         foreach ($saleCategoryList as $saleCategory) {
  188.             $saleList $this->getSalesByCategoryID($saleCategory->getID());
  189.             $activeSalesAmount += count($saleList);
  190.             $categoryID $saleCategory->getID();
  191.             $payedPositions $this->entityManager->getRepository(OfferPayedCategory::class)->findBy(
  192.                 ['categoryID' => $categoryID], ['position' => 'asc']);
  193.             if ($payedPositions) {
  194.                 foreach ($payedPositions as $position) {
  195.                     foreach ($saleList as $key => $sale) {
  196.                         if ($sale->getID() == $position->getEntityID()) {
  197.                             unset($saleList[$key]);
  198.                             array_splice($saleList$position->getPosition() - 10, [$sale]);
  199.                             break;
  200.                         }
  201.                     }
  202.                 }
  203.             }
  204.             $categoryItem = [
  205.                 "category" => $saleCategory,
  206.                 "saleList" => $saleList
  207.             ];
  208.             if ($saleCategory->getID() == Category::COMPANY_NEWS_SALE_CATEGORY_ID) {
  209.                 array_unshift($salesList$categoryItem);
  210.             } else {
  211.                 $salesList[] = $categoryItem;
  212.             }
  213.         }
  214.         return ['salesList' => $salesList'activeSalesAmount' => $activeSalesAmount];
  215.     }
  216. }