<?php
namespace App\Controller\Api;
use App\Entity\Attribut;
use App\Entity\AttributValue;
use App\Entity\Category;
use App\Entity\Creation;
use App\Entity\FeatureFamily;
use App\Entity\Folder;
use App\Entity\Matrix;
use App\Entity\Model;
use App\Entity\ModelCategory;
use App\Entity\Product;
use App\Entity\ProductFeatureValue;
use App\Entity\ProductMenuMaker;
use App\Entity\ProductPrice;
use App\Entity\ProductPriceMockup;
use App\Service\ProductService;
use App\Service\Rsa;
use App\Service\SerializeService;
use App\Service\Tools;
use App\Service\TranslationService;
use App\Repository\MatrixRepository;
use App\Repository\ModelCategoryRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\EntityManagerInterface;
use Exception;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Contracts\Translation\TranslatorInterface;
/**
* Class AppController
* @package App\Controller\Api
* @Route(path="/api/product", name="api_product")
*/
class ProductController extends AbstractController
{
private EntityManagerInterface $em;
private SerializeService $serializeService;
private TranslationService $translationService;
private ProductService $productService;
private Rsa $rsa;
private TranslatorInterface $translator;
public function __construct(
EntityManagerInterface $em,
SerializeService $serializeService,
TranslationService $translationService,
ProductService $productService,
Rsa $rsa,
TranslatorInterface $translator
) {
$this->em = $em;
$this->serializeService = $serializeService;
$this->translationService = $translationService;
$this->productService = $productService;
$this->rsa = $rsa;
$this->translator = $translator;
}
/**
* @param Product $product
* @param Request $request
* @return JsonResponse
* @throws Exception
* @Route("/{product}", name="", requirements={"product"="\d+"})
*/
public function find(Product $product, Request $request): JsonResponse
{
if (!$this->rsa->isValidToken($request->request->get('apiKey'))) {
return new JsonResponse([
'success' => false,
'message' => $this->translator->trans('global.invalidToken'),
]);
}
if ($product->isCommandable()) {
return new JsonResponse([
'success' => true,
'product' => $this->serializeService->serializeProduct($product),
]);
}
return new JsonResponse([
'success' => false,
]);
}
/**
* @param Request $request
* @return JsonResponse
* @throws Exception
* @Route("/find-by-const-name", name="_findbyconstname")
*/
public function findByConstName(Request $request): JsonResponse
{
if (!$this->rsa->isValidToken($request->request->get('apiKey'))) {
return new JsonResponse([
'success' => false,
'message' => $this->translator->trans('global.invalidToken'),
]);
}
$data = Tools::getRequestData($request);
/** @var Product $product */
$product = $this->em->getRepository(Product::class)->findBy(array('constName' => $data['productConstName']));
if (!is_null($product)) {
if ($product[0]->isCommandable()) {
return new JsonResponse([
'success' => true,
'product' => $this->serializeService->serializeProduct($product[0]),
]);
}
}
return new JsonResponse([
'success' => false,
]);
}
/**
* @param Request $request
* @return JsonResponse
* @Route("/category", name="_category")
* @throws Exception
*/
public function findProductCategories(Request $request): JsonResponse
{
if (!$this->rsa->isValidToken($request->request->get('apiKey'))) {
return new JsonResponse([
'success' => false,
'message' => $this->translator->trans('global.invalidToken'),
]);
}
/** @var Category[] $productCategories */
$productCategories = $this->em->getRepository(Category::class)->findBy([], ['position' => 'ASC']);
$data = [];
foreach ($productCategories as $productCategory) {
if ($productCategory->isActive()) {
$products = [];
/** @var Product $product */
foreach ($productCategory->getProducts() as $product) {
if ($product->isCommandable()) {
$products[] = $this->serializeService->serializeProduct($product);
}
}
if (count($products) > 0) {
$data[] = [
'id' => $productCategory->getId(),
'name' => $this->translationService->translate($productCategory->getCategoryTranslations())->getName(),
'position' => $productCategory->getId(),
'active' => $productCategory->getId(),
'products' => $products,
];
}
}
}
return new JsonResponse([
'success' => true,
'productCategories' => $data,
]);
}
/**
* @param Product $product
* @param Request $request
* @return JsonResponse
* @Route("/{product}/model-category", name="_model_category", requirements={"product"="\d+"})
*/
public function findModelCategories(Product $product, Request $request): JsonResponse
{
if ($request->headers->get('Authorization')) {
$apiKey = substr($request->headers->get('Authorization'), 6);
} else {
$apiKey = $request->request->get('apiKey');
}
if (!$this->rsa->isValidToken($apiKey)) {
return new JsonResponse([
'success' => false,
'message' => $this->translator->trans('global.invalidToken'),
]);
}
$data = Tools::getRequestData($request);
$productMenuMaker = null;
$matrixes = [];
if (array_key_exists('currentFeatureValueIds', $data)) {
$productFeatureValues = new ArrayCollection();
foreach ($data['currentFeatureValueIds'] as $currentFeatureValueId) {
$productFeatureValues->add($this->em->getRepository(ProductFeatureValue::class)->find($currentFeatureValueId));
}
if ($productFeatureValues->count() > 0) {
/** @var ProductMenuMaker $productMenuMaker */
$productMenuMaker = $this->em->getRepository(ProductMenuMaker::class)->findByProductFeatureValues($productFeatureValues);
}
}
$format = $request->query->get('format', '21x30-1v');
$modelCategories = [];
/** @var ModelCategory $modelCategory */
foreach ($product->getModelCategories() as $modelCategory) {
$models = [];
/** @var Model $model */
foreach ($modelCategory->getModels() as $model) {
if ($model->isActive()) {
$models[] = $this->serializeService->serializeModel($model, $format);
}
}
if (!is_null($productMenuMaker)) {
/** @var Matrix $matrixActive */
foreach ($productMenuMaker->getMatrixActives() as $matrixActive) {
if (!is_null($matrixActive->getMatrixSet()) && $matrixActive->getMatrixSet()->getModelCategory()->getId() === $modelCategory->getId()) {
$matrixes[] = $this->serializeService->serializeMatrix($matrixActive);
}
}
}
$modelCategories[] = [
'id' => $modelCategory->getId(),
'name' => $this->translationService->translate($modelCategory->getModelCategoryTranslations())->getName(),
'reference' => $modelCategory->getReference(),
'position' => $modelCategory->getPosition(),
'models' => $models,
'matrixes' => $matrixes,
];
}
usort($modelCategories, function ($a, $b) {
return $a['position'] <=> $b['position'];
});
return new JsonResponse([
'success' => true,
'modelCategories' => $modelCategories,
]);
}
/**
* @param Product $product
* @param Request $request
* @return JsonResponse
* @Route("/{product}/model-category-without-model", name="_model_category_whithout_model", requirements={"product"="\d+"})
*/
public function findModelCategoriesWithoutModels(Product $product, Request $request): JsonResponse
{
if (!$this->rsa->isValidToken($request->request->get('apiKey'))) {
return new JsonResponse([
'success' => false,
'message' => $this->translator->trans('global.invalidToken'),
]);
}
$modelCategories = [];
/** @var ModelCategory $modelCategory */
foreach ($product->getModelCategories() as $modelCategory) {
$modelCategories[] = [
'id' => $modelCategory->getId(),
'name' => $this->translationService->translate($modelCategory->getModelCategoryTranslations())->getName(),
'reference' => $modelCategory->getReference(),
'position' => $modelCategory->getPosition(),
];
}
return new JsonResponse([
'success' => true,
'modelCategories' => $modelCategories,
]);
}
/**
* @param Product $product
* @param Request $request
* @return JsonResponse
* @Route("/{product}/models", name="_models", requirements={"product"="\d+"})
*/
public function findModels(Product $product, Request $request): JsonResponse
{
if (!$this->rsa->isValidToken($request->request->get('apiKey'))) {
return new JsonResponse([
'success' => false,
'message' => $this->translator->trans('global.invalidToken'),
]);
}
$data = Tools::getRequestData($request);
$format = $request->query->get('format', '21x30-1v');
$productMenuMaker = null;
$models = [];
if (array_key_exists('currentFeatureValueIds', $data)) {
$productFeatureValues = new ArrayCollection();
foreach ($data['currentFeatureValueIds'] as $currentFeatureValueId) {
$productFeatureValues->add($this->em->getRepository(ProductFeatureValue::class)->find($currentFeatureValueId));
}
if ($productFeatureValues->count() > 0) {
/** @var ProductMenuMaker $productMenuMaker */
$productMenuMaker = $this->em->getRepository(ProductMenuMaker::class)->findByProductFeatureValues($productFeatureValues);
}
}
/** @var ModelCategory $modelCategory */
foreach ($product->getModelCategories() as $modelCategory) {
/** @var Model $model */
foreach ($modelCategory->getModels() as $model) {
if ($model->isActive()) {
$models[] = $this->serializeService->serializeModel($model, $format);
}
}
if (!is_null($productMenuMaker)) {
/** @var Matrix $matrixActive */
foreach ($productMenuMaker->getMatrixActives() as $matrixActive) {
if (!is_null($matrixActive->getMatrixSet()) && $matrixActive->getMatrixSet()->getModelCategory()->getId() === $modelCategory->getId()) {
$matrix = $this->serializeService->serializeMatrix($matrixActive);
$matrix['category'] = $modelCategory->getId(); // Change to the model category id instead of the matrix one
$models[] = $matrix;
}
}
}
}
usort($models, function ($a, $b) {
return $a['position'] <=> $b['position'];
});
return new JsonResponse([
'success' => true,
'models' => $models,
]);
}
/**
* @param Product $product
* @param Request $request
* @param ModelCategoryRepository $modelCategoryRepository
* @return JsonResponse
* @Route("/{product}/has-models", name="_has_models", requirements={"product"="\d+"})
*/
public function hasModels(Product $product, Request $request, ModelCategoryRepository $modelCategoryRepository): JsonResponse
{
if (!$this->rsa->isValidToken($request->request->get('apiKey'))) {
return new JsonResponse([
'success' => false,
'message' => $this->translator->trans('global.invalidToken'),
]);
}
$hasModels = $modelCategoryRepository->hasAtLeastOneModelInCategories($product);
return new JsonResponse([
'success' => true,
'hasModels' => $hasModels,
]);
}
/**
* @param Product $product
* @param Request $request
* @return JsonResponse
* @Route("/{product}/feature", name="_feature", requirements={"product"="\d+"})
*/
public function findFeatures(Product $product, Request $request): JsonResponse
{
if (!$this->rsa->isValidToken($request->request->get('apiKey'))) {
return new JsonResponse([
'success' => false,
'message' => $this->translator->trans('global.invalidToken'),
]);
}
if (!$product->isCommandable()) {
return new JsonResponse([
'success' => false,
'url' => $this->generateUrl('app_index'),
]);
}
$features = [];
foreach ($product->getProductFeatures() as $productFeature) {
$features[] = [
'id' => $productFeature->getFeature()->getId(),
'name' => $this->translationService->translate($productFeature->getFeature()->getFeatureTranslations())->getName(),
'isCustomizable' => ($productFeature->getFeature()->getFeatureFamily()->getConstName() === FeatureFamily::CUSTOMIZABLE),
'isPrintable' => ($productFeature->getFeature()->getFeatureFamily()->getConstName() === FeatureFamily::PRINTABLE),
'isClassic' => ($productFeature->getFeature()->getFeatureFamily()->getConstName() === FeatureFamily::CLASSIC),
'constName' => $productFeature->getFeature()->getConstName(),
'printComConstName' => $productFeature->getFeature()->getPrintComConstName(),
];
}
return new JsonResponse([
'success' => true,
'features' => $features,
]);
}
/**
* @param Product $product
* @param Request $request
* @return JsonResponse
* @Route("/{product}/feature-value", name="_feature_value", requirements={"product"="\d+"})
* @throws Exception
*/
public function findFeatureValues(Product $product, Request $request): JsonResponse
{
if (!$this->rsa->isValidToken($request->request->get('apiKey'))) {
return new JsonResponse([
'success' => false,
'message' => $this->translator->trans('global.invalidToken'),
]);
}
if (!$product->isCommandable()) {
return new JsonResponse([
'success' => false,
'url' => $this->generateUrl('app_index'),
]);
}
//On envoie les features values commandables (prix + menumaker)
$featureValues = $this->productService->getProductFeatureValuesByProduct($product);
uasort($featureValues, function ($a, $b) {
return $a['position'] - $b['position'];
});
return new JsonResponse([
'success' => true,
'featureValues' => $featureValues,
]);
}
/**
* @param Product $product
* @param Request $request
* @return JsonResponse
* @Route("/{product}/matrix-category", name="_matrix_category", requirements={"product"="\d+"})
*/
public function findMatrixCategories(Product $product, Request $request): JsonResponse
{
if (!$this->rsa->isValidToken($request->request->get('apiKey'))) {
return new JsonResponse([
'success' => false,
'message' => $this->translator->trans('global.invalidToken'),
]);
}
$data = Tools::getRequestData($request);
$productFeatureValues = new ArrayCollection();
foreach ($data['currentFeatureValueIds'] as $currentFeatureValueId) {
$productFeatureValues->add($this->em->getRepository(ProductFeatureValue::class)->find($currentFeatureValueId));
}
$matrixCategories = [];
if ($productFeatureValues->count() > 0) {
/** @var ProductMenuMaker $productMenuMaker */
$productMenuMaker = $this->em->getRepository(ProductMenuMaker::class)->findByProductFeatureValues($productFeatureValues);
if (!is_null($productMenuMaker)) {
/** @var Matrix $matrixActive */
foreach ($productMenuMaker->getMatrixActives() as $matrixActive) {
if (is_null($matrixActive->getMatrixSet())) {
if (!isset($matrixCategories[$matrixActive->getMatrixCategory()->getId()])) {
$matrixCategories[$matrixActive->getMatrixCategory()->getId()] = [
'id' => $matrixActive->getMatrixCategory()->getId(),
'reference' => $matrixActive->getMatrixCategory()->getReference(),
'name' => $this->translationService->translate($matrixActive->getMatrixCategory()->getMatrixCategoryTranslations())->getName(),
'matrixes' => [],
];
}
$matrixCategories[$matrixActive->getMatrixCategory()->getId()]['matrixes'][] = $this->serializeService->serializeMatrix($matrixActive, false);
}
}
$matrixCategories = array_values($matrixCategories);
}
}
return new JsonResponse([
'success' => true,
'matrixCategories' => $matrixCategories,
]);
}
/**
* @param Request $request
* @return JsonResponse
* @Route("/matrix-category-without-matrix", name="_matrix_category_without_matrix")
*/
public function findMatrixCategoriesWithoutMatrices(Request $request): JsonResponse
{
if (!$this->rsa->isValidToken($request->request->get('apiKey'))) {
return new JsonResponse([
'success' => false,
'message' => $this->translator->trans('global.invalidToken'),
]);
}
$data = Tools::getRequestData($request);
$productFeatureValues = new ArrayCollection();
foreach ($data['currentFeatureValueIds'] as $currentFeatureValueId) {
$productFeatureValues->add($this->em->getRepository(ProductFeatureValue::class)->find($currentFeatureValueId));
}
$matrixCategories = [];
if ($productFeatureValues->count() > 0) {
/** @var ProductMenuMaker $productMenuMaker */
$productMenuMaker = $this->em->getRepository(ProductMenuMaker::class)->findByProductFeatureValues($productFeatureValues);
if (!is_null($productMenuMaker)) {
/** @var Matrix $matrixActive */
foreach ($productMenuMaker->getMatrixActives() as $matrixActive) {
if (is_null($matrixActive->getMatrixSet())) {
$categoryId = $matrixActive->getMatrixCategory()->getId();
if (!isset($matrixCategories[$categoryId])) {
$matrixCategories[$categoryId] = [
'id' => $categoryId,
'reference' => $matrixActive->getMatrixCategory()->getReference(),
'name' => $this->translationService->translate($matrixActive->getMatrixCategory()->getMatrixCategoryTranslations())->getName(),
];
}
}
}
$matrixCategories = array_values($matrixCategories);
}
}
return new JsonResponse([
'success' => true,
'matrixCategories' => $matrixCategories,
]);
}
/**
* @param Request $request
* @return JsonResponse
* @Route("/matrices", name="_matrices")
*/
public function findMatrices(Request $request): JsonResponse
{
if (!$this->rsa->isValidToken($request->request->get('apiKey'))) {
return new JsonResponse([
'success' => false,
'message' => $this->translator->trans('global.invalidToken'),
]);
}
$data = Tools::getRequestData($request);
$productFeatureValues = new ArrayCollection();
foreach ($data['currentFeatureValueIds'] as $currentFeatureValueId) {
$productFeatureValues->add($this->em->getRepository(ProductFeatureValue::class)->find($currentFeatureValueId));
}
$matrices = [];
if ($productFeatureValues->count() > 0) {
/** @var ProductMenuMaker $productMenuMaker */
$productMenuMaker = $this->em->getRepository(ProductMenuMaker::class)->findByProductFeatureValues($productFeatureValues);
if (!is_null($productMenuMaker)) {
/** @var Matrix $matrixActive */
foreach ($productMenuMaker->getMatrixActives() as $matrixActive) {
if (is_null($matrixActive->getMatrixSet())) {
$matrices[] = $this->serializeService->serializeMatrix($matrixActive, false);
}
}
$matrices = array_values($matrices);
}
}
usort($matrices, function ($a, $b) {
return $a['position'] <=> $b['position'];
});
return new JsonResponse([
'success' => true,
'matrices' => $matrices,
]);
}
/**
* @param Request $request
* @param MatrixRepository $matrixRepository
* @return JsonResponse
* @Route("/has-matrices", name="_has_matrices")
*/
public function hasMatrices(Request $request, MatrixRepository $matrixRepository): JsonResponse
{
if (!$this->rsa->isValidToken($request->request->get('apiKey'))) {
return new JsonResponse([
'success' => false,
'message' => $this->translator->trans('global.invalidToken'),
]);
}
$data = Tools::getRequestData($request);
$featureValueIds = $data['currentFeatureValueIds'] ?? [];
$hasMatrices = $matrixRepository->hasAtLeastOneMatrixWithoutSet($featureValueIds);
return new JsonResponse([
'success' => true,
'hasMatrices' => $hasMatrices,
]);
}
/**
* @param Product $product
* @param Request $request
* @return JsonResponse
* @Route("/{product}/attribut", name="_attribut", requirements={"product"="\d+"})
*/
public function findAttributs(Product $product, Request $request): JsonResponse
{
if (!$this->rsa->isValidToken($request->request->get('apiKey'))) {
return new JsonResponse([
'success' => false,
'message' => $this->translator->trans('global.invalidToken'),
]);
}
if (!$product->isCommandable()) {
return new JsonResponse([
'success' => false,
'url' => $this->generateUrl('app_index'),
]);
}
$data = Tools::getRequestData($request);
$attributs = [];
/** @var Attribut $attribut */
foreach ($product->getAttributValids() as $attribut) {
$attributValues = [];
/** @var AttributValue $attributValue */
foreach ($attribut->getAttributValueActives() as $attributValue) {
$attributValuePriceHt = $attributValue->getPriceHt();
if (isset($data['featureValueFormat'])) {
if ($attributValue->getAttribut()->getConstName() === Attribut::MAKING) {
/** @var ProductPriceMockup $productPriceMockup */
$productPriceMockup = $this->em->getRepository(ProductPriceMockup::class)->findOneBy([
'product' => $product,
'productFeatureValue' => $data['featureValueFormat'],
]);
$attributValuePriceHt = $productPriceMockup->getPriceHt();
}
}
$attributValueSerialized = $this->serializeService->serializeAttributValue($attributValue);
$attributValueSerialized['priceHt'] = $attributValuePriceHt;
$attributValues[] = $attributValueSerialized;
}
$attributSerialized = $this->serializeService->serializeAttribut($attribut);
$attributSerialized['attributValues'] = $attributValues;
$attributs[] = $attributSerialized;
}
return new JsonResponse([
'success' => true,
'attributs' => $attributs,
]);
}
/**
* @param Product $product
* @param Request $request
* @return JsonResponse
* @Route("/{product}/price", name="_price", requirements={"product"="\d+"})
* @throws Exception
*/
public function findPrices(Product $product, Request $request): JsonResponse
{
if (!$this->rsa->isValidToken($request->request->get('apiKey'))) {
return new JsonResponse([
'success' => false,
'message' => $this->translator->trans('global.invalidToken'),
]);
}
if (!$product->isCommandable()) {
return new JsonResponse([
'success' => false,
'url' => $this->generateUrl('app_index'),
]);
}
$data = Tools::getRequestData($request);
$quantities = [];
$isMockup = (array_key_exists('isMockup', $data) ? $data['isMockup'] : false);
if ($isMockup) {
if (array_key_exists('creation', $data)) {
/** @var Creation $creation */
$creation = $this->em->getRepository(Creation::class)->find($data['creation']);
if (!is_null($creation->getProductFeatureValueFormat())) {
/** @var ProductPriceMockup $productPriceMockup */
$productPriceMockup = $this->em->getRepository(ProductPriceMockup::class)->findOneBy([
'product' => $product,
'productFeatureValue' => $creation->getProductFeatureValueFormat(),
]);
if (!is_null($productPriceMockup)) {
$quantities[] = $productPriceMockup->getPriceHt();
} else {
return new JsonResponse([
'success' => false,
]);
}
} else {
return new JsonResponse([
'success' => false,
]);
}
} else {
$productFeatureValueFormat = (array_key_exists('productFeatureValueFormat', $data) ? $data['productFeatureValueFormat'] : null);
if (!is_null($productFeatureValueFormat)) {
/** @var ProductFeatureValue $productFeatureValueFormat */
$productFeatureValueFormat = $this->em->getRepository(ProductFeatureValue::class)->find($productFeatureValueFormat);
/** @var ProductPriceMockup $productPriceMockup */
$productPriceMockup = $this->em->getRepository(ProductPriceMockup::class)->findOneBy([
'product' => $product,
'productFeatureValue' => $productFeatureValueFormat,
]);
if (!is_null($productPriceMockup)) {
$quantities[] = $productPriceMockup->getPriceHt();
} else {
return new JsonResponse([
'success' => false,
]);
}
} else {
return new JsonResponse([
'success' => false,
]);
}
}
} else {
$productFeatureValues = (array_key_exists('productFeatureValues', $data) ? $data['productFeatureValues'] : []);
$attributValues = (array_key_exists('attributValues', $data) ? $data['attributValues'] : []);
$creation = null;
$isFormatVariable = false;
$width = 0;
$height = 0;
if (array_key_exists('creation', $data)) {
/** @var Creation $creation */
$creation = $this->em->getRepository(Creation::class)->find($data['creation']);
$isFormatVariable = $creation->hasFormatVariable();
$width = $creation->getWidth();
$height = $creation->getHeight();
}
// On récupère les productPrice en fonctions des featuresValues
$productPrices = $this->productService->getProductPricesByFeatureValues($data['allProductFeatureValues'], $productFeatureValues, $product);
foreach ($productPrices as $productPrice) {
// Calcul du prix des attributs
$attributValuePriceHtTotal = 0;
if ($attributValues) {
foreach ($attributValues as $value) {
/** @var AttributValue $attributValue */
$attributValue = $this->em->getRepository(AttributValue::class)->find($value);
if ($attributValue) {
$attributValuePriceHt = $attributValue->getPriceHt();
if (!is_null($creation)) {
if ($attributValue->getAttribut()->getConstName() === Attribut::MAKING) {
/** @var ProductPriceMockup $productPriceMockup */
$productPriceMockup = $this->em->getRepository(ProductPriceMockup::class)->findOneBy([
'product' => $product,
'productFeatureValue' => $creation->getProductFeatureValueFormat(),
]);
$attributValuePriceHt = $productPriceMockup->getPriceHt();
}
}
if ($attributValue->getAttribut()->isMultiplyByQuantity()) {
$attributValuePriceHtTotal += $attributValuePriceHt * $productPrice['step'];
} else {
$attributValuePriceHtTotal += $attributValuePriceHt;
}
}
}
}
if ($isFormatVariable) {
$squareMeter = round(($width * $height / 10000), 2);
$quantities[] = [
'quantity' => $productPrice['step'],
'priceHt' => (($productPrice['priceHt'] * $squareMeter) * $productPrice['step']) + $attributValuePriceHtTotal,
];
} else {
$quantities[] = [
'quantity' => $productPrice['step'],
'priceHt' => $productPrice['priceHt'] + $attributValuePriceHtTotal,
];
}
}
}
return new JsonResponse([
'success' => true,
'prices' => $quantities,
]);
}
/**
* @param Product $product
* @return JsonResponse
* @Route("/{product}/folder", name="_folder", requirements={"product"="\d+"})
*/
public function findFolders(Product $product): JsonResponse
{
$folders = [];
/** @var Folder $folder */
foreach ($product->getFolders() as $folder) {
$folders[] = [
'id' => $folder->getId(),
'name' => $folder->getName(),
];
}
return new JsonResponse([
'success' => true,
'folders' => $folders,
]);
}
/**
* @param Product $product
* @param Request $request
* @return JsonResponse
* @throws Exception
* @Route("/{product}/associated-products", name="_associated_products", requirements={"product"="\d+"})
*/
public function findAssociatedProducts(Product $product, Request $request): JsonResponse
{
if (!$this->rsa->isValidToken($request->request->get('apiKey'))) {
return new JsonResponse([
'success' => false,
'message' => $this->translator->trans('global.invalidToken'),
]);
}
$associatedProducts = $product->getAssociatedProducts();
$serializedProducts = [];
foreach ($associatedProducts as $associatedProduct) {
$serializedProducts[] = $this->serializeService->serializeProduct($associatedProduct->getAssociatedProduct());
}
return new JsonResponse([
'success' => true,
'products' => $serializedProducts,
]);
}
}