149 lines
5.0 KiB
PHP
149 lines
5.0 KiB
PHP
<?php
|
|
|
|
/**
|
|
* @file api/v1/_dois/BackendDoiHandler.php
|
|
*
|
|
* Copyright (c) 2014-2021 Simon Fraser University
|
|
* Copyright (c) 2003-2021 John Willinsky
|
|
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
|
|
*
|
|
* @class BackendDoiHandler
|
|
*
|
|
* @ingroup api_v1_backend
|
|
*
|
|
* @brief Handle API requests for backend operations.
|
|
*
|
|
*/
|
|
|
|
namespace APP\API\v1\_dois;
|
|
|
|
use APP\facades\Repo;
|
|
use Illuminate\Support\LazyCollection;
|
|
use PKP\core\APIResponse;
|
|
use PKP\db\DAORegistry;
|
|
use PKP\security\Role;
|
|
use Slim\Http\Request as SlimRequest;
|
|
|
|
class BackendDoiHandler extends \PKP\API\v1\_dois\PKPBackendDoiHandler
|
|
{
|
|
/**
|
|
* Constructor
|
|
*/
|
|
public function __construct()
|
|
{
|
|
$this->_handlerPath = '_dois';
|
|
$this->_endpoints = array_merge_recursive($this->_endpoints, [
|
|
'PUT' => [
|
|
[
|
|
'pattern' => $this->getEndpointPattern() . "/issues/{issueId:\d+}",
|
|
'handler' => [$this, 'editIssue'],
|
|
'roles' => [Role::ROLE_ID_MANAGER, Role::ROLE_ID_SITE_ADMIN],
|
|
],
|
|
[
|
|
'pattern' => $this->getEndpointPattern() . "/galleys/{galleyId:\d+}",
|
|
'handler' => [$this, 'editGalley'],
|
|
'roles' => [Role::ROLE_ID_MANAGER, Role::ROLE_ID_SITE_ADMIN],
|
|
]
|
|
]
|
|
]);
|
|
parent::__construct();
|
|
}
|
|
|
|
/**
|
|
* Edit galley to add DOI
|
|
*
|
|
* @throws \Exception
|
|
*/
|
|
public function editGalley(SlimRequest $slimRequest, APIResponse $response, array $args): \Slim\Http\Response
|
|
{
|
|
$request = $this->getRequest();
|
|
$context = $request->getContext();
|
|
|
|
$galley = Repo::galley()->get((int)$args['galleyId']);
|
|
if (!$galley) {
|
|
return $response->withStatus(404)->withJsonError('api.404.resourceNotFound');
|
|
}
|
|
|
|
$publicationId = $galley->getData('publicationId');
|
|
$publication = Repo::publication()->get((int)$publicationId);
|
|
$submissionId = $publication->getData('submissionId');
|
|
$submission = Repo::submission()->get((int) $submissionId);
|
|
|
|
if ($submission->getData('contextId') !== $context->getId()) {
|
|
return $response->withStatus(403)->withJsonError('api.dois.403.editItemOutOfContext');
|
|
}
|
|
|
|
$params = $this->convertStringsToSchema(\PKP\services\PKPSchemaService::SCHEMA_GALLEY, $slimRequest->getParsedBody());
|
|
|
|
$doi = Repo::doi()->get((int) $params['doiId']);
|
|
if (!$doi) {
|
|
return $response->withStatus(404)->withJsonError('api.dois.404.doiNotFound');
|
|
}
|
|
|
|
Repo::galley()->edit($galley, ['doiId' => $doi->getId()]);
|
|
|
|
/** @var \PKP\submission\GenreDAO $genreDao */
|
|
$genreDao = DAORegistry::getDAO('GenreDAO');
|
|
$genres = $genreDao->getByContextId($context->getId())->toArray();
|
|
// Re-fetch submission and publication to reflect changes in galley
|
|
$submission = Repo::submission()->get((int) $submissionId);
|
|
$publication = Repo::publication()->get((int) $publicationId);
|
|
$galley = Repo::galley()->get($galley->getId());
|
|
|
|
$galleyProps = Repo::galley()->getSchemaMap($submission, $publication, $genres)->map($galley);
|
|
|
|
return $response->withJson($galleyProps, 200);
|
|
}
|
|
|
|
/**
|
|
* Edit issue to add DOI
|
|
*
|
|
* @throws \Exception
|
|
*/
|
|
public function editIssue(SlimRequest $slimRequest, APIResponse $response, array $args): \Slim\Http\Response
|
|
{
|
|
$request = $this->getRequest();
|
|
$context = $request->getContext();
|
|
|
|
$issue = Repo::issue()->get($args['issueId']);
|
|
if (!$issue) {
|
|
return $response->withStatus(404)->withJsonError('api.404.resourceNotFound');
|
|
}
|
|
|
|
if ($issue->getData('journalId') !== $context->getId()) {
|
|
return $response->withStatus(403)->withJsonError('api.dois.403.editItemOutOfContext');
|
|
}
|
|
|
|
$params = $this->convertStringsToSchema(\PKP\services\PKPSchemaService::SCHEMA_ISSUE, $slimRequest->getParsedBody());
|
|
|
|
$doi = Repo::doi()->get((int) $params['doiId']);
|
|
if (!$doi) {
|
|
return $response->withStatus(404)->withJsonError('api.dois.404.doiNotFound');
|
|
}
|
|
|
|
Repo::issue()->edit($issue, ['doiId' => $doi->getId()]);
|
|
$issue = Repo::issue()->get($issue->getId());
|
|
|
|
return $response->withJson(Repo::issue()->getSchemaMap()->map(
|
|
$issue,
|
|
$context,
|
|
$this->getUserGroups($context->getId()),
|
|
$this->getGenres($context->getId())
|
|
), 200);
|
|
}
|
|
|
|
protected function getUserGroups(int $contextId): LazyCollection
|
|
{
|
|
return Repo::userGroup()->getCollector()
|
|
->filterByContextIds([$contextId])
|
|
->getMany();
|
|
}
|
|
|
|
protected function getGenres(int $contextId): array
|
|
{
|
|
/** @var \PKP\submission\GenreDAO $genreDao */
|
|
$genreDao = DAORegistry::getDAO('GenreDAO');
|
|
return $genreDao->getByContextId($contextId)->toArray();
|
|
}
|
|
}
|