<?php declare(strict_types = 1);
namespace App\YEDIBundle\Controller\Admin;
use App\YEDIBundle\Controller\Rest\AbstractRestController;
use Pimcore\Bundle\AdminBundle\Security\User\TokenStorageUserResolver;
use Pimcore\Controller\Controller;
use Pimcore\Http\Exception\ResponseException;
use Pimcore\Kernel;
use Pimcore\Model\AbstractModel;
use Pimcore\Model\DataObject\Concrete;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Routing\Annotation\Route;
use App\YEDIBundle\Services\API\ActionService;
use App\YEDIBundle\Services\FormatterService;
use App\YEDIBundle\Services\ResponseService;
use App\YEDIBundle\YEDIBundle;
use Pimcore\Version;
class APIController extends AbstractRestController
{
private ActionService $actionService;
private FormatterService $formatterService;
/**
* @param ActionService $actionService
* @param FormatterService $formatterService
* @param TokenStorageUserResolver $resolver
*/
public function __construct(ActionService $actionService, FormatterService $formatterService, RequestStack $requestStack)
{
$this->actionService = $actionService;
$this->formatterService = $formatterService;
parent::__construct($requestStack);
}
/**
* @Route("webservice/yedi/data-object")
*
* @param Request $request
* @return JsonResponse
* @throws ResponseException
*/
public function dataObjectAction(Request $request)
{
$this->checkPermission('objects');
return $this->entityAction($request, ActionService::DATA_OBJECT_ACTION);
}
/**
* @Route("/webservice/yedi/asset")
*
* @param Request $request
* @return JsonResponse
* @throws ResponseException
*/
public function assetAction( Request $request)
{
$this->checkPermission('assets');
return $this->entityAction($request, ActionService::ASSET_ACTION);
}
/**
* @param Request $request
* @param string $actionType
* @return JsonResponse
* @throws ResponseException
*/
private function entityAction(Request $request, string $actionType)
{
$content = json_decode($request->getContent(), true);
$body = $content['body'];
$detailed = $content['detailed'] ?? false;
if($body === null){
throw new ResponseException($this->container->get(ResponseService::class)->createErrorResponse(
'Missing body parameter.', 422
));
} else if (count(array_filter(array_keys($body), 'is_string')) > 0) {
throw new ResponseException($this->container->get(ResponseService::class)->createErrorResponse(
'Provide an array of entities.', 422
));
}
try {
$response = $this->actionService->process($body, $actionType);
} catch (\Throwable $e) {
return new JsonResponse([
'data' => 'Action could not be processed correctly.',
'errors' => [
[
'message' => $e->getMessage(),
'stack' => $e->getTraceAsString()
],
]
]);
}
return new JsonResponse($this->formatResponse($response, $detailed));
}
/**
* @Route("/webservice/yedi/version")
*
* @param Kernel $kernel
* @return JsonResponse
*/
public function versionAction(Kernel $kernel)
{
$this->checkPermission('objects');
/** @var YEDIBundle $bundle */
$bundle = $kernel->getBundle('YEDIBundle');
$yediBundle = [
'version' => $bundle->getVersion()
];
$pimcore = [
'version' => Version::getVersion(),
'revision' => Version::getRevision(),
'constants' => array_filter((array)get_defined_constants(), function($key) {
return strpos($key, 'PIMCORE_') === 0;
}, ARRAY_FILTER_USE_KEY),
];
return new JsonResponse([
'success' => true,
'yediBundle' => $yediBundle,
'pimcore' => $pimcore
]);
}
/**
* @param array $response
* @param bool $detailed
* @return array
*/
private function formatResponse(array $response, bool $detailed = false): array
{
['data' => $data, 'errors' => $errors] = $response;
foreach ($data as &$queryResults) {
/** @var Concrete $result */
foreach ($queryResults as &$result) {
if ($detailed && $result instanceof AbstractModel) {
$result = $this->formatterService->format($result, true);
} else {
$result = $result->getId();
}
}
}
return ['data' => $data, 'errors' => $errors];
}
}