/src/Sulu/Bundle/SnippetBundle/Controller/SnippetAreaController.php

https://github.com/sulu-io/sulu · PHP · 243 lines · 153 code · 37 blank · 53 comment · 3 complexity · aa2f8547a91f07010dea2711be5bb358 MD5 · raw file

  1. <?php
  2. /*
  3. * This file is part of Sulu.
  4. *
  5. * (c) Sulu GmbH
  6. *
  7. * This source file is subject to the MIT license that is bundled
  8. * with this source code in the file LICENSE.
  9. */
  10. namespace Sulu\Bundle\SnippetBundle\Controller;
  11. use HandcraftedInTheAlps\RestRoutingBundle\Controller\Annotations\RouteResource;
  12. use HandcraftedInTheAlps\RestRoutingBundle\Routing\ClassResourceInterface;
  13. use Sulu\Bundle\SnippetBundle\Admin\SnippetAdmin;
  14. use Sulu\Bundle\SnippetBundle\Snippet\DefaultSnippetManagerInterface;
  15. use Sulu\Bundle\SnippetBundle\Snippet\WrongSnippetTypeException;
  16. use Sulu\Component\DocumentManager\DocumentManagerInterface;
  17. use Sulu\Component\Rest\RequestParametersTrait;
  18. use Sulu\Component\Security\Authorization\PermissionTypes;
  19. use Sulu\Component\Security\Authorization\SecurityCheckerInterface;
  20. use Sulu\Component\Security\Authorization\SecurityCondition;
  21. use Symfony\Component\HttpFoundation\JsonResponse;
  22. use Symfony\Component\HttpFoundation\Request;
  23. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  24. /**
  25. * Handles snippet types and defaults.
  26. *
  27. * @RouteResource("snippet-area")
  28. */
  29. class SnippetAreaController implements ClassResourceInterface
  30. {
  31. use RequestParametersTrait;
  32. /**
  33. * @var DefaultSnippetManagerInterface
  34. */
  35. protected $defaultSnippetManager;
  36. /**
  37. * @var DocumentManagerInterface
  38. */
  39. protected $documentManager;
  40. /**
  41. * @var SecurityCheckerInterface
  42. */
  43. protected $securityChecker;
  44. /**
  45. * @var TokenStorageInterface
  46. */
  47. protected $tokenStorage;
  48. /**
  49. * @var array
  50. */
  51. protected $sulu_snippet_areas;
  52. public function __construct(
  53. DefaultSnippetManagerInterface $defaultSnippetManager,
  54. DocumentManagerInterface $documentManager,
  55. SecurityCheckerInterface $securityChecker,
  56. TokenStorageInterface $tokenStorage,
  57. array $sulu_snippet_area
  58. ) {
  59. $this->defaultSnippetManager = $defaultSnippetManager;
  60. $this->documentManager = $documentManager;
  61. $this->securityChecker = $securityChecker;
  62. $this->tokenStorage = $tokenStorage;
  63. $this->sulu_snippet_areas = $sulu_snippet_area;
  64. }
  65. protected function getUser()
  66. {
  67. $user = null;
  68. $token = $this->tokenStorage->getToken();
  69. if ($token) {
  70. $user = $token->getUser();
  71. }
  72. return $user;
  73. }
  74. /**
  75. * Get snippet areas.
  76. *
  77. * @return JsonResponse
  78. */
  79. public function cgetAction(Request $request)
  80. {
  81. $webspaceKey = $this->getRequestParameter($request, 'webspace', true);
  82. $this->securityChecker->checkPermission(
  83. new SecurityCondition(SnippetAdmin::getDefaultSnippetsSecurityContext($webspaceKey)),
  84. PermissionTypes::VIEW
  85. );
  86. $areas = $this->getLocalizedAreas();
  87. $dataList = [];
  88. foreach ($areas as $key => $area) {
  89. $areaData = [
  90. 'key' => $key,
  91. 'template' => $area['template'],
  92. 'title' => $area['title'],
  93. 'defaultUuid' => null,
  94. 'defaultTitle' => null,
  95. 'valid' => true,
  96. ];
  97. try {
  98. $snippet = $this->defaultSnippetManager->load($webspaceKey, $key, $this->getUser()->getLocale());
  99. $areaData['defaultUuid'] = $snippet ? $snippet->getUuid() : null;
  100. $areaData['defaultTitle'] = $snippet ? $snippet->getTitle() : null;
  101. } catch (WrongSnippetTypeException $exception) {
  102. // ignore wrong snippet-type
  103. $areaData['valid'] = false;
  104. $uuid = $this->defaultSnippetManager->loadIdentifier($webspaceKey, $key);
  105. if ($uuid) {
  106. $snippet = $this->documentManager->find($uuid, $this->getUser()->getLocale());
  107. $areaData['defaultUuid'] = $snippet ? $snippet->getUuid() : null;
  108. $areaData['defaultTitle'] = $snippet ? $snippet->getTitle() : null;
  109. }
  110. }
  111. $dataList[$key] = $areaData;
  112. }
  113. \ksort($dataList);
  114. $data = [
  115. '_embedded' => [
  116. 'areas' => \array_values($dataList),
  117. ],
  118. 'total' => \count($dataList),
  119. ];
  120. return new JsonResponse($data);
  121. }
  122. /**
  123. * Put default action.
  124. *
  125. * @param string $key
  126. *
  127. * @return JsonResponse
  128. */
  129. public function putAction(Request $request, $key)
  130. {
  131. $webspaceKey = $this->getRequestParameter($request, 'webspace', true);
  132. $this->securityChecker->checkPermission(
  133. new SecurityCondition(SnippetAdmin::getDefaultSnippetsSecurityContext($webspaceKey)),
  134. PermissionTypes::EDIT
  135. );
  136. $default = $request->get('defaultUuid');
  137. $areas = $this->getLocalizedAreas();
  138. $area = $areas[$key];
  139. $defaultSnippet = $this->defaultSnippetManager->save(
  140. $webspaceKey,
  141. $key,
  142. $default,
  143. $this->getUser()->getLocale()
  144. );
  145. return new JsonResponse(
  146. [
  147. 'key' => $key,
  148. 'template' => $area['template'],
  149. 'title' => $area['title'],
  150. 'defaultUuid' => $defaultSnippet ? $defaultSnippet->getUuid() : null,
  151. 'defaultTitle' => $defaultSnippet ? $defaultSnippet->getTitle() : null,
  152. 'valid' => true,
  153. ]
  154. );
  155. }
  156. /**
  157. * Delete default action.
  158. *
  159. * @param string $key
  160. *
  161. * @return JsonResponse
  162. */
  163. public function deleteAction(Request $request, $key)
  164. {
  165. $webspaceKey = $this->getRequestParameter($request, 'webspace', true);
  166. $this->securityChecker->checkPermission(
  167. new SecurityCondition(SnippetAdmin::getDefaultSnippetsSecurityContext($webspaceKey)),
  168. PermissionTypes::EDIT
  169. );
  170. $areas = $this->getLocalizedAreas();
  171. $area = $areas[$key];
  172. $this->defaultSnippetManager->remove($webspaceKey, $key);
  173. return new JsonResponse(
  174. [
  175. 'key' => $key,
  176. 'template' => $area['template'],
  177. 'title' => $area['title'],
  178. 'defaultUuid' => null,
  179. 'defaultTitle' => null,
  180. 'valid' => true,
  181. ]
  182. );
  183. }
  184. /**
  185. * Get snippet areas.
  186. *
  187. * @return array
  188. */
  189. private function getLocalizedAreas()
  190. {
  191. $areas = $this->sulu_snippet_areas;
  192. $locale = $this->getUser()->getLocale();
  193. $localizedAreas = [];
  194. foreach ($areas as $type) {
  195. $title = \ucfirst($type['key']);
  196. if (isset($type['title'][$locale])) {
  197. $title = $type['title'][$locale];
  198. }
  199. $localizedAreas[$type['key']] = [
  200. 'title' => $title,
  201. 'template' => $type['template'],
  202. ];
  203. }
  204. return $localizedAreas;
  205. }
  206. }