Open Monograph Press  3.3.0
PKPBackendSubmissionsHandler.inc.php
1 <?php
2 
17 import('lib.pkp.classes.handler.APIHandler');
18 import('lib.pkp.classes.submission.PKPSubmission');
19 import('classes.core.Services');
20 
21 abstract class PKPBackendSubmissionsHandler extends APIHandler {
22 
26  public function __construct() {
27  $rootPattern = '/{contextPath}/api/{version}/_submissions';
28  $this->_endpoints = array_merge_recursive($this->_endpoints, array(
29  'GET' => array(
30  array(
31  'pattern' => "{$rootPattern}",
32  'handler' => array($this, 'getMany'),
33  'roles' => array(
34  ROLE_ID_SITE_ADMIN,
35  ROLE_ID_MANAGER,
36  ROLE_ID_SUB_EDITOR,
37  ROLE_ID_AUTHOR,
38  ROLE_ID_REVIEWER,
39  ROLE_ID_ASSISTANT,
40  ),
41  ),
42  ),
43  'DELETE' => array(
44  array(
45  'pattern' => "{$rootPattern}/{submissionId}",
46  'handler' => array($this, 'delete'),
47  'roles' => array(
48  ROLE_ID_SITE_ADMIN,
49  ROLE_ID_MANAGER,
50  ROLE_ID_AUTHOR,
51  ),
52  ),
53  ),
54  ));
55  parent::__construct();
56  }
57 
61  function authorize($request, &$args, $roleAssignments) {
62  import('lib.pkp.classes.security.authorization.ContextAccessPolicy');
63  $this->addPolicy(new ContextAccessPolicy($request, $roleAssignments));
64  return parent::authorize($request, $args, $roleAssignments);
65  }
66 
75  public function getMany($slimRequest, $response, $args) {
76 
77  $request = $this->getRequest();
78  $currentUser = $request->getUser();
79  $context = $request->getContext();
80 
81  // Merge query params over default params
82  $defaultParams = array(
83  'count' => 20,
84  'offset' => 0,
85  );
86 
87  // Anyone not a manager or site admin can only access their assigned
88  // submissions
89  $userRoles = $this->getAuthorizedContextObject(ASSOC_TYPE_USER_ROLES);
90  $canAccessUnassignedSubmission = !empty(array_intersect(array(ROLE_ID_SITE_ADMIN, ROLE_ID_MANAGER), $userRoles));
91  if (!$canAccessUnassignedSubmission) {
92  $defaultParams['assignedTo'] = [$currentUser->getId()];
93  }
94 
95  $params = array_merge($defaultParams, $slimRequest->getQueryParams());
96 
97  // Process query params to format incoming data as needed
98  foreach ($params as $param => $val) {
99  switch ($param) {
100 
101  // Always convert status and stageIds to array
102  case 'status':
103  case 'stageIds':
104  case 'assignedTo':
105  if (is_string($val) && strpos($val, ',') > -1) {
106  $val = explode(',', $val);
107  } elseif (!is_array($val)) {
108  $val = array($val);
109  }
110  $params[$param] = array_map('intval', $val);
111  break;
112 
113  case 'daysInactive':
114  case 'offset':
115  $params[$param] = (int) $val;
116  break;
117 
118  // Enforce a maximum count to prevent the API from crippling the
119  // server
120  case 'count':
121  $params[$param] = min(100, (int) $val);
122  break;
123 
124  case 'orderBy':
125  if (!in_array($val, array('dateSubmitted', 'dateLastActivity', 'lastModified', 'title'))) {
126  unset($params[$param]);
127  }
128  break;
129 
130  case 'orderDirection':
131  $params[$param] = $val === 'ASC' ? $val : 'DESC';
132  break;
133 
134  case 'isIncomplete':
135  case 'isOverdue':
136  $params[$param] = true;
137  }
138  }
139 
140  $params['contextId'] = $context->getId();
141 
142  \HookRegistry::call('API::_submissions::params', array(&$params, $slimRequest, $response));
143 
144  // Prevent users from viewing submissions they're not assigned to,
145  // except for journal managers and admins.
146  if (!$canAccessUnassignedSubmission && !in_array($currentUser->getId(), $params['assignedTo'])) {
147  return $response->withStatus(403)->withJsonError('api.submissions.403.requestedOthersUnpublishedSubmissions');
148  }
149 
150  $submissionsIterator = Services::get('submission')->getMany($params);
151  $items = array();
152  if (count($submissionsIterator)) {
153  $propertyArgs = array(
154  'request' => $request,
155  'slimRequest' => $slimRequest,
156  );
157  foreach ($submissionsIterator as $submission) {
158  $items[] = Services::get('submission')->getBackendListProperties($submission, $propertyArgs);
159  }
160  }
161  $data = array(
162  'items' => $items,
163  'itemsMax' => Services::get('submission')->getMax($params),
164  );
165 
166  return $response->withJson($data);
167  }
168 
177  public function delete($slimRequest, $response, $args) {
178  $request = $this->getRequest();
179  $context = $request->getContext();
180  $submissionId = (int) $args['submissionId'];
181  $submissionDao = DAORegistry::getDAO('SubmissionDAO'); /* @var $submissionDao SubmissionDAO */
182  $submission = $submissionDao->getById($submissionId);
183 
184  if (!$submission) {
185  return $response->withStatus(404)->withJsonError('api.404.resourceNotFound');
186  }
187 
188  if ($context->getId() != $submission->getContextId()) {
189  return $response->withStatus(403)->withJsonError('api.submissions.403.deleteSubmissionOutOfContext');
190  }
191 
192  import('classes.core.Services');
193  if (!Services::get('submission')->canCurrentUserDelete($submission)) {
194  return $response->withStatus(403)->withJsonError('api.submissions.403.unauthorizedDeleteSubmission');
195  }
196 
197  Services::get('submission')->delete($submission);
198 
199  return $response->withJson(true);
200  }
201 }
ContextAccessPolicy
Class to control access to PKP applications' setup components.
Definition: ContextAccessPolicy.inc.php:17
PKPBackendSubmissionsHandler\__construct
__construct()
Definition: PKPBackendSubmissionsHandler.inc.php:26
DAORegistry\getDAO
static & getDAO($name, $dbconn=null)
Definition: DAORegistry.inc.php:57
APIHandler
Base request API handler.
Definition: APIHandler.inc.php:22
PKPBackendSubmissionsHandler\authorize
authorize($request, &$args, $roleAssignments)
Definition: PKPBackendSubmissionsHandler.inc.php:61
PKPBackendSubmissionsHandler
Handle API requests for backend operations.
Definition: PKPBackendSubmissionsHandler.inc.php:21
PKPHandler\getAuthorizedContextObject
& getAuthorizedContextObject($assocType)
Definition: PKPHandler.inc.php:174
PKPBackendSubmissionsHandler\getMany
getMany($slimRequest, $response, $args)
Definition: PKPBackendSubmissionsHandler.inc.php:75
APIHandler\getRequest
getRequest()
Definition: APIHandler.inc.php:149
PKPHandler\addPolicy
addPolicy($authorizationPolicy, $addToTop=false)
Definition: PKPHandler.inc.php:157
HookRegistry\call
static call($hookName, $args=null)
Definition: HookRegistry.inc.php:86
PKPServices\get
static get($service)
Definition: PKPServices.inc.php:49