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) {
311 if (!$request->getContext()) {
312 return $response->withStatus(400)->withJsonError(
'api.submissions.403.contextRequired');
316 $params[
'contextId'] = $request->getContext()->getId();
318 $primaryLocale = $request->getContext()->getPrimaryLocale();
319 $allowedLocales = $request->getContext()->getData(
'supportedSubmissionLocales');
321 $errors =
Services::get(
'submission')->validate(VALIDATE_ACTION_ADD, $params, $allowedLocales, $primaryLocale);
323 if (!empty($errors)) {
324 return $response->withStatus(400)->withJson($errors);
328 $submission = $submissionDao->newDataObject();
329 $submission->_data = $params;
330 $submission =
Services::get(
'submission')->add($submission, $request);
333 $data =
Services::get(
'submission')->getFullProperties($submission, [
334 'request' => $request,
335 'slimRequest' => $slimRequest,
336 'userGroups' => $userGroupDao->getByContextId($submission->getData(
'contextId'))->toArray(),
339 return $response->withJson($data, 200);
350 public function edit($slimRequest, $response, $args) {
355 return $response->withStatus(404)->withJsonError(
'api.404.resourceNotFound');
359 if (!$request->getContext()) {
360 return $response->withStatus(403)->withJsonError(
'api.submissions.403.contextRequired');
364 $params[
'id'] = $submission->getId();
365 $params[
'contextId'] = $request->getContext()->getId();
368 if (isset($params[
'contextId']) && $params[
'contextId'] !== $submission->getData(
'contextId')) {
369 return $response->withStatus(403)->withJsonError(
'api.submissions.403.cantChangeContext');
372 $primaryLocale = $request->getContext()->getPrimaryLocale();
373 $allowedLocales = $request->getContext()->getData(
'supportedSubmissionLocales');
375 $errors =
Services::get(
'submission')->validate(VALIDATE_ACTION_EDIT, $params, $allowedLocales, $primaryLocale);
377 if (!empty($errors)) {
378 return $response->withStatus(400)->withJson($errors);
381 $submission =
Services::get(
'submission')->edit($submission, $params, $request);
384 $data =
Services::get(
'submission')->getFullProperties($submission, [
385 'request' => $request,
386 'slimRequest' => $slimRequest,
387 'userGroups' => $userGroupDao->getByContextId($submission->getData(
'contextId'))->toArray(),
390 return $response->withJson($data, 200);
401 public function delete($slimRequest, $response, $args) {
406 return $response->withStatus(404)->withJsonError(
'api.404.resourceNotFound');
410 $submissionProps =
Services::get(
'submission')->getFullProperties($submission, [
411 'request' => $request,
412 'slimRequest' => $slimRequest,
413 'userGroups' => $userGroupDao->getByContextId($submission->getData(
'contextId'))->toArray(),
418 return $response->withJson($submissionProps, 200);
433 $context = $request->getContext();
435 $stageId = isset($args[
'stageId']) ? $args[
'stageId'] :
null;
438 return $response->withStatus(404)->withJsonError(
'api.404.resourceNotFound');
445 $usersIterator = $userService->getMany(array(
446 'contextId' => $context->getId(),
447 'assignedToSubmission' => $submission->getId(),
448 'assignedToSubmissionStage' => $stageId,
450 if (count($usersIterator)) {
452 'request' => $request,
453 'slimRequest' => $slimRequest,
455 foreach ($usersIterator as $user) {
456 $data[] = $userService->getSummaryProperties($user, $args);
460 return $response->withJson($data, 200);
478 return $response->withStatus(404)->withJsonError(
'api.404.resourceNotFound');
482 'submissionIds' => $submission->getId()
486 $userGroups = $userGroupDao->getByContextId($submission->getData(
'contextId'))->toArray();
489 $publicationsIterator =
Services::get(
'publication')->getMany($args);
490 foreach ($publicationsIterator as $publication) {
491 $items[] =
Services::get(
'publication')->getSummaryProperties(
494 'request' => $request,
495 'submission' => $submission,
496 'userGroups' => $userGroups,
506 return $response->withJson($data, 200);
521 $publication =
Services::get(
'publication')->get((
int) $args[
'publicationId']);
524 return $response->withStatus(404)->withJsonError(
'api.404.resourceNotFound');
527 if ($submission->getId() !== $publication->getData(
'submissionId')) {
528 return $response->withStatus(403)->withJsonError(
'api.publications.403.submissionsDidNotMatch');
535 'request' => $request,
536 'userGroups' => $userGroupDao->getByContextId($submission->getData(
'contextId'))->toArray(),
540 return $response->withJson($data, 200);
559 $params[
'submissionId'] = $submission->getId();
561 $submissionContext = $request->getContext();
562 if (!$submissionContext || $submissionContext->getId() !== $submission->getData(
'contextId')) {
563 $submissionContext =
Services::get(
'context')->get($submission->getData(
'contextId'));
565 $primaryLocale = $submissionContext->getPrimaryLocale();
566 $allowedLocales = $submissionContext->getData(
'supportedSubmissionLocales');
569 if (!empty($params[
'locale']) && in_array($params[
'locale'], $allowedLocales)) {
570 $primaryLocale = $params[
'locale'];
573 $errors =
Services::get(
'publication')->validate(VALIDATE_ACTION_ADD, $params, $allowedLocales, $primaryLocale);
575 if (!empty($errors)) {
576 return $response->withStatus(400)->withJson($errors);
581 $publication = $publicationDao->newDataObject();
582 $publication->_data = $params;
583 $publication =
Services::get(
'publication')->add($publication, $request);
584 $publicationProps =
Services::get(
'publication')->getFullProperties(
587 'request' => $request,
588 'userGroups' => $userGroupDao->getByContextId($submission->getData(
'contextId'))->toArray(),
592 return $response->withJson($publicationProps, 200);
606 $publication =
Services::get(
'publication')->get((
int) $args[
'publicationId']);
609 return $response->withStatus(404)->withJsonError(
'api.404.resourceNotFound');
612 if ($submission->getId() !== $publication->getData(
'submissionId')) {
613 return $response->withStatus(403)->withJsonError(
'api.publications.403.submissionsDidNotMatch');
616 $publication =
Services::get(
'publication')->version($publication, $request);
619 $publicationProps =
Services::get(
'publication')->getFullProperties(
622 'request' => $request,
623 'userGroups' => $userGroupDao->getByContextId($submission->getData(
'contextId'))->toArray(),
629 $usersIterator = $userService->getMany(array(
630 'contextId' => $submission->getContextId(),
631 'assignedToSubmission' => $submission->getId(),
634 foreach ($usersIterator as $user) {
635 $notificationManager->createNotification(
638 NOTIFICATION_TYPE_SUBMISSION_NEW_VERSION,
639 $submission->getContextId(),
640 ASSOC_TYPE_SUBMISSION,
641 $submission->getId(),
642 NOTIFICATION_LEVEL_TASK
646 return $response->withJson($publicationProps, 200);
660 $currentUser = $request->getUser();
661 $publication =
Services::get(
'publication')->get((
int) $args[
'publicationId']);
664 return $response->withStatus(404)->withJsonError(
'api.404.resourceNotFound');
667 if ($submission->getId() !== $publication->getData(
'submissionId')) {
668 return $response->withStatus(403)->withJsonError(
'api.publications.403.submissionsDidNotMatch');
672 if ($publication->getData(
'status') === STATUS_PUBLISHED) {
673 return $response->withStatus(403)->withJsonError(
'api.publication.403.cantEditPublished');
678 if (!in_array(ROLE_ID_SITE_ADMIN, $userRoles) && !
Services::get(
'submission')->canEditPublication($submission->getId(), $currentUser->getId())) {
679 return $response->withStatus(403)->withJsonError(
'api.submissions.403.userCantEdit');
683 $params[
'id'] = $publication->getId();
687 if (array_key_exists(
'status', $params)) {
688 return $response->withStatus(403)->withJsonError(
'api.publication.403.cantEditStatus');
691 $submissionContext = $request->getContext();
692 if (!$submissionContext || $submissionContext->getId() !== $submission->getData(
'contextId')) {
693 $submissionContext =
Services::get(
'context')->get($submission->getData(
'contextId'));
695 $primaryLocale = $publication->getData(
'locale');
696 $allowedLocales = $submissionContext->getData(
'supportedSubmissionLocales');
698 $errors =
Services::get(
'publication')->validate(VALIDATE_ACTION_EDIT, $params, $allowedLocales, $primaryLocale);
700 if (!empty($errors)) {
701 return $response->withStatus(400)->withJson($errors);
704 $publication =
Services::get(
'publication')->edit($publication, $params, $request);
707 $publicationProps =
Services::get(
'publication')->getFullProperties(
710 'request' => $request,
711 'userGroups' => $userGroupDao->getByContextId($submission->getData(
'contextId'))->toArray(),
715 return $response->withJson($publicationProps, 200);
733 $publication =
Services::get(
'publication')->get((
int) $args[
'publicationId']);
736 return $response->withStatus(404)->withJsonError(
'api.404.resourceNotFound');
739 if ($submission->getId() !== $publication->getData(
'submissionId')) {
740 return $response->withStatus(403)->withJsonError(
'api.publications.403.submissionsDidNotMatch');
743 if ($publication->getData(
'status') === STATUS_PUBLISHED) {
744 return $response->withStatus(403)->withJsonError(
'api.publication.403.alreadyPublished');
749 $submissionContext = $request->getContext();
750 if (!$submissionContext || $submissionContext->getId() !== $submission->getData(
'contextId')) {
751 $submissionContext =
Services::get(
'context')->get($submission->getData(
'contextId'));
753 $primaryLocale = $submission->getData(
'locale');
754 $allowedLocales = $submissionContext->getData(
'supportedSubmissionLocales');
756 $errors =
Services::get(
'publication')->validatePublish($publication, $submission, $allowedLocales, $primaryLocale);
758 if (!empty($errors)) {
759 return $response->withStatus(400)->withJson($errors);
762 $publication =
Services::get(
'publication')->publish($publication);
765 $publicationProps =
Services::get(
'publication')->getFullProperties(
768 'request' => $request,
769 'userGroups' => $userGroupDao->getByContextId($submission->getData(
'contextId'))->toArray(),
773 return $response->withJson($publicationProps, 200);
787 $publication =
Services::get(
'publication')->get((
int) $args[
'publicationId']);
790 return $response->withStatus(404)->withJsonError(
'api.404.resourceNotFound');
793 if ($submission->getId() !== $publication->getData(
'submissionId')) {
794 return $response->withStatus(403)->withJsonError(
'api.publications.403.submissionsDidNotMatch');
797 if (!in_array($publication->getData(
'status'), [STATUS_PUBLISHED, STATUS_SCHEDULED])) {
798 return $response->withStatus(403)->withJsonError(
'api.publication.403.alreadyUnpublished');
801 $publication =
Services::get(
'publication')->unpublish($publication);
804 $publicationProps =
Services::get(
'publication')->getFullProperties(
807 'request' => $request,
808 'userGroups' => $userGroupDao->getByContextId($submission->getData(
'contextId'))->toArray(),
812 return $response->withJson($publicationProps, 200);
829 $publication =
Services::get(
'publication')->get((
int) $args[
'publicationId']);
832 return $response->withStatus(404)->withJsonError(
'api.404.resourceNotFound');
835 if ($submission->getId() !== $publication->getData(
'submissionId')) {
836 return $response->withStatus(403)->withJsonError(
'api.publications.403.submissionsDidNotMatch');
839 if ($publication->getData(
'status') === STATUS_PUBLISHED) {
840 return $response->withStatus(403)->withJsonError(
'api.publication.403.cantDeletePublished');
844 $publicationProps =
Services::get(
'publication')->getFullProperties(
847 'request' => $request,
848 'userGroups' => $userGroupDao->getByContextId($submission->getData(
'contextId'))->toArray(),
854 return $response->withJson($publicationProps, 200);