Open Journal Systems  3.3.0
PKPEmailTemplateHandler.inc.php
1 <?php
15 import('lib.pkp.classes.handler.APIHandler');
16 
21  public function __construct() {
22  $this->_handlerPath = 'emailTemplates';
23  $roles = [ROLE_ID_SITE_ADMIN, ROLE_ID_MANAGER];
24  $this->_endpoints = [
25  'GET' => [
26  [
27  'pattern' => $this->getEndpointPattern(),
28  'handler' => [$this, 'getMany'],
29  'roles' => $roles,
30  ],
31  [
32  'pattern' => $this->getEndpointPattern() . '/{key}',
33  'handler' => [$this, 'get'],
34  'roles' => $roles,
35  ],
36  ],
37  'POST' => [
38  [
39  'pattern' => $this->getEndpointPattern(),
40  'handler' => [$this, 'add'],
41  'roles' => $roles,
42  ],
43  ],
44  'PUT' => [
45  [
46  'pattern' => $this->getEndpointPattern() . '/{key}',
47  'handler' => [$this, 'edit'],
48  'roles' => $roles,
49  ],
50  ],
51  'DELETE' => [
52  [
53  'pattern' => $this->getEndpointPattern() . '/restoreDefaults',
54  'handler' => [$this, 'restoreDefaults'],
55  'roles' => $roles,
56  ],
57  [
58  'pattern' => $this->getEndpointPattern() . '/{key}',
59  'handler' => [$this, 'delete'],
60  'roles' => $roles,
61  ],
62  ],
63  ];
64  parent::__construct();
65  }
66 
70  public function authorize($request, &$args, $roleAssignments) {
71  import('lib.pkp.classes.security.authorization.PolicySet');
72  $rolePolicy = new PolicySet(COMBINING_PERMIT_OVERRIDES);
73 
74  // This endpoint is not available at the site-wide level
75  import('lib.pkp.classes.security.authorization.ContextRequiredPolicy');
76  $this->addPolicy(new ContextRequiredPolicy($request));
77 
78  import('lib.pkp.classes.security.authorization.RoleBasedHandlerOperationPolicy');
79  foreach ($roleAssignments as $role => $operations) {
80  $rolePolicy->addPolicy(new RoleBasedHandlerOperationPolicy($request, $role, $operations));
81  }
82  $this->addPolicy($rolePolicy);
83 
84  return parent::authorize($request, $args, $roleAssignments);
85  }
86 
95  public function getMany($slimRequest, $response, $args) {
96  $request = $this->getRequest();
97 
98  $allowedParams = [];
99 
100  // Process query params to format incoming data as needed
101  foreach ($slimRequest->getQueryParams() as $param => $val) {
102  switch ($param) {
103  case 'isCustom':
104  case 'isEnabled':
105  $allowedParams[$param] = (bool) $val;
106  break;
107 
108  case 'fromRoleIds':
109  case 'toRoleIds':
110  case 'stageIds':
111  if (is_string($val) && strpos($val, ',') > -1) {
112  $val = explode(',', $val);
113  } elseif (!is_array($val)) {
114  $val = array($val);
115  }
116  $allowedParams[$param] = array_map('intval', $val);
117  break;
118  case 'searchPhrase':
119  $allowedParams[$param] = trim($val);
120  break;
121  }
122  }
123 
124  \HookRegistry::call('API::emailTemplates::params', array(&$allowedParams, $slimRequest));
125 
126  // Always restrict results to the current context
127  $allowedParams['contextId'] = $request->getContext()->getId();
128 
129  $items = array();
130  $emailTemplatesIterator = Services::get('emailTemplate')->getMany($allowedParams);
131  foreach ($emailTemplatesIterator as $emailTemplate) {
132  $items[] = Services::get('emailTemplate')->getSummaryProperties($emailTemplate, [
133  'slimRequest' => $slimRequest,
134  'request' => $request,
135  'supportedLocales' => $request->getContext()->getData('supportedFormLocales'),
136  ]);
137  }
138 
139  $data = array(
140  'itemsMax' => Services::get('emailTemplate')->getMax($allowedParams),
141  'items' => $items,
142  );
143 
144  return $response->withJson($data, 200);
145  }
146 
156  public function get($slimRequest, $response, $args) {
157  $request = $this->getRequest();
158 
159  $emailTemplate = Services::get('emailTemplate')->getByKey($request->getContext()->getId(), $args['key']);
160 
161  if (!$emailTemplate) {
162  return $response->withStatus(404)->withJsonError('api.emailTemplates.404.templateNotFound');
163  }
164 
165  $data = Services::get('emailTemplate')->getFullProperties($emailTemplate, [
166  'slimRequest' => $slimRequest,
167  'request' => $request,
168  'supportedLocales' => $request->getContext()->getData('supportedFormLocales'),
169  ]);
170 
171  return $response->withJson($data, 200);
172  }
173 
183  public function add($slimRequest, $response, $args) {
184  $request = $this->getRequest();
185  $requestContext = $request->getContext();
186 
187  $params = $this->convertStringsToSchema(SCHEMA_EMAIL_TEMPLATE, $slimRequest->getParsedBody());
188 
189  if (!isset($params['contexId'])) {
190  $params['contextId'] = $requestContext->getId();
191  }
192 
193  $primaryLocale = $requestContext->getData('primaryLocale');
194  $allowedLocales = $requestContext->getData('supportedFormLocales');
195  $errors = Services::get('emailTemplate')->validate(VALIDATE_ACTION_ADD, $params, $allowedLocales, $primaryLocale);
196 
197  if (!empty($errors)) {
198  return $response->withStatus(400)->withJson($errors);
199  }
200 
201  $emailTemplate = Application::getContextDAO()->newDataObject();
202  $emailTemplate->_data = $params;
203  $emailTemplate = Services::get('emailTemplate')->add($emailTemplate, $request);
204 
205  $data = Services::get('emailTemplate')->getFullProperties($emailTemplate, [
206  'slimRequest' => $slimRequest,
207  'request' => $request,
208  'supportedLocales' => $requestContext->getData('supportedFormLocales'),
209  ]);
210 
211  return $response->withJson($data, 200);
212  }
213 
223  public function edit($slimRequest, $response, $args) {
224  $request = $this->getRequest();
225  $requestContext = $request->getContext();
226 
227  $emailTemplate = Services::get('emailTemplate')->getByKey($requestContext->getId(), $args['key']);
228 
229  if (!$emailTemplate) {
230  return $response->withStatus(404)->withJsonError('api.emailTemplates.404.templateNotFound');
231  }
232 
233  $params = $this->convertStringsToSchema(SCHEMA_EMAIL_TEMPLATE, $slimRequest->getParsedBody());
234  $params['key'] = $args['key'];
235 
236  // Only allow admins to change the context an email template is attached to.
237  // Set the contextId if it has not been npassed or the user is not an admin
238  $userRoles = $this->getAuthorizedContextObject(ASSOC_TYPE_USER_ROLES);
239  if (isset($params['contextId'])
240  && !in_array(ROLE_ID_SITE_ADMIN, $userRoles)
241  && $params['contextId'] !== $requestContext->getId()) {
242  return $response->withStatus(403)->withJsonError('api.emailTemplates.403.notAllowedChangeContext');
243  } elseif (!isset($params['contextId'])) {
244  $params['contextId'] = $requestContext->getId();
245  }
246 
247  $errors = Services::get('emailTemplate')->validate(
248  VALIDATE_ACTION_EDIT,
249  $params,
250  $requestContext->getData('supportedFormLocales'),
251  $requestContext->getData('primaryLocale')
252  );
253 
254  if (!empty($errors)) {
255  return $response->withStatus(400)->withJson($errors);
256  }
257 
258  $emailTemplate = Services::get('emailTemplate')->edit($emailTemplate, $params, $request);
259 
260  $data = Services::get('emailTemplate')->getFullProperties($emailTemplate, [
261  'slimRequest' => $slimRequest,
262  'request' => $request,
263  'supportedLocales' => $requestContext->getData('supportedFormLocales'),
264  ]);
265 
266  return $response->withJson($data, 200);
267  }
268 
278  public function delete($slimRequest, $response, $args) {
279  $request = $this->getRequest();
280  $requestContext = $request->getContext();
281 
282  $emailTemplate = Services::get('emailTemplate')->getByKey($requestContext->getId(), $args['key']);
283 
284  // Only custom email templates can be deleted, so return 404 if no id exists
285  if (!$emailTemplate || !$emailTemplate->getData('id')) {
286  return $response->withStatus(404)->withJsonError('api.emailTemplates.404.templateNotFound');
287  }
288 
289  $emailTemplateProps = Services::get('emailTemplate')->getFullProperties($emailTemplate, [
290  'slimRequest' => $slimRequest,
291  'request' => $request,
292  'supportedLocales' => $requestContext->getData('supportedFormLocales'),
293  ]);
294 
295  Services::get('emailTemplate')->delete($emailTemplate);
296 
297  return $response->withJson($emailTemplateProps, 200);
298  }
299 
309  public function restoreDefaults($slimRequest, $response, $args) {
310  $contextId = $this->getRequest()->getContext()->getId();
311  $deletedKeys = Services::get('emailTemplate')->restoreDefaults($contextId);
312  return $response->withJson($deletedKeys, 200);
313  }
314 }
Application\getContextDAO
static getContextDAO()
Definition: Application.inc.php:137
PKPEmailTemplateHandler\add
add($slimRequest, $response, $args)
Definition: PKPEmailTemplateHandler.inc.php:183
PKPEmailTemplateHandler\authorize
authorize($request, &$args, $roleAssignments)
Definition: PKPEmailTemplateHandler.inc.php:70
PKPEmailTemplateHandler\edit
edit($slimRequest, $response, $args)
Definition: PKPEmailTemplateHandler.inc.php:223
PKPEmailTemplateHandler
Base class to handle API requests for contexts (journals/presses).
Definition: PKPEmailTemplateHandler.inc.php:17
APIHandler
Base request API handler.
Definition: APIHandler.inc.php:22
PKPEmailTemplateHandler\__construct
__construct()
Definition: PKPEmailTemplateHandler.inc.php:21
PKPHandler\getAuthorizedContextObject
& getAuthorizedContextObject($assocType)
Definition: PKPHandler.inc.php:174
PKPEmailTemplateHandler\getMany
getMany($slimRequest, $response, $args)
Definition: PKPEmailTemplateHandler.inc.php:95
PKPEmailTemplateHandler\restoreDefaults
restoreDefaults($slimRequest, $response, $args)
Definition: PKPEmailTemplateHandler.inc.php:309
APIHandler\convertStringsToSchema
convertStringsToSchema($schema, $params)
Definition: APIHandler.inc.php:281
RoleBasedHandlerOperationPolicy
Class to control access to handler operations via role based access control.
Definition: RoleBasedHandlerOperationPolicy.inc.php:18
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
ContextRequiredPolicy
Policy to deny access if a context cannot be found in the request.
Definition: ContextRequiredPolicy.inc.php:17
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