<?php
namespace App\EventListener;
use App\Application\DTO\ControlPanel\Api\Academy\AcademyAttributes;
use App\Application\DTO\ControlPanel\Api\Academy\CartCourseAttributes;
use App\Application\DTO\ControlPanel\Api\DeliveryNote\DeliveryNoteDownloadsAttributes;
use App\Application\DTO\ControlPanel\Api\MediaDownload\MediaDownloadRequestAttributes;
use App\Application\DTO\ControlPanel\Api\Notification\NotificationAttributes;
use App\Application\DTO\ControlPanel\Api\Payment\AdyenPaymentMethodDeletionAttributes;
use App\Application\DTO\ControlPanel\Api\Payment\PaypalSaveBillingAgreementAttributes;
use App\Application\DTO\ControlPanel\Api\Payment\PaypalUrlBillingAgreementAttributes;
use App\Application\DTO\ControlPanel\Api\Rma\RmaAttributes;
use App\Application\DTO\ControlPanel\Api\Rma\RmaLineAttributes;
use App\Application\DTO\ControlPanel\Api\Rma\RmaLineCommentAttributes;
use App\Application\DTO\ControlPanel\Api\Rma\RmaPickupAddressAttributes;
use App\Application\DTO\ControlPanel\Api\Wishlist\RemoveProductAttributes;
use App\Application\DTO\ControlPanel\Api\Wishlist\WishlistProductsCartAttributes;
use App\Application\DTO\JsonApi\JsonApiDocument;
use App\Application\Service\Factory\JsonApiFactory;
use App\Application\Service\JsonApi\JsonApiResourceNormalizer;
use App\Exception\ControlPanel\JsonApiException;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\Serializer\Encoder\JsonEncoder;
use Symfony\Component\Serializer\SerializerInterface;
class ControlpanelAccessControlListener
{
public const CONTROLPANEL_URI = '/controlpanel/api/';
public const JSON_API_V2_MIGRATED_ENDPOINTS = [
'api_controlpanel_rma_lines_create_rma_line',
'api_controlpanel_rma_lines_update_rma_line',
'api_controlpanel_rma_create',
'api_controlpanel_rma_update',
'api_controlpanel_rma_addresssave_rma_pickup_address',
'api_controlpanel_rma_line_commentsadd_rma_line_comments',
'api_controlpanel_rma_line_commentsupdate',
'controlpanel_media_request',
'controlpanel_media_app_infrastructure_symfony_controlpanel_api_mediadownloads_requestdownload',
'api_controlpanel_wishlist_remove_products_from_list',
'api_controlpanel_wishlist_add_products_to_cart',
'api_controlpanel_delivery_note_by_id',
'api_controlpanel_order_delivery-notes',
'api_controlpanel_order_pods_by_order_and_delivery_note',
'api_controlpanel_notification_update',
'api_controlpanel_notification_mark_all_as_read',
'api_controlpanel_order_download-delivery-notes',
'api_controlpanel_service_payment_actions',
'api_controlpanel_academy_coursesget_academy_courses',
'front_api_cart_add_course_to_cart',
'front_api_cart_add_course_to_cart_without_name',
];
public const TYPE_TO_CLASS_MAP = [
RmaAttributes::TYPE => RmaAttributes::class,
RmaLineAttributes::TYPE => RmaLineAttributes::class,
RmaPickupAddressAttributes::TYPE => RmaPickupAddressAttributes::class,
RmaLineCommentAttributes::TYPE => RmaLineCommentAttributes::class,
MediaDownloadRequestAttributes::TYPE => MediaDownloadRequestAttributes::class,
NotificationAttributes::TYPE => NotificationAttributes::class,
RemoveProductAttributes::TYPE => RemoveProductAttributes::class,
WishlistProductsCartAttributes::TYPE => WishlistProductsCartAttributes::class,
AdyenPaymentMethodDeletionAttributes::TYPE => AdyenPaymentMethodDeletionAttributes::class,
PaypalSaveBillingAgreementAttributes::TYPE => PaypalSaveBillingAgreementAttributes::class,
PaypalUrlBillingAgreementAttributes::TYPE => PaypalUrlBillingAgreementAttributes::class,
DeliveryNoteDownloadsAttributes::TYPE => DeliveryNoteDownloadsAttributes::class,
AcademyAttributes::TYPE => AcademyAttributes::class,
CartCourseAttributes::TYPE => CartCourseAttributes::class,
];
private SerializerInterface $serializer;
public function __construct(SerializerInterface $serializer)
{
$this->serializer = $serializer;
}
/**
* @throws JsonApiException
*/
public function onKernelRequest(RequestEvent $requestEvent): void
{
$request = $requestEvent->getRequest();
$requestUri = $request->getRequestUri();
$requestMethod = $request->getMethod();
$requestName = $request->get('_route');
$content = $request->getContent();
if (0 !== strpos($requestUri, self::CONTROLPANEL_URI)) {
return;
}
if ((Request::METHOD_PATCH === $requestMethod || Request::METHOD_POST === $requestMethod) && !empty($content)) {
if (in_array($requestName, self::JSON_API_V2_MIGRATED_ENDPOINTS, true)) {
$jsonApiDocument = $this->serializer->deserialize($request->getContent(), JsonApiDocument::class, JsonEncoder::FORMAT, [JsonApiResourceNormalizer::TYPE_TO_CLASS_MAP => self::TYPE_TO_CLASS_MAP]);
} else {
$jsonApiDocument = JsonApiFactory::createFromJson($request->getContent());
}
$request->attributes->set('json_api_document', $jsonApiDocument);
}
}
}