15 import(
'lib.pkp.classes.handler.APIHandler');
25 $this->_handlerPath =
'contexts';
26 $roles = array(ROLE_ID_SITE_ADMIN, ROLE_ID_MANAGER);
27 $this->_endpoints = array(
31 'handler' => array($this,
'getMany'),
36 'handler' => array($this,
'get'),
41 'handler' => array($this,
'getTheme'),
48 'handler' => array($this,
'add'),
49 'roles' => array(ROLE_ID_SITE_ADMIN),
55 'handler' => array($this,
'edit'),
60 'handler' => array($this,
'editTheme'),
67 'handler' => array($this,
'delete'),
68 'roles' => array(ROLE_ID_SITE_ADMIN),
72 parent::__construct();
78 public function authorize($request, &$args, $roleAssignments) {
79 import(
'lib.pkp.classes.security.authorization.PolicySet');
80 $rolePolicy =
new PolicySet(COMBINING_PERMIT_OVERRIDES);
82 import(
'lib.pkp.classes.security.authorization.RoleBasedHandlerOperationPolicy');
83 foreach ($roleAssignments as $role => $operations) {
88 return parent::authorize($request, $args, $roleAssignments);
99 public function getMany($slimRequest, $response, $args) {
102 $defaultParams = array(
107 $requestParams = array_merge($defaultParams, $slimRequest->getQueryParams());
109 $allowedParams = array();
112 foreach ($requestParams as $param => $val) {
115 $allowedParams[$param] = (bool) $val;
119 $allowedParams[$param] = trim($val);
123 $allowedParams[$param] = min(100, (
int) $val);
127 $allowedParams[$param] = (int) $val;
136 if (empty($allowedParams[
'isEnabled'])) {
138 $canAccessDisabledContexts = !empty(array_intersect(array(ROLE_ID_SITE_ADMIN), $userRoles));
139 if (!$canAccessDisabledContexts) {
140 return $response->withStatus(403)->withJsonError(
'api.contexts.403.requestedDisabledContexts');
145 $contextsIterator =
Services::get(
'context')->getMany($allowedParams);
146 if (count($contextsIterator)) {
147 $propertyArgs = array(
148 'request' => $request,
149 'slimRequest' => $slimRequest,
151 foreach ($contextsIterator as $context) {
152 $items[] =
Services::get(
'context')->getSummaryProperties($context, $propertyArgs);
157 'itemsMax' =>
Services::get(
'context')->getMax($allowedParams),
161 return $response->withJson($data, 200);
172 public function get($slimRequest, $response, $args) {
174 $user = $request->getUser();
177 $context = $contextService->get((
int) $args[
'contextId']);
180 return $response->withStatus(404)->withJsonError(
'api.contexts.404.contextNotFound');
184 if ($request->getContext() && $request->getContext()->getId() !== $context->getId()) {
185 return $response->withStatus(403)->withJsonError(
'api.contexts.403.contextsDidNotMatch');
190 if (!$context->getEnabled()) {
192 if (!in_array(ROLE_ID_SITE_ADMIN, $userRoles)) {
193 $roleDao = DaoRegistry::getDao(
'RoleDAO');
194 if (!$roleDao->userHasRole($context->getId(), $user->getId(), ROLE_ID_MANAGER)) {
195 return $response->withStatus(403)->withJsonError(
'api.contexts.403.notAllowed');
200 $data = $contextService->getFullProperties($context, array(
201 'request' => $request,
202 'slimRequest' => $slimRequest
205 return $response->withJson($data, 200);
216 public function getTheme($slimRequest, $response, $args) {
218 $user = $request->getUser();
221 $context = $contextService->get((
int) $args[
'contextId']);
224 return $response->withStatus(404)->withJsonError(
'api.contexts.404.contextNotFound');
228 if ($request->getContext() && $request->getContext()->getId() !== $context->getId()) {
229 return $response->withStatus(403)->withJsonError(
'api.contexts.403.contextsDidNotMatch');
234 if (!$context->getEnabled()) {
236 if (!in_array(ROLE_ID_SITE_ADMIN, $userRoles)) {
237 $roleDao = DaoRegistry::getDao(
'RoleDAO');
238 if (!$roleDao->userHasRole($context->getId(), $user->getId(), ROLE_ID_MANAGER)) {
239 return $response->withStatus(403)->withJsonError(
'api.contexts.403.notAllowed');
246 foreach ($allThemes as $theme) {
247 if ($context->getData(
'themePluginPath') === $theme->getDirName()) {
248 $activeTheme = $theme;
254 return $response->withStatus(404)->withJsonError(
'api.themes.404.themeUnavailable');
258 $activeTheme->getOptionValues($context->getId()),
259 [
'themePluginPath' => $theme->getDirName()]
264 return $response->withJson($data, 200);
275 public function add($slimRequest, $response, $args) {
279 if ($request->getContext()) {
280 return $response->withStatus(404)->withJsonError(
'api.submissions.404.siteWideEndpoint');
283 $site = $request->getSite();
286 $primaryLocale = $site->getPrimaryLocale();
287 $allowedLocales = $site->getSupportedLocales();
289 $errors = $contextService->validate(VALIDATE_ACTION_ADD, $params, $allowedLocales, $primaryLocale);
291 if (!empty($errors)) {
292 return $response->withStatus(400)->withJson($errors);
296 $context->_data = $params;
297 $context = $contextService->add($context, $request);
298 $contextProps = $contextService->getFullProperties($context, array(
299 'request' => $request,
300 'slimRequest' => $slimRequest
303 return $response->withJson($contextProps, 200);
314 public function edit($slimRequest, $response, $args) {
316 $requestContext = $request->getContext();
318 $contextId = (int) $args[
'contextId'];
321 if ($request->getContext() && $request->getContext()->getId() !== $contextId) {
322 return $response->withStatus(403)->withJsonError(
'api.contexts.403.contextsDidNotMatch');
327 if (!$request->getContext()) {
328 return $response->withStatus(403)->withJsonError(
'api.contexts.403.requiresContext');
332 $context = $contextService->get($contextId);
335 return $response->withStatus(404)->withJsonError(
'api.contexts.404.contextNotFound');
339 if (!$requestContext && !in_array(ROLE_ID_SITE_ADMIN, $userRoles)) {
340 return $response->withStatus(403)->withJsonError(
'api.contexts.403.notAllowedEdit');
344 $params[
'id'] = $contextId;
346 $site = $request->getSite();
347 $primaryLocale = $context->getPrimaryLocale();
348 $allowedLocales = $context->getSupportedFormLocales();
350 $errors = $contextService->validate(VALIDATE_ACTION_EDIT, $params, $allowedLocales, $primaryLocale);
352 if (!empty($errors)) {
353 return $response->withStatus(400)->withJson($errors);
355 $context = $contextService->edit($context, $params, $request);
357 $contextProps = $contextService->getFullProperties($context, array(
358 'request' => $request,
359 'slimRequest' => $slimRequest
362 return $response->withJson($contextProps, 200);
373 public function editTheme($slimRequest, $response, $args) {
375 $requestContext = $request->getContext();
377 $contextId = (int) $args[
'contextId'];
380 if ($request->getContext() && $request->getContext()->getId() !== $contextId) {
381 return $response->withStatus(403)->withJsonError(
'api.contexts.403.contextsDidNotMatch');
386 if (!$request->getContext()) {
387 return $response->withStatus(403)->withJsonError(
'api.contexts.403.requiresContext');
391 $context = $contextService->get($contextId);
394 return $response->withStatus(404)->withJsonError(
'api.contexts.404.contextNotFound');
398 if (!$requestContext && !in_array(ROLE_ID_SITE_ADMIN, $userRoles)) {
399 return $response->withStatus(403)->withJsonError(
'api.contexts.403.notAllowedEdit');
402 $params = $slimRequest->getParsedBody();
405 $themePluginPath = empty($params[
'themePluginPath']) ? null : $params[
'themePluginPath'];
406 if ($themePluginPath !== $context->getData(
'themePluginPath')) {
407 $errors = $contextService->validate(
408 VALIDATE_ACTION_EDIT,
409 [
'themePluginPath' => $themePluginPath],
410 $context->getSupportedFormLocales(),
411 $context->getPrimaryLocale()
413 if (!empty($errors)) {
414 return $response->withJson($errors, 400);
416 $newContext = $contextService->edit($context, [
'themePluginPath' => $themePluginPath], $request);
421 $selectedTheme =
null;
422 foreach ($allThemes as $theme) {
423 if ($themePluginPath === $theme->getDirName()) {
424 $selectedTheme = $theme;
430 if (isset($newContext)) {
431 $selectedTheme->init();
434 $errors = $selectedTheme->validateOptions($params, $themePluginPath, $context->getId(), $request);
435 if (!empty($errors)) {
436 return $response->withJson($errors, 400);
440 $options = $selectedTheme->getOptionsConfig();
441 foreach ($options as $optionName => $optionConfig) {
442 if (!array_key_exists($optionName, $params)) {
445 $selectedTheme->saveOption($optionName, $params[$optionName], $context->getId());
450 $templateMgr->clearTemplateCache();
451 $templateMgr->clearCssCache();
454 $selectedTheme->getOptionValues($context->getId()),
455 [
'themePluginPath' => $themePluginPath]
460 return $response->withJson($data, 200);
471 public function delete($slimRequest, $response, $args) {
475 return $response->withStatus(404)->withJsonError(
'api.submissions.404.siteWideEndpoint');
479 if (!in_array(ROLE_ID_SITE_ADMIN, $userRoles)) {
480 $response->withStatus(403)->withJsonError(
'api.contexts.403.notAllowedDelete');
483 $contextId = (int) $args[
'contextId'];
486 $context = $contextService->get($contextId);
489 return $response->withStatus(404)->withJsonError(
'api.contexts.404.contextNotFound');
492 $contextProps = $contextService->getSummaryProperties($context, array(
494 'slimRequest' => $slimRequest
497 $contextService->delete($context);
499 return $response->withJson($contextProps, 200);