validate($request, $resource); $user = $this->getUser($request); if (!Authority::canUpdateTask($user, $resource)) { throw new AuthorizationFailedException(); } $resource = $this->updateTask($user, $resource, $json); return $this->getContentResponse($resource); } /** * @SuppressWarnings(PHPMD.UnusedFormalParameters) * @param array $json * @param mixed $data * @return string|void */ protected function validateResourceDocument($json, $data) { if (!self::arrayHas($json, 'data')) { return 'Missing `data` member at document“s top level.'; } if (!self::arrayHas($json, 'data.id')) { return 'Document must have an `id`.'; } if (self::arrayHas($json, 'data.attributes.renewal-date')) { $renewalDate = self::arrayGet($json, 'data.attributes.renewal-date'); if (!self::isValidTimestamp($renewalDate)) { return '`renewal-date` is not an ISO 8601 timestamp.'; } } } private function updateTask(\User $user, Task $resource, array $json): Task { if (Authority::canRenewTask($user, $resource)) { return $this->renewTask($resource, $json); } if (self::arrayGet($json, 'data.attributes.submitted') === true && $resource->canSubmit()) { $resource->submitTask(); } if (self::arrayGet($json, 'data.attributes.renewal') === 'pending') { $resource->requestRenewal(); } if (self::arrayHas($json, 'data.attributes.visible')) { $resource->setVisibility(self::arrayGet($json, 'data.attributes.visible')); } return $resource; } private function renewTask(Task $resource, array $json): Task { switch (self::arrayGet($json, 'data.attributes.renewal')) { case 'declined': $resource->declineRenewalRequest(); break; case 'granted': $resource->grantRenewalRequest( self::fromISO8601(self::arrayGet($json, 'data.attributes.renewal-date')) ); break; } return $resource; } }