Open Journal Systems  3.3.0
PKPAnnouncementHandler.inc.php
1 <?php
2 
17 import('lib.pkp.classes.handler.APIHandler');
18 import('classes.core.Services');
19 
21 
25  public function __construct() {
26  $this->_handlerPath = 'announcements';
27  $this->_endpoints = [
28  'GET' => [
29  [
30  'pattern' => $this->getEndpointPattern(),
31  'handler' => [$this, 'getMany'],
32  'roles' => [ROLE_ID_MANAGER],
33  ],
34  [
35  'pattern' => $this->getEndpointPattern() . '/{announcementId}',
36  'handler' => [$this, 'get'],
37  'roles' => [ROLE_ID_MANAGER],
38  ],
39  ],
40  'POST' => [
41  [
42  'pattern' => $this->getEndpointPattern(),
43  'handler' => [$this, 'add'],
44  'roles' => [ROLE_ID_MANAGER],
45  ],
46  ],
47  'PUT' => [
48  [
49  'pattern' => $this->getEndpointPattern() . '/{announcementId}',
50  'handler' => [$this, 'edit'],
51  'roles' => [ROLE_ID_MANAGER],
52  ],
53  ],
54  'DELETE' => array(
55  array(
56  'pattern' => $this->getEndpointPattern() . '/{announcementId}',
57  'handler' => array($this, 'delete'),
58  'roles' => array(ROLE_ID_MANAGER),
59  ),
60  ),
61  ];
62  parent::__construct();
63  }
64 
68  public function authorize($request, &$args, $roleAssignments) {
69  import('lib.pkp.classes.security.authorization.PolicySet');
70  $rolePolicy = new PolicySet(COMBINING_PERMIT_OVERRIDES);
71 
72  import('lib.pkp.classes.security.authorization.RoleBasedHandlerOperationPolicy');
73  foreach ($roleAssignments as $role => $operations) {
74  $rolePolicy->addPolicy(new RoleBasedHandlerOperationPolicy($request, $role, $operations));
75  }
76  $this->addPolicy($rolePolicy);
77 
78  return parent::authorize($request, $args, $roleAssignments);
79  }
80 
88  public function get($slimRequest, $response, $args) {
89 
90  $announcement = Services::get('announcement')->get((int) $args['announcementId']);
91 
92  if (!$announcement) {
93  return $response->withStatus(404)->withJsonError('api.announcements.404.announcementNotFound');
94  }
95 
96  // The assocId in announcements should always point to the contextId
97  if ($announcement->getData('assocId') !== $this->getRequest()->getContext()->getId()) {
98  return $response->withStatus(404)->withJsonError('api.announcements.400.contextsNotMatched');
99  }
100 
101  $props = Services::get('announcement')->getFullProperties(
102  $announcement,
103  [
104  'request' => $this->getRequest(),
105  'announcementContext' => $this->getRequest()->getContext(),
106  ]
107  );
108 
109  return $response->withJson($props, 200);
110  }
111 
119  public function getMany($slimRequest, $response, $args) {
120  $request = Application::get()->getRequest();
121 
122  $params = [
123  'count' => 30,
124  'offset' => 0,
125  ];
126 
127  $requestParams = $slimRequest->getQueryParams();
128 
129  // Process query params to format incoming data as needed
130  foreach ($requestParams as $param => $val) {
131  switch ($param) {
132  case 'contextIds':
133  case 'typeIds':
134  if (is_string($val) && strpos($val, ',') > -1) {
135  $val = explode(',', $val);
136  } elseif (!is_array($val)) {
137  $val = [$val];
138  }
139  $params[$param] = array_map('intval', $val);
140  break;
141  case 'count':
142  case 'offset':
143  $params[$param] = (int) $val;
144  break;
145  case 'searchPhrase':
146  $params[$param] = $val;
147  }
148  }
149 
150  if ($this->getRequest()->getContext()) {
151  $params['contextIds'] = [$this->getRequest()->getContext()->getId()];
152  }
153 
154  \HookRegistry::call('API::submissions::params', array(&$params, $slimRequest));
155 
156  $result = Services::get('announcement')->getMany($params);
157  $items = [];
158  if ($result->valid()) {
159  foreach ($result as $announcement) {
160  $items[] = Services::get('announcement')->getSummaryProperties($announcement, [
161  'request' => $this->getRequest(),
162  'announcementContext' => $this->getRequest()->getContext(),
163  ]);
164  }
165  }
166 
167  return $response->withJson([
168  'itemsMax' => Services::get('announcement')->getMax($params),
169  'items' => $items,
170  ], 200);
171  }
172 
181  public function add($slimRequest, $response, $args) {
182  $request = $this->getRequest();
183 
184  if (!$request->getContext()) {
185  throw new Exception('You can not add an announcement without sending a request to the API endpoint of a particular context.');
186  }
187 
188  $params = $this->convertStringsToSchema(SCHEMA_ANNOUNCEMENT, $slimRequest->getParsedBody());
189  $params['assocType'] = Application::get()->getContextAssocType();
190  $params['assocId'] = $request->getContext()->getId();
191 
192  $primaryLocale = $request->getContext()->getPrimaryLocale();
193  $allowedLocales = $request->getContext()->getSupportedFormLocales();
194  $errors = Services::get('announcement')->validate(VALIDATE_ACTION_ADD, $params, $allowedLocales, $primaryLocale);
195 
196  if (!empty($errors)) {
197  return $response->withStatus(400)->withJson($errors);
198  }
199 
200  $announcement = DAORegistry::getDao('AnnouncementDAO')->newDataObject();
201  $announcement->_data = $params;
202  $announcement = Services::get('announcement')->add($announcement, $request);
203  $announcementProps = Services::get('announcement')->getFullProperties($announcement, [
204  'request' => $request,
205  'announcementContext' => $request->getContext(),
206  ]);
207 
208  return $response->withJson($announcementProps, 200);
209  }
210 
219  public function edit($slimRequest, $response, $args) {
220  $request = $this->getRequest();
221 
222  $announcement = Services::get('announcement')->get((int) $args['announcementId']);
223 
224  if (!$announcement) {
225  return $response->withStatus(404)->withJsonError('api.announcements.404.announcementNotFound');
226  }
227 
228  if ($announcement->getData('assocType') !== Application::get()->getContextAssocType()) {
229  throw new Exception('Announcement has an assocType that did not match the context.');
230  }
231 
232  // Don't allow to edit an announcement from one context from a different context's endpoint
233  if ($request->getContext()->getId() !== $announcement->getData('assocId')) {
234  return $response->withStatus(403)->withJsonError('api.announcements.400.contextsNotMatched');
235  }
236 
237  $params = $this->convertStringsToSchema(SCHEMA_CONTEXT, $slimRequest->getParsedBody());
238  $params['id'] = $announcement->getId();
239 
240  $context = $request->getContext();
241  $primaryLocale = $context->getPrimaryLocale();
242  $allowedLocales = $context->getSupportedFormLocales();
243 
244  $errors = Services::get('announcement')->validate(VALIDATE_ACTION_EDIT, $params, $allowedLocales, $primaryLocale);
245  if (!empty($errors)) {
246  return $response->withStatus(400)->withJson($errors);
247  }
248 
249  $announcement = Services::get('announcement')->edit($announcement, $params, $request);
250 
251  $announcementProps = Services::get('announcement')->getFullProperties($announcement, [
252  'request' => $request,
253  'announcementContext' => $context,
254  ]);
255 
256  return $response->withJson($announcementProps, 200);
257  }
258 
267  public function delete($slimRequest, $response, $args) {
268  $request = $this->getRequest();
269 
270  $announcement = Services::get('announcement')->get((int) $args['announcementId']);
271 
272  if (!$announcement) {
273  return $response->withStatus(404)->withJsonError('api.announcements.404.announcementNotFound');
274  }
275 
276  if ($announcement->getData('assocType') !== Application::get()->getContextAssocType()) {
277  throw new Exception('Announcement has an assocType that did not match the context.');
278  }
279 
280  // Don't allow to delete an announcement from one context from a different context's endpoint
281  if ($request->getContext()->getId() !== $announcement->getData('assocId')) {
282  return $response->withStatus(403)->withJsonError('api.announcements.400.contextsNotMatched');
283  }
284 
285  $announcementProps = Services::get('announcement')->getSummaryProperties($announcement, array(
286  'request' => $request,
287  'announcementContext' => $request->getContext(),
288  ));
289 
290  Services::get('announcement')->delete($announcement);
291 
292  return $response->withJson($announcementProps, 200);
293  }
294 }
PKPAnnouncementHandler\authorize
authorize($request, &$args, $roleAssignments)
Definition: PKPAnnouncementHandler.inc.php:68
PKPAnnouncementHandler\getMany
getMany($slimRequest, $response, $args)
Definition: PKPAnnouncementHandler.inc.php:119
PKPAnnouncementHandler\add
add($slimRequest, $response, $args)
Definition: PKPAnnouncementHandler.inc.php:181
PKPAnnouncementHandler
Handle API requests for announcement operations.
Definition: PKPAnnouncementHandler.inc.php:20
PKPAnnouncementHandler\__construct
__construct()
Definition: PKPAnnouncementHandler.inc.php:25
APIHandler
Base request API handler.
Definition: APIHandler.inc.php:22
APIHandler\convertStringsToSchema
convertStringsToSchema($schema, $params)
Definition: APIHandler.inc.php:281
PKPAnnouncementHandler\edit
edit($slimRequest, $response, $args)
Definition: PKPAnnouncementHandler.inc.php:219
RoleBasedHandlerOperationPolicy
Class to control access to handler operations via role based access control.
Definition: RoleBasedHandlerOperationPolicy.inc.php:18
PKPApplication\get
static get()
Definition: PKPApplication.inc.php:235
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
PolicySet
An ordered list of policies. Policy sets can be added to decision managers like policies....
Definition: PolicySet.inc.php:26
PKPServices\get
static get($service)
Definition: PKPServices.inc.php:49