diff --git a/Resources/config/services.yml b/Resources/config/services.yml index 028d92e5d..2e1a0376f 100644 --- a/Resources/config/services.yml +++ b/Resources/config/services.yml @@ -191,8 +191,17 @@ services: class: %ezsystems.platformui.controller.exception.class% parent: twig.controller.exception - ezsystems.platformui.rest.content_user_gateway: - class: EzSystems\PlatformUIBundle\Rest\ContentUserGateway + ezsystems.platformui.rest.content_publish_user_gateway: + class: EzSystems\PlatformUIBundle\Rest\ContentPublishUserGateway + arguments: + - @ezpublish_rest.input.dispatcher + - @ezpublish_rest.output.visitor.dispatcher + - @ezpublish.api.repository + tags: + - {name: kernel.event_subscriber} + + ezsystems.platformui.rest.content_create_user_gateway: + class: EzSystems\PlatformUIBundle\Rest\ContentCreateUserGateway arguments: - @ezpublish_rest.input.dispatcher - @ezpublish_rest.output.visitor.dispatcher diff --git a/Rest/ContentUserGateway.php b/Rest/ContentCreateUserGateway.php similarity index 98% rename from Rest/ContentUserGateway.php rename to Rest/ContentCreateUserGateway.php index 49362e47d..963fc168e 100644 --- a/Rest/ContentUserGateway.php +++ b/Rest/ContentCreateUserGateway.php @@ -18,7 +18,7 @@ use Symfony\Component\HttpKernel\KernelEvents; use eZ\Publish\Core\FieldType\User\Value as UserFieldValue; -class ContentUserGateway implements EventSubscriberInterface +class ContentCreateUserGateway implements EventSubscriberInterface { /** @var \eZ\Publish\Core\REST\Common\Input\Dispatcher */ private $restInputDispatcher; diff --git a/Rest/ContentPublishUserGateway.php b/Rest/ContentPublishUserGateway.php new file mode 100644 index 000000000..0352769cc --- /dev/null +++ b/Rest/ContentPublishUserGateway.php @@ -0,0 +1,87 @@ +restInputDispatcher = $restInputDispatcher; + $this->repository = $repository; + $this->viewDispatcher = $viewDispatcher; + $this->settings = $settings + ['user-content-type-id' => 4]; + } + + public static function getSubscribedEvents() + { + return [KernelEvents::REQUEST => ['onKernelRequest', -1000]]; + } + + public function onKernelRequest(GetResponseEvent $event) + { + if (!$this->shouldRun($request = $event->getRequest())) { + return; + } + + $event->setResponse($this->viewDispatcher->dispatch($event->getRequest(), new NoContent())); + } + + private function shouldRun(Request $request) + { + if (!$request->attributes->get('is_rest_request')) { + return false; + } + + if ($request->attributes->get('_route') !== 'ezpublish_rest_publishVersion') { + return false; + } + + $method = $request->getMethod(); + $methodOverride = strtolower($request->headers->get('x-http-method-override')); + if (strtolower($method) !== 'publish' || ($method === 'post' && $methodOverride !== 'publish')) { + return false; + } + + return ($this->loadContent($request)->contentInfo->contentTypeId === $this->settings['user-content-type-id']); + } + + public function loadContent(Request $request) + { + static $content = null; + + if ($content === null) { + $routeParams = $request->attributes->get('_route_params'); + $content = $this->repository->getContentService()->loadContent( + $routeParams['contentId'], + null, + $routeParams['versionNumber'] + ); + } + + return $content; + } +}