<?php
namespace App\Controller;
use App\Checkout\CheckoutSessionManager;
use App\Form\WPSYCommerce\CheckoutAddressType;
use App\Images\ImageRenderer;
use App\Service\WPSYCommerceService;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Form\FormFactoryInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Validator\Validator\ValidatorInterface;
use Twig\Environment;
/**
* @Route("/wpsy/commerce")
*/
class WPSYCommerceAPIController extends AbstractController
{
private ImageRenderer $imageRenderer;
private EntityManagerInterface $entityManager;
private WPSYCommerceService $wpsyCommerceService;
private CheckoutSessionManager $sessionManager;
public function __construct(EntityManagerInterface $entityManager, ImageRenderer $imageRenderer, WPSYCommerceService $wpsyCommerceService, CheckoutSessionManager $sessionManager)
{
$this->imageRenderer = $imageRenderer;
$this->entityManager = $entityManager;
$this->wpsyCommerceService = $wpsyCommerceService;
$this->sessionManager = $sessionManager;
}
#[Route('/add-to-cart', name: 'wpsy_commerce_add_to_cart', methods: ['POST'])]
public function addToCart(Request $request)
{
$data = \json_decode($request->getContent(), true);
if (!isset($data['product_id'])) {
throw new BadRequestHttpException('Missing product_id');
}
$product = wc_get_product($data['product_id']);
$productVariation = wc_get_product($data['variation_id'] ?? null);
$variationAttributes = array();
$cart_item_data = array();
$price = $product->get_price();
if ($productVariation && isset($data['variation_id'])) {
$variationAttributes = $data['attributes'] ?? $productVariation->get_variation_attributes();
$price = $productVariation->get_price();
}
WC()->cart->add_to_cart($data['product_id'], $data['quantity'] ?? 1, $data['variation_id'] ?? null, $variationAttributes, $cart_item_data);
WC()->cart->calculate_totals();
WC()->cart->set_session();
WC()->cart->persistent_cart_update();
WC()->session->save_data();
return new JsonResponse([
'success' => true,
'cart_length' => WC()->cart->get_cart_contents_count(),
'price' => $price
]);
}
#[Route('/get-cart-count', name: 'wpsy_commerce_get_cart_count')]
public function getCartCount()
{
return new JsonResponse([
'cart_contents_count' => WC()->cart->get_cart_contents_count(),
]);
}
#[Route('/update-cart', name: 'wpsy_commerce_update_cart')]
public function updateCart(Request $request)
{
$data = \json_decode($request->getContent(), true);
if (!isset($data['cart'])) {
throw new BadRequestHttpException('Missing cart');
}
foreach ($data['cart']['items'] as $cart_item_key => $cart_item) {
$quantity = $cart_item['quantity'];
if ($quantity <= 0) {
WC()->cart->remove_cart_item($cart_item_key);
continue;
}
WC()->cart->set_quantity($cart_item_key, $quantity);
}
WC()->cart->calculate_totals();
WC()->cart->set_session();
WC()->cart->persistent_cart_update();
WC()->session->save_data();
return new JsonResponse([
'success' => true,
'cart' => $this->wpsyCommerceService->getCart(),
'shipping' => $this->wpsyCommerceService->getShipping(),
]);
}
#[Route('/apply-coupon', name: 'wpsy_commerce_apply_coupon', methods: ['POST'])]
public function applyCoupon(Request $request)
{
$data = \json_decode($request->getContent(), true);
if (!isset($data['coupon'])) {
throw new BadRequestHttpException('Missing coupon');
}
WC()->cart->apply_coupon($data['coupon']);
$notices = wc_get_notices();
wc_clear_notices();
if ($notices && isset($notices['error'])) {
$message = implode(', ', array_column($notices['error'], 'notice'));
return new JsonResponse([
'success' => false,
'message' => $message,
]);
}
WC()->cart->calculate_totals();
WC()->cart->set_session();
WC()->cart->persistent_cart_update();
WC()->session->save_data();
return new JsonResponse([
'success' => true,
'cart' => $this->wpsyCommerceService->getCart(),
]);
}
#[Route('/remove-coupon', name: 'wpsy_commerce_remove_coupon', methods: ['POST'])]
public function removeCoupon(Request $request)
{
$data = \json_decode($request->getContent(), true);
if (!isset($data['coupon'])) {
throw new BadRequestHttpException('Missing coupon');
}
WC()->cart->remove_coupon($data['coupon']);
WC()->cart->calculate_totals();
WC()->cart->set_session();
WC()->cart->persistent_cart_update();
WC()->session->save_data();
return new JsonResponse([
'success' => true,
'cart' => $this->wpsyCommerceService->getCart(),
]);
}
#[Route('/update-shipping-province', name: 'wpsy_commerce_update_shipping_province', methods: ['POST'])]
public function updateShippingProvince(Request $request)
{
$data = \json_decode($request->getContent(), true);
if (!isset($data['province'])) {
throw new BadRequestHttpException('Missing province');
}
WC()->customer->set_billing_state($data['province']);
WC()->customer->set_shipping_state($data['province']);
WC()->customer->save();
return new JsonResponse([
'success' => true,
]);
}
#[Route('/update-shipping-method', name: 'wpsy_commerce_update_shipping_method', methods: ['POST'])]
public function updateShippingMethod(Request $request)
{
$data = \json_decode($request->getContent(), true);
if (!isset($data['shipping_method'])) {
throw new BadRequestHttpException('Missing shipping_method');
}
$session = $this->sessionManager->restoreOrCreateSession();
$session->shippingMethod = $data['shipping_method'];
$this->sessionManager->saveSession($session);
WC()->session->set('chosen_shipping_methods', [$data['shipping_method']]);
WC()->cart->calculate_totals();
WC()->cart->set_session();
WC()->cart->persistent_cart_update();
WC()->session->save_data();
return new JsonResponse([
'success' => true,
'cart' => $this->wpsyCommerceService->getCart(),
]);
}
#[Route('/validate-field', name: 'wpsy_commerce_validate_field', methods: ['POST'])]
public function validateField(Request $request, FormFactoryInterface $formFactory, ValidatorInterface $validator): JsonResponse
{
$form = $formFactory->create(CheckoutAddressType::class);
$fieldData = $request->request->all();
$fieldName = array_keys($fieldData)[0];
$fieldValue = $fieldData[$fieldName];
// Obtener los constraints del campo desde el formulario
$formField = $form->get($fieldName);
$constraints = $formField->getConfig()->getOption('constraints');
// Validar solo el campo actual
$violations = $validator->validate($fieldValue, $constraints);
if (count($violations) > 0) {
$errors = [];
foreach ($violations as $violation) {
$errors[$fieldName][] = $violation->getMessage();
}
return new JsonResponse(['success' => false, 'errors' => $errors]);
}
return new JsonResponse(['success' => true]);
}
}