Open Journal Systems  3.3.0
api/v1/users/PKPUserHandler.inc.php
1 <?php
2 
17 import('lib.pkp.classes.handler.APIHandler');
18 import('classes.core.Services');
19 
20 class PKPUserHandler extends APIHandler {
21 
25  public function __construct() {
26  $this->_handlerPath = 'users';
27  $roles = array(ROLE_ID_SITE_ADMIN, ROLE_ID_MANAGER, ROLE_ID_SUB_EDITOR);
28  $this->_endpoints = array(
29  'GET' => array (
30  array(
31  'pattern' => $this->getEndpointPattern(),
32  'handler' => array($this, 'getMany'),
33  'roles' => $roles
34  ),
35  array(
36  'pattern' => $this->getEndpointPattern() . '/reviewers',
37  'handler' => array($this, 'getReviewers'),
38  'roles' => $roles
39  ),
40  array(
41  'pattern' => $this->getEndpointPattern() . '/{userId}',
42  'handler' => array($this, 'get'),
43  'roles' => $roles
44  ),
45  ),
46  );
47  parent::__construct();
48  }
49 
53  function authorize($request, &$args, $roleAssignments) {
54  import('lib.pkp.classes.security.authorization.ContextAccessPolicy');
55  $this->addPolicy(new ContextAccessPolicy($request, $roleAssignments));
56  return parent::authorize($request, $args, $roleAssignments);
57  }
58 
67  public function getMany($slimRequest, $response, $args) {
68  $request = $this->getRequest();
69  $context = $request->getContext();
70 
71  if (!$context) {
72  return $response->withStatus(404)->withJsonError('api.404.resourceNotFound');
73  }
74 
75  $params = $this->_processAllowedParams($slimRequest->getQueryParams(), [
76  'assignedToCategory',
77  'assignedToSection',
78  'assignedToSubmission',
79  'assignedToSubmissionStage',
80  'count',
81  'offset',
82  'orderBy',
83  'orderDirection',
84  'roleIds',
85  'searchPhrase',
86  'status',
87  ]);
88 
89  $params['contextId'] = $context->getId();
90 
91  \HookRegistry::call('API::users::params', [&$params, $slimRequest]);
92 
93  $items = [];
94  $usersItereator = Services::get('user')->getMany($params);
95  if (count($usersItereator)) {
96  $propertyArgs = [
97  'request' => $request,
98  'slimRequest' => $slimRequest,
99  ];
100  foreach ($usersItereator as $user) {
101  $items[] = Services::get('user')->getSummaryProperties($user, $propertyArgs);
102  }
103  }
104 
105  $data = [
106  'itemsMax' => Services::get('user')->getMax($params),
107  'items' => $items,
108  ];
109 
110  return $response->withJson($data, 200);
111  }
112 
121  public function get($slimRequest, $response, $args) {
122  $request = $this->getRequest();
123 
124  if (!empty($args['userId'])) {
125  $user = Services::get('user')->get((int) $args['userId']);
126  }
127 
128  if (!$user) {
129  return $response->withStatus(404)->withJsonError('api.404.resourceNotFound');
130  }
131 
132  $data = Services::get('user')->getFullProperties($user, array(
133  'request' => $request,
134  'slimRequest' => $slimRequest
135  ));
136 
137  return $response->withJson($data, 200);
138  }
139 
148  public function getReviewers($slimRequest, $response, $args) {
149  $request = $this->getRequest();
150  $context = $request->getContext();
151 
152  if (!$context) {
153  return $response->withStatus(404)->withJsonError('api.404.resourceNotFound');
154  }
155 
156  $params = $this->_processAllowedParams($slimRequest->getQueryParams(), [
157  'averageCompletion',
158  'count',
159  'daysSinceLastAssignment',
160  'offset',
161  'orderBy',
162  'orderDirection',
163  'reviewerRating',
164  'reviewsActive',
165  'reviewsCompleted',
166  'reviewStage',
167  'searchPhrase',
168  'status',
169  ]);
170 
171  $params['contextId'] = $context->getId();
172 
173  \HookRegistry::call('API::users::reviewers::params', array(&$params, $slimRequest));
174 
175  $items = [];
176  $usersIterator = Services::get('user')->getReviewers($params);
177  if (count($usersIterator)) {
178  $propertyArgs = [
179  'request' => $request,
180  'slimRequest' => $slimRequest,
181  ];
182  foreach ($usersIterator as $user) {
183  $items[] = Services::get('user')->getReviewerSummaryProperties($user, $propertyArgs);
184  }
185  }
186 
187  $data = array(
188  'itemsMax' => Services::get('user')->getReviewersMax($params),
189  'items' => $items,
190  );
191 
192  return $response->withJson($data, 200);
193  }
194 
203  private function _processAllowedparams($params, $allowedKeys) {
204 
205  // Merge query params over default params
206  $defaultParams = [
207  'count' => 20,
208  'offset' => 0,
209  ];
210 
211  $requestParams = array_merge($defaultParams, $params);
212 
213  // Process query params to format incoming data as needed
214  $returnParams = [];
215  foreach ($requestParams as $param => $val) {
216  if (!in_array($param, $allowedKeys)) {
217  continue;
218  }
219  switch ($param) {
220  case 'orderBy':
221  if (in_array($val, ['id', 'familyName', 'givenName'])) {
222  $returnParams[$param] = $val;
223  }
224  break;
225 
226  case 'orderDirection':
227  $returnParams[$param] = $val === 'ASC' ? $val : 'DESC';
228  break;
229 
230  case 'status':
231  if (in_array($val, ['all', 'active', 'disabled'])) {
232  $returnParams[$param] = $val;
233  }
234  break;
235 
236  // Always convert roleIds to array
237  case 'roleIds':
238  if (is_string($val) && strpos($val, ',') > -1) {
239  $val = explode(',', $val);
240  } elseif (!is_array($val)) {
241  $val = [$val];
242  }
243  $returnParams[$param] = array_map('intval', $val);
244  break;
245  case 'assignedToCategory':
246  case 'assignedToSection':
247  case 'assignedToSubmissionStage':
248  case 'assignedToSubmission':
249  case 'reviewerRating':
250  case 'reviewStage':
251  case 'offset':
252  $returnParams[$param] = (int) $val;
253  break;
254 
255  case 'searchPhrase':
256  $returnParams[$param] = trim($val);
257  break;
258 
259  case 'reviewsCompleted':
260  case 'reviewsActive':
261  case 'daysSinceLastAssignment':
262  case 'averageCompletion':
263  if (is_array($val)) {
264  $val = array_map('intval', $val);
265  } elseif (strpos($val, '-') !== false) {
266  $val = array_map('intval', explode('-', $val));
267  } else {
268  $val = [(int) $val];
269  }
270  $returnParams[$param] = $val;
271  break;
272 
273  // Enforce a maximum count per request
274  case 'count':
275  $returnParams[$param] = min(100, (int) $val);
276  break;
277  }
278  }
279 
280  return $returnParams;
281  }
282 }
PKPUserHandler\getMany
getMany($slimRequest, $response, $args)
Definition: api/v1/users/PKPUserHandler.inc.php:67
ContextAccessPolicy
Class to control access to PKP applications' setup components.
Definition: ContextAccessPolicy.inc.php:17
PKPUserHandler
Base class to handle API requests for user operations.
Definition: api/v1/users/PKPUserHandler.inc.php:20
PKPUserHandler\getReviewers
getReviewers($slimRequest, $response, $args)
Definition: api/v1/users/PKPUserHandler.inc.php:148
APIHandler
Base request API handler.
Definition: APIHandler.inc.php:22
PKPUserHandler\__construct
__construct()
Definition: api/v1/users/PKPUserHandler.inc.php:25
PKPUserHandler\authorize
authorize($request, &$args, $roleAssignments)
Definition: api/v1/users/PKPUserHandler.inc.php:53
APIHandler\getRequest
getRequest()
Definition: APIHandler.inc.php:149
PKPHandler\addPolicy
addPolicy($authorizationPolicy, $addToTop=false)
Definition: PKPHandler.inc.php:157
APIHandler\getEndpointPattern
getEndpointPattern()
Definition: APIHandler.inc.php:186
HookRegistry\call
static call($hookName, $args=null)
Definition: HookRegistry.inc.php:86
PKPServices\get
static get($service)
Definition: PKPServices.inc.php:49