17 import(
'lib.pkp.classes.handler.APIHandler');
18 import(
'classes.core.Services');
26 $this->_handlerPath =
'submissions';
31 'handler' => [$this,
'getMany'],
32 'roles' => [ROLE_ID_MANAGER, ROLE_ID_SUB_EDITOR, ROLE_ID_ASSISTANT, ROLE_ID_REVIEWER, ROLE_ID_AUTHOR],
36 'handler' => [$this,
'get'],
37 'roles' => [ROLE_ID_MANAGER, ROLE_ID_SUB_EDITOR, ROLE_ID_ASSISTANT, ROLE_ID_REVIEWER, ROLE_ID_AUTHOR],
41 'handler' => [$this,
'getParticipants'],
42 'roles' => [ROLE_ID_MANAGER, ROLE_ID_SUB_EDITOR],
46 'handler' => [$this,
'getParticipants'],
47 'roles' => [ROLE_ID_MANAGER, ROLE_ID_SUB_EDITOR],
51 'handler' => [$this,
'getPublications'],
52 'roles' => [ROLE_ID_MANAGER, ROLE_ID_SUB_EDITOR, ROLE_ID_ASSISTANT, ROLE_ID_REVIEWER, ROLE_ID_AUTHOR],
55 'pattern' => $this->
getEndpointPattern() .
'/{submissionId}/publications/{publicationId}',
56 'handler' => [$this,
'getPublication'],
57 'roles' => [ROLE_ID_MANAGER, ROLE_ID_SUB_EDITOR, ROLE_ID_ASSISTANT, ROLE_ID_REVIEWER, ROLE_ID_AUTHOR],
63 'handler' => [$this,
'add'],
64 'roles' => [ROLE_ID_MANAGER, ROLE_ID_SUB_EDITOR],
68 'handler' => [$this,
'addPublication'],
69 'roles' => [ROLE_ID_MANAGER, ROLE_ID_SUB_EDITOR, ROLE_ID_ASSISTANT],
72 'pattern' => $this->
getEndpointPattern() .
'/{submissionId}/publications/{publicationId}/version',
73 'handler' => [$this,
'versionPublication'],
74 'roles' => [ROLE_ID_MANAGER, ROLE_ID_SUB_EDITOR, ROLE_ID_ASSISTANT],
80 'handler' => [$this,
'edit'],
81 'roles' => [ROLE_ID_MANAGER, ROLE_ID_SUB_EDITOR],
84 'pattern' => $this->
getEndpointPattern() .
'/{submissionId}/publications/{publicationId}',
85 'handler' => [$this,
'editPublication'],
86 'roles' => [ROLE_ID_MANAGER, ROLE_ID_SUB_EDITOR, ROLE_ID_ASSISTANT, ROLE_ID_AUTHOR],
89 'pattern' => $this->
getEndpointPattern() .
'/{submissionId}/publications/{publicationId}/publish',
90 'handler' => [$this,
'publishPublication'],
91 'roles' => [ROLE_ID_MANAGER, ROLE_ID_SUB_EDITOR, ROLE_ID_ASSISTANT],
94 'pattern' => $this->
getEndpointPattern() .
'/{submissionId}/publications/{publicationId}/unpublish',
95 'handler' => [$this,
'unpublishPublication'],
96 'roles' => [ROLE_ID_MANAGER, ROLE_ID_SUB_EDITOR, ROLE_ID_ASSISTANT],
102 'handler' => [$this,
'delete'],
103 'roles' => [ROLE_ID_MANAGER, ROLE_ID_SUB_EDITOR],
106 'pattern' => $this->
getEndpointPattern() .
'/{submissionId}/publications/{publicationId}',
107 'handler' => [$this,
'deletePublication'],
108 'roles' => [ROLE_ID_MANAGER, ROLE_ID_SUB_EDITOR, ROLE_ID_ASSISTANT],
112 parent::__construct();
118 function authorize($request, &$args, $roleAssignments) {
119 $routeName = $this->
getSlimRequest()->getAttribute(
'route')->getName();
121 import(
'lib.pkp.classes.security.authorization.ContextAccessPolicy');
124 $requiresSubmissionAccess = [
132 'versionPublication',
134 'publishPublication',
135 'unpublishPublication',
138 if (in_array($routeName, $requiresSubmissionAccess)) {
139 import(
'lib.pkp.classes.security.authorization.SubmissionAccessPolicy');
143 $requiresPublicationWriteAccess = [
146 if (in_array($routeName, $requiresPublicationWriteAccess)) {
147 import(
'lib.pkp.classes.security.authorization.PublicationWritePolicy');
151 $requiresProductionStageAccess = [
153 'versionPublication',
154 'publishPublication',
155 'unpublishPublication',
158 if (in_array($routeName, $requiresProductionStageAccess)) {
159 import(
'lib.pkp.classes.security.authorization.StageRolePolicy');
160 $this->
addPolicy(
new StageRolePolicy([ROLE_ID_MANAGER, ROLE_ID_SUB_EDITOR, ROLE_ID_ASSISTANT], WORKFLOW_STAGE_ID_PRODUCTION,
false));
163 return parent::authorize($request, $args, $roleAssignments);
173 public function getMany($slimRequest, $response, $args) {
175 $currentUser = $request->getUser();
176 $context = $request->getContext();
179 return $response->withStatus(404)->withJsonError(
'api.404.resourceNotFound');
189 $canAccessUnassignedSubmission = !empty(array_intersect(array(ROLE_ID_SITE_ADMIN, ROLE_ID_MANAGER), $userRoles));
190 if (!$canAccessUnassignedSubmission) {
191 $defaultParams[
'assignedTo'] = [$currentUser->getId()];
194 $params = array_merge($defaultParams, $slimRequest->getQueryParams());
196 foreach ($params as $param => $val) {
199 if (in_array($val, array(
'dateSubmitted',
'dateLastActivity',
'lastModified',
'title'))) {
200 $params[$param] = $val;
204 case 'orderDirection':
205 $params[$param] = $val ===
'ASC' ? $val :
'DESC';
212 if (is_string($val) && strpos($val,
',') > -1) {
213 $val = explode(
',', $val);
214 } elseif (!is_array($val)) {
217 $params[$param] = array_map(
'intval', $val);
222 $params[$param] = (int) $val;
226 $params[$param] = $val;
232 $params[$param] = min(100, (
int) $val);
237 $params[$param] =
true;
242 $params[
'contextId'] = $request->getContext()->getId();
249 $canAccessUnassignedSubmission = !empty(array_intersect(array(ROLE_ID_SITE_ADMIN, ROLE_ID_MANAGER), $userRoles));
250 if (!$canAccessUnassignedSubmission && !in_array($currentUser->getId(), $params[
'assignedTo'])) {
251 return $response->withStatus(403)->withJsonError(
'api.submissions.403.requestedOthersUnpublishedSubmissions');
255 $submissionsIterator =
Services::get(
'submission')->getMany($params);
256 if (count($submissionsIterator)) {
259 'request' => $request,
260 'slimRequest' => $slimRequest,
261 'userGroups' => $userGroupDao->getByContextId($context->getId())->toArray()
263 foreach ($submissionsIterator as $submission) {
264 $items[] =
Services::get(
'submission')->getSummaryProperties($submission, $propertyArgs);
273 return $response->withJson($data, 200);
283 public function get($slimRequest, $response, $args) {
290 $data =
Services::get(
'submission')->getFullProperties($submission, array(
291 'request' => $request,
292 'slimRequest' => $slimRequest,
293 'userGroups' => $userGroupDao->getByContextId($submission->getData(
'contextId'))->toArray(),
296 return $response->withJson($data, 200);
307 public function add($slimRequest, $response, $args) {
313 if (!$request->getContext()) {
314 return $response->withStatus(400)->withJsonError(
'api.submissions.403.contextRequired');
317 if ($request->getContext()->getData(
'disableSubmissions')) {
318 return $response->withStatus(403)->withJsonError(
'author.submit.notAccepting');
322 $params[
'contextId'] = $request->getContext()->getId();
324 $primaryLocale = $request->getContext()->getPrimaryLocale();
325 $allowedLocales = $request->getContext()->getData(
'supportedSubmissionLocales');
327 $errors =
Services::get(
'submission')->validate(VALIDATE_ACTION_ADD, $params, $allowedLocales, $primaryLocale);
329 if (!empty($errors)) {
330 return $response->withStatus(400)->withJson($errors);
334 $submission = $submissionDao->newDataObject();
335 $submission->_data = $params;
336 $submission =
Services::get(
'submission')->add($submission, $request);
339 $data =
Services::get(
'submission')->getFullProperties($submission, [
340 'request' => $request,
341 'slimRequest' => $slimRequest,
342 'userGroups' => $userGroupDao->getByContextId($submission->getData(
'contextId'))->toArray(),
345 return $response->withJson($data, 200);
356 public function edit($slimRequest, $response, $args) {
361 return $response->withStatus(404)->withJsonError(
'api.404.resourceNotFound');
365 if (!$request->getContext()) {
366 return $response->withStatus(403)->withJsonError(
'api.submissions.403.contextRequired');
370 $params[
'id'] = $submission->getId();
371 $params[
'contextId'] = $request->getContext()->getId();
374 if (isset($params[
'contextId']) && $params[
'contextId'] !== $submission->getData(
'contextId')) {
375 return $response->withStatus(403)->withJsonError(
'api.submissions.403.cantChangeContext');
378 $primaryLocale = $request->getContext()->getPrimaryLocale();
379 $allowedLocales = $request->getContext()->getData(
'supportedSubmissionLocales');
381 $errors =
Services::get(
'submission')->validate(VALIDATE_ACTION_EDIT, $params, $allowedLocales, $primaryLocale);
383 if (!empty($errors)) {
384 return $response->withStatus(400)->withJson($errors);
387 $submission =
Services::get(
'submission')->edit($submission, $params, $request);
390 $data =
Services::get(
'submission')->getFullProperties($submission, [
391 'request' => $request,
392 'slimRequest' => $slimRequest,
393 'userGroups' => $userGroupDao->getByContextId($submission->getData(
'contextId'))->toArray(),
396 return $response->withJson($data, 200);
407 public function delete($slimRequest, $response, $args) {
412 return $response->withStatus(404)->withJsonError(
'api.404.resourceNotFound');
416 $submissionProps =
Services::get(
'submission')->getFullProperties($submission, [
417 'request' => $request,
418 'slimRequest' => $slimRequest,
419 'userGroups' => $userGroupDao->getByContextId($submission->getData(
'contextId'))->toArray(),
424 return $response->withJson($submissionProps, 200);
439 $context = $request->getContext();
441 $stageId = isset($args[
'stageId']) ? $args[
'stageId'] :
null;
444 return $response->withStatus(404)->withJsonError(
'api.404.resourceNotFound');
451 $usersIterator = $userService->getMany(array(
452 'contextId' => $context->getId(),
453 'assignedToSubmission' => $submission->getId(),
454 'assignedToSubmissionStage' => $stageId,
456 if (count($usersIterator)) {
458 'request' => $request,
459 'slimRequest' => $slimRequest,
461 foreach ($usersIterator as $user) {
462 $data[] = $userService->getSummaryProperties($user, $args);
466 return $response->withJson($data, 200);
484 return $response->withStatus(404)->withJsonError(
'api.404.resourceNotFound');
488 'submissionIds' => $submission->getId()
492 $userGroups = $userGroupDao->getByContextId($submission->getData(
'contextId'))->toArray();
495 $publicationsIterator =
Services::get(
'publication')->getMany($args);
496 foreach ($publicationsIterator as $publication) {
497 $items[] =
Services::get(
'publication')->getSummaryProperties(
500 'request' => $request,
501 'submission' => $submission,
502 'userGroups' => $userGroups,
512 return $response->withJson($data, 200);
527 $publication =
Services::get(
'publication')->get((
int) $args[
'publicationId']);
530 return $response->withStatus(404)->withJsonError(
'api.404.resourceNotFound');
533 if ($submission->getId() !== $publication->getData(
'submissionId')) {
534 return $response->withStatus(403)->withJsonError(
'api.publications.403.submissionsDidNotMatch');
541 'request' => $request,
542 'userGroups' => $userGroupDao->getByContextId($submission->getData(
'contextId'))->toArray(),
546 return $response->withJson($data, 200);
565 $params[
'submissionId'] = $submission->getId();
567 $submissionContext = $request->getContext();
568 if (!$submissionContext || $submissionContext->getId() !== $submission->getData(
'contextId')) {
569 $submissionContext =
Services::get(
'context')->get($submission->getData(
'contextId'));
571 $primaryLocale = $submissionContext->getPrimaryLocale();
572 $allowedLocales = $submissionContext->getData(
'supportedSubmissionLocales');
575 if (!empty($params[
'locale']) && in_array($params[
'locale'], $allowedLocales)) {
576 $primaryLocale = $params[
'locale'];
579 $errors =
Services::get(
'publication')->validate(VALIDATE_ACTION_ADD, $params, $allowedLocales, $primaryLocale);
581 if (!empty($errors)) {
582 return $response->withStatus(400)->withJson($errors);
587 $publication = $publicationDao->newDataObject();
588 $publication->_data = $params;
589 $publication =
Services::get(
'publication')->add($publication, $request);
590 $publicationProps =
Services::get(
'publication')->getFullProperties(
593 'request' => $request,
594 'userGroups' => $userGroupDao->getByContextId($submission->getData(
'contextId'))->toArray(),
598 return $response->withJson($publicationProps, 200);
612 $publication =
Services::get(
'publication')->get((
int) $args[
'publicationId']);
615 return $response->withStatus(404)->withJsonError(
'api.404.resourceNotFound');
618 if ($submission->getId() !== $publication->getData(
'submissionId')) {
619 return $response->withStatus(403)->withJsonError(
'api.publications.403.submissionsDidNotMatch');
622 $publication =
Services::get(
'publication')->version($publication, $request);
625 $publicationProps =
Services::get(
'publication')->getFullProperties(
628 'request' => $request,
629 'userGroups' => $userGroupDao->getByContextId($submission->getData(
'contextId'))->toArray(),
635 $usersIterator = $userService->getMany(array(
636 'contextId' => $submission->getContextId(),
637 'assignedToSubmission' => $submission->getId(),
640 foreach ($usersIterator as $user) {
641 $notificationManager->createNotification(
644 NOTIFICATION_TYPE_SUBMISSION_NEW_VERSION,
645 $submission->getContextId(),
646 ASSOC_TYPE_SUBMISSION,
647 $submission->getId(),
648 NOTIFICATION_LEVEL_TASK
652 return $response->withJson($publicationProps, 200);
666 $currentUser = $request->getUser();
667 $publication =
Services::get(
'publication')->get((
int) $args[
'publicationId']);
670 return $response->withStatus(404)->withJsonError(
'api.404.resourceNotFound');
673 if ($submission->getId() !== $publication->getData(
'submissionId')) {
674 return $response->withStatus(403)->withJsonError(
'api.publications.403.submissionsDidNotMatch');
678 if ($publication->getData(
'status') === STATUS_PUBLISHED) {
679 return $response->withStatus(403)->withJsonError(
'api.publication.403.cantEditPublished');
684 if (!in_array(ROLE_ID_SITE_ADMIN, $userRoles) && !
Services::get(
'submission')->canEditPublication($submission->getId(), $currentUser->getId())) {
685 return $response->withStatus(403)->withJsonError(
'api.submissions.403.userCantEdit');
689 $params[
'id'] = $publication->getId();
693 if (array_key_exists(
'status', $params)) {
694 return $response->withStatus(403)->withJsonError(
'api.publication.403.cantEditStatus');
697 $submissionContext = $request->getContext();
698 if (!$submissionContext || $submissionContext->getId() !== $submission->getData(
'contextId')) {
699 $submissionContext =
Services::get(
'context')->get($submission->getData(
'contextId'));
701 $primaryLocale = $publication->getData(
'locale');
702 $allowedLocales = $submissionContext->getData(
'supportedSubmissionLocales');
704 $errors =
Services::get(
'publication')->validate(VALIDATE_ACTION_EDIT, $params, $allowedLocales, $primaryLocale);
706 if (!empty($errors)) {
707 return $response->withStatus(400)->withJson($errors);
710 $publication =
Services::get(
'publication')->edit($publication, $params, $request);
713 $publicationProps =
Services::get(
'publication')->getFullProperties(
716 'request' => $request,
717 'userGroups' => $userGroupDao->getByContextId($submission->getData(
'contextId'))->toArray(),
721 return $response->withJson($publicationProps, 200);
739 $publication =
Services::get(
'publication')->get((
int) $args[
'publicationId']);
742 return $response->withStatus(404)->withJsonError(
'api.404.resourceNotFound');
745 if ($submission->getId() !== $publication->getData(
'submissionId')) {
746 return $response->withStatus(403)->withJsonError(
'api.publications.403.submissionsDidNotMatch');
749 if ($publication->getData(
'status') === STATUS_PUBLISHED) {
750 return $response->withStatus(403)->withJsonError(
'api.publication.403.alreadyPublished');
755 $submissionContext = $request->getContext();
756 if (!$submissionContext || $submissionContext->getId() !== $submission->getData(
'contextId')) {
757 $submissionContext =
Services::get(
'context')->get($submission->getData(
'contextId'));
759 $primaryLocale = $submission->getData(
'locale');
760 $allowedLocales = $submissionContext->getData(
'supportedSubmissionLocales');
762 $errors =
Services::get(
'publication')->validatePublish($publication, $submission, $allowedLocales, $primaryLocale);
764 if (!empty($errors)) {
765 return $response->withStatus(400)->withJson($errors);
768 $publication =
Services::get(
'publication')->publish($publication);
771 $publicationProps =
Services::get(
'publication')->getFullProperties(
774 'request' => $request,
775 'userGroups' => $userGroupDao->getByContextId($submission->getData(
'contextId'))->toArray(),
779 return $response->withJson($publicationProps, 200);
793 $publication =
Services::get(
'publication')->get((
int) $args[
'publicationId']);
796 return $response->withStatus(404)->withJsonError(
'api.404.resourceNotFound');
799 if ($submission->getId() !== $publication->getData(
'submissionId')) {
800 return $response->withStatus(403)->withJsonError(
'api.publications.403.submissionsDidNotMatch');
803 if (!in_array($publication->getData(
'status'), [STATUS_PUBLISHED, STATUS_SCHEDULED])) {
804 return $response->withStatus(403)->withJsonError(
'api.publication.403.alreadyUnpublished');
807 $publication =
Services::get(
'publication')->unpublish($publication);
810 $publicationProps =
Services::get(
'publication')->getFullProperties(
813 'request' => $request,
814 'userGroups' => $userGroupDao->getByContextId($submission->getData(
'contextId'))->toArray(),
818 return $response->withJson($publicationProps, 200);
835 $publication =
Services::get(
'publication')->get((
int) $args[
'publicationId']);
838 return $response->withStatus(404)->withJsonError(
'api.404.resourceNotFound');
841 if ($submission->getId() !== $publication->getData(
'submissionId')) {
842 return $response->withStatus(403)->withJsonError(
'api.publications.403.submissionsDidNotMatch');
845 if ($publication->getData(
'status') === STATUS_PUBLISHED) {
846 return $response->withStatus(403)->withJsonError(
'api.publication.403.cantDeletePublished');
850 $publicationProps =
Services::get(
'publication')->getFullProperties(
853 'request' => $request,
854 'userGroups' => $userGroupDao->getByContextId($submission->getData(
'contextId'))->toArray(),
860 return $response->withJson($publicationProps, 200);