src/Controller/Api/ApiEventController.php line 218

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Api;
  3. use App\Entity\EndUser;
  4. use App\Entity\Order;
  5. use App\Entity\Product;
  6. use App\Entity\ProductVariant;
  7. use App\Helper\Order\OrderHelper;
  8. use App\Service\DomainManager;
  9. use App\Service\EndUserManager;
  10. use App\Service\EventProvider\EventProvider;
  11. use App\Service\EventProvider\FacebookProvider;
  12. use App\Service\EventProviderManager;
  13. use App\Service\ProductManager;
  14. use Doctrine\ORM\EntityManagerInterface;
  15. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  16. use Symfony\Component\HttpFoundation\JsonResponse;
  17. use Symfony\Component\HttpFoundation\Request;
  18. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  19. use Symfony\Component\Routing\Annotation\Route;
  20. class ApiEventController extends AbstractController
  21. {
  22.     public function __construct(
  23.         private readonly EventProviderManager $eventProviderManager,
  24.         private readonly EntityManagerInterface $em,
  25.         private readonly ProductManager $productManager,
  26.         private readonly EndUserManager $endUserManager,
  27.         private readonly SessionInterface $session,
  28.         private readonly DomainManager $domainManager,
  29.     )
  30.     {}
  31.     /**
  32.      * @Route("/{_locale}/api/event/add_to_cart", name="api_event_add_to_cart", methods={"POST"})
  33.      * @param Request $request
  34.      * @return JsonResponse
  35.      */
  36.     public function addToCartAction(Request $request): JsonResponse
  37.     {
  38.         try {
  39.             if (!$request->request->has('product_id') || !$request->request->has('variant_id')) {
  40.                 return new JsonResponse(['status' => 'error''message' => 'Missing required fields'], 400);
  41.             }
  42.             $product $this->em->getRepository(Product::class)->find($request->request->get('product_id'));
  43.             if (!$product) {
  44.                 return new JsonResponse(['status' => 'error''message' => 'Product not found'], 404);
  45.             }
  46.             $productVariant $this->productManager->getProductVariant($product$request->request->get('variant_id'));
  47.             $endUser null;
  48.             if($request->request->has('email') && !empty($request->request->get('email'))) {
  49.                 $endUser $this->endUserManager->findUserByEmail($request->request->get('email'));
  50.             }
  51. //            $endUser = new EndUser();
  52. //            if (!$endUser) {
  53. //                $endUser = new EndUser();
  54. //                $endUser
  55. //                    ->setEmail($request->request->get('email'))
  56. //                    ->setFirstName($request->request->get('first_name', ''))
  57. //                    ->setLastName($request->request->get('last_name', ''));
  58. //
  59. //            }
  60.             $actionURL $request->request->get('action_url');
  61.             $this->eventProviderManager->sendEvent(
  62.                 EventProvider::EVENT_ADD_TO_CART,
  63.                 $productVariant,
  64.                 null,
  65.                 null,
  66.                 false,
  67.                 $actionURL
  68.             );
  69.             return new JsonResponse(['status' => 'success''message' => 'Checkout initiated successfully']);
  70.         } catch (\Exception $e) {
  71.             return new JsonResponse(['status' => 'error''message' => $e->getMessage()], 400);
  72.         }
  73.     }
  74.     /**
  75.      * @Route("/{_locale}/api/event/initiate_checkout", name="api_event_initiate_checkout", methods={"POST"})
  76.      * @param Request $request
  77.      * @return JsonResponse
  78.      */
  79.     public function initiateCheckoutAction(Request $request): JsonResponse
  80.     {
  81.         try {
  82.             if (!$request->request->has('product_id') || !$request->request->has('variant_id') || !$request->request->get('email')) {
  83.                 return new JsonResponse(['status' => 'error''message' => 'Missing required fields'], 400);
  84.             }
  85.             $product $this->em->getRepository(Product::class)->find($request->request->get('product_id'));
  86.             if (!$product) {
  87.                 return new JsonResponse(['status' => 'error''message' => 'Product not found'], 404);
  88.             }
  89.             $productVariant $this->productManager->getProductVariant($product$request->request->get('variant_id'));
  90.             $endUser null;
  91.             if($request->request->has('email') && !empty($request->request->get('email'))) {
  92.                 $endUser $this->endUserManager->findUserByEmail($request->request->get('email'));
  93.             }
  94.             if (!$endUser) {
  95.                 $endUser = new EndUser();
  96.                 $endUser
  97.                     ->setEmail($request->request->get('email'))
  98.                     ->setFirstName($request->request->get('first_name'''))
  99.                     ->setLastName($request->request->get('last_name'''))
  100.                     ->setlocale($request->getLocale() ?? 'en');
  101.             }
  102.             $actionURL $request->request->get('action_url');
  103.             $this->eventProviderManager->sendEvent(
  104.                 EventProvider::EVENT_INITIATE_CHECKOUT,
  105.                 $productVariant,
  106.                 $endUser,
  107.                 null,
  108.                 false,
  109.                 $actionURL
  110.             );
  111.             return new JsonResponse(['status' => 'success''message' => 'Checkout initiated successfully']);
  112.         } catch (\Exception $e) {
  113.             return new JsonResponse(['status' => 'error''message' => $e->getMessage()], 400);
  114.         }
  115.     }
  116.     /**
  117.      * @Route("/{_locale}/api/event/getData", name="api_event_get_data", methods={"POST"})
  118.      * @param Request $request
  119.      * @return JsonResponse
  120.      */
  121.     public function getDataAction(Request $request): JsonResponse
  122.     {
  123.         try {
  124.             $productVariantParam $request->request->get('variant_id'null);
  125.             $productVariant $this->em->getRepository(ProductVariant::class)->find($productVariantParam);
  126.             if (!$productVariantParam) {
  127.                 return new JsonResponse(['status' => 'error''message' => 'Missing required fields'], 400);
  128.             }
  129.             if (!$this->validateForFacebook()) {
  130.                 return new JsonResponse(null204);
  131.             }
  132.             $product $productVariant->getProduct();
  133.             $currency $product->getDefaultCurrency();
  134.             $totalPrice $productVariant->getTotalPrice();
  135.             $eventID $request->cookies->get('eventID') ?? '';
  136.             $data = [
  137.                 'eventID' => $request->cookies->get('eventID') ?? '',
  138.                 'data' => [
  139.                     'content_type' => 'product',
  140.                     'currency' => strtoupper($currency),
  141.                     'content_ids' => [$product->getProductDetail()->getSku()],
  142.                 ]
  143.             ];
  144.             $contents[] = [
  145.                 'id' => $product->getProductDetail()->getSku(),
  146.                 'quantity' => $productVariant->getQuantity(),
  147.                 'item_price' => $productVariant->getUnitPrice(),
  148.                 'title' => $product->getProductDetail()->getTitle(),
  149.                 'category' => 'main',
  150.             ];
  151.             $sessionKey OrderHelper::cartKey($productApiCheckoutController::SESSION_UPSELL_KEY);
  152.             if ($this->session->has($sessionKey)) {
  153.                 $upsells $this->session->get($sessionKey);
  154.                 foreach ($upsells as $upsell) {
  155.                     $productUpsell $this->productManager->findProductById($upsell['productId']);
  156.                     $productUpsellVariant $productUpsell->getVariants()->first();
  157.                     if (!$productUpsell || !$productUpsellVariant) {
  158.                         continue;
  159.                     }
  160.                     $totalPrice += $productUpsellVariant->getTotalPrice();
  161.                     $contents[] = [
  162.                         'id' => $productUpsell->getProductDetail()->getSku(),
  163.                         'quantity' => $productUpsellVariant->getQuantity(),
  164.                         'item_price' => $productUpsellVariant->getUnitPrice(),
  165.                         'title' => $productUpsell->getProductDetail()->getTitle(),
  166.                         'category' => 'upsell',
  167.                     ];
  168.                 }
  169.             }
  170.             $data['data']['value'] = round($totalPrice2);
  171.             $data['data']['contents'] = $contents;
  172.             return new JsonResponse(['status' => 'success''data' => $data]);
  173.         } catch (\Exception $e) {
  174.             return new JsonResponse(['status' => 'error''message' => $e->getMessage()], 400);
  175.         }
  176.     }
  177.     /**
  178.      * @Route("/{_locale}/api/event/getDataByOrder", name="api_event_get_data_by_order", methods={"POST"})
  179.      * @param Request $request
  180.      * @return JsonResponse
  181.      */
  182.     public function getDataByOrderAction(Request $request): JsonResponse
  183.     {
  184.         try {
  185.             $orderId $request->request->get('order_id'null);
  186.             $order $this->em->getRepository(Order::class)->find($orderId);
  187.             if (!$order) {
  188.                 return new JsonResponse(['status' => 'error''message' => 'Order not found'], 404);
  189.             }
  190.             if (!$this->validateForFacebook($order)) {
  191.                 return new JsonResponse(null204);
  192.             }
  193.             $eventID $request->cookies->get('eventID') ?? '';
  194.             $isPostUpsell OrderHelper::getOrderSuffix($order->getOrderNumber());
  195.             $prefix 'p';
  196.             if ($isPostUpsell) {
  197. //                $prefix .= '-upsell' . $isPostUpsell;
  198.                 return new JsonResponse(['status' => 'error''message' => 'postUpsell'], 200);
  199.             }
  200.             $data = [
  201.                 'eventID' => $prefix '-' $eventID,
  202.                 'data' => [
  203.                     'content_type' => 'product',
  204.                     'currency' => strtoupper($order->getCurrency()),
  205.                     'value' => round($order->getTotalPrice(), 2),
  206.                 ]
  207.             ];
  208.             $contents $content_ids = [];
  209.             foreach ($order->getProducts() as $orderItem) {
  210.                 $product $orderItem->getProduct();
  211.                 $content_ids[] = $product->getProductDetail()->getSku();
  212.                 $contents[] = [
  213.                     'id' => $product->getProductDetail()->getSku(),
  214.                     'quantity' => $orderItem->getQuantity(),
  215.                     'item_price' => $orderItem->getPrice(),
  216.                     'title' => $product->getProductDetail()->getTitle(),
  217.                     'category' => $product->isMainProduct() ? 'main' 'upsell',
  218.                 ];
  219.             }
  220.             $data['data']['contents'] = $contents;
  221.             $data['data']['content_ids'] = $content_ids;
  222.             return new JsonResponse(['status' => 'success''data' => $data]);
  223.         } catch (\Exception $e) {
  224.             return new JsonResponse(['status' => 'error''message' => $e->getMessage()], 400);
  225.         }
  226.     }
  227.     public function validateForFacebook(?Order $order null): bool
  228.     {
  229.         $domain $this->domainManager->getCurrentDomain();
  230.         $tracker $this->eventProviderManager->detectTrackerFromRequest();
  231.         $trackersEventProviders $domain->getDefaultEventProviders() ?? [];
  232.         $trackersEventProviders $tracker $tracker->getEventProviders() : $trackersEventProviders;
  233.         if ($order) {
  234.             $trackersEventProviders $order->getTracker() ? $order->getTracker()->getEventProviders() : $trackersEventProviders;
  235.         }
  236.         return !empty($trackersEventProviders)
  237.             && in_array(FacebookProvider::PROVIDER_NAME$trackersEventProviders);
  238.     }
  239. }