Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
224 changes: 224 additions & 0 deletions api/v1/dataCitations/PKPDataCitationController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,224 @@
<?php

/**
* @file api/v1/dataCitations/PKPDataCitationController.php
*
* Copyright (c) 2025 Simon Fraser University
* Copyright (c) 2025 John Willinsky
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
*
* @class PKPDataCitationController
*
* @ingroup api_v1_data_citations
*
* @brief Controller class to handle API requests for data citation operations.
*
*/

namespace pkp\api\v1\dataCitations;

use APP\facades\Repo;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\Route;
use PKP\dataCitation\DataCitation;
use PKP\core\PKPBaseController;
use PKP\core\PKPRequest;
use PKP\plugins\Hook;
use PKP\security\authorization\ContextRequiredPolicy;
use PKP\security\authorization\PolicySet;
use PKP\security\authorization\RoleBasedHandlerOperationPolicy;
use PKP\security\authorization\UserRolesRequiredPolicy;
use PKP\security\Role;
use PKP\services\PKPSchemaService;

class PKPDataCitationController extends PKPBaseController
{
/** @var int The default number of citations to return in one request */
public const DEFAULT_COUNT = 30;

/** @var int The maximum number of citations to return in one request */
public const MAX_COUNT = 100;

/**
* @copydoc \PKP\core\PKPBaseController::getHandlerPath()
*/
public function getHandlerPath(): string
{
return 'dataCitations';
}

/**
* @copydoc \PKP\core\PKPBaseController::getRouteGroupMiddleware()
*/
public function getRouteGroupMiddleware(): array
{
return [
'has.user',
'has.context',
self::roleAuthorizer([
Role::ROLE_ID_MANAGER,
Role::ROLE_ID_SUB_EDITOR,
Role::ROLE_ID_ASSISTANT,
Role::ROLE_ID_AUTHOR,
]),
];
}

/**
* @copydoc \PKP\core\PKPBaseController::getGroupRoutes()
*/
public function getGroupRoutes(): void
{
Route::prefix('publications/{publicationId}')
->whereNumber('publicationId')
->group(function () {
Route::get('', $this->getMany(...))
->name('dataCitation.getMany');

Route::get('{dataCitationId}', $this->get(...))
->name('dataCitation.getDataCitation')
->whereNumber('dataCitationId');

Route::post('', $this->add(...))
->name('dataCitation.add');

Route::put('{dataCitationId}', $this->edit(...))
->name('dataCitation.edit')
->whereNumber('dataCitationId');

Route::delete('{dataCitationId}', $this->delete(...))
->name('dataCitation.delete')
->whereNumber('dataCitationId');
});
}

/**
* @copydoc \PKP\core\PKPBaseController::authorize()
*/
public function authorize(PKPRequest $request, array &$args, array $roleAssignments): bool
{
$this->addPolicy(new UserRolesRequiredPolicy($request), true);

$rolePolicy = new PolicySet(PolicySet::COMBINING_PERMIT_OVERRIDES);

$this->addPolicy(new ContextRequiredPolicy($request));

foreach ($roleAssignments as $role => $operations) {
$rolePolicy->addPolicy(new RoleBasedHandlerOperationPolicy($request, $role, $operations));
}

$this->addPolicy($rolePolicy);

return parent::authorize($request, $args, $roleAssignments);
}

/**
* Get a single data dataCitation.
*/
public function get(Request $illuminateRequest): JsonResponse
{
$announcement = DataCitation::find((int) $illuminateRequest->route('dataCitationId'));

if (!$dataCitation) {
return response()->json([
'error' => __('api.dataCitations.404.dataCitationNotFound')
], Response::HTTP_OK);
}

return response()->json(Repo::dataCitation()->getSchemaMap()->map($dataCitation), Response::HTTP_OK);
}

/**
* Get a collection of data citations.
*
* @hook API::dataCitations::params [[$collector, $illuminateRequest]]
*/
public function getMany(Request $illuminateRequest): JsonResponse
{
$dataCitations = DataCitation::limit(self::DEFAULT_COUNT)->offset(0);

if ($illuminateRequest->route('publicationId')) {
$dataCitations->withPublicationId($illuminateRequest->route('publicationId'));
}

Hook::run('API::dataCitations::params', [$dataCitations, $illuminateRequest]);

return response()->json([
'itemsMax' => $dataCitations->count(),
'items' => Repo::dataCitation()->getSchemaMap()->summarizeMany($dataCitations->get())->values(),
], Response::HTTP_OK);


}

/**
* Add a data citation.
*/
public function add(Request $illuminateRequest): JsonResponse
{
$params = $this->convertStringsToSchema(PKPSchemaService::SCHEMA_DATA_CITATION, $illuminateRequest->input());
$params['publicationId'] = (int) $illuminateRequest->route('publicationId');

$errors = Repo::dataCitation()->validate(null, $params);
if (!empty($errors)) {
return response()->json($errors, Response::HTTP_BAD_REQUEST);
}

$dataCitation = DataCitation::create($params);

return response()->json(Repo::dataCitation()->getSchemaMap()->map($dataCitation), Response::HTTP_OK);
}

/**
* Edit a data citation.
*/
public function edit(Request $illuminateRequest): JsonResponse
{
$dataCitation = DataCitation::find((int)$illuminateRequest->route('dataCitationId'));

if (!$dataCitation) {
return response()->json([
'error' => __('api.dataCitations.404.dataCitationNotFound'),
], Response::HTTP_NOT_FOUND);
}

$params = $this->convertStringsToSchema(PKPSchemaService::SCHEMA_DATA_CITATION, $illuminateRequest->input());
$params['id'] = $dataCitation->id;

$errors = Repo::dataCitation()->validate($dataCitation, $params);
if (!empty($errors)) {
return response()->json($errors, Response::HTTP_BAD_REQUEST);
}

$dataCitation->update($params);

$dataCitation = DataCitation::find($dataCitation->id);

return response()->json(
Repo::dataCitation()->getSchemaMap()->map($dataCitation), Response::HTTP_OK
);
}

/**
* Delete a data citation.
*/
public function delete(Request $illuminateRequest): JsonResponse
{
$dataCitation = DataCitation::find((int) $illuminateRequest->route('dataCitationId'));

if (!$dataCitation) {
return response()->json([
'error' => __('api.dataCitations.404.dataCitationNotFound')
], Response::HTTP_OK);
}

$dataCitation->delete();

return response()->json(
Repo::dataCitation()->getSchemaMap()->map($dataCitation), Response::HTTP_OK
);
}

}
31 changes: 31 additions & 0 deletions api/v1/submissions/PKPSubmissionController.php
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
use PKP\citation\Citation;
use PKP\citation\enum\CitationProcessingStatus;
use PKP\components\forms\FormComponent;
use PKP\components\forms\publication\PKPDataAvailabilityAndCitationsForm;
use PKP\components\forms\publication\PKPMetadataForm;
use PKP\components\forms\publication\PKPPublicationIdentifiersForm;
use PKP\components\forms\publication\PKPPublicationLicenseForm;
Expand Down Expand Up @@ -120,6 +121,7 @@ class PKPSubmissionController extends PKPBaseController
'editContributor',
'saveContributorsOrder',
'addDecision',
'getPublicationDataAvailabilityAndCitationsForm',
'getPublicationMetadataForm',
'getPublicationIdentifierForm',
'getPublicationLicenseForm',
Expand Down Expand Up @@ -325,6 +327,7 @@ public function getGroupRoutes(): void

Route::prefix('{submissionId}/publications/{publicationId}/_components')->group(function () {
Route::get('metadata', $this->getPublicationMetadataForm(...))->name('submission.publication._components.metadata');
Route::get('dataAvailabilityAndCitation', $this->getPublicationDataAvailabilityAndCitationsForm(...))->name('submission.publication._components.dataCitation');
Route::get('titleAbstract', $this->getPublicationTitleAbstractForm(...))->name('submission.publication._components.titleAbstract');
Route::get('changeLanguageMetadata', $this->getChangeLanguageMetadata(...))->name('submission.publication._components.changeLanguageMetadata');
})->whereNumber(['submissionId', 'publicationId']);
Expand Down Expand Up @@ -424,6 +427,7 @@ public function authorize(PKPRequest $request, array &$args, array $roleAssignme
if (in_array(
$actionName,
[
'getPublicationDataAvailabilityAndCitationsForm',
'getPublicationMetadataForm',
'getPublicationIdentifierForm',
'getPublicationLicenseForm',
Expand Down Expand Up @@ -2040,6 +2044,33 @@ protected function getPublicationMetadataForm(Request $illuminateRequest): JsonR
return response()->json($this->getLocalizedForm($metadataForm, $submissionLocale, $locales), Response::HTTP_OK);
}

/**
* Get Publication Data Citation Form component
*/
protected function getPublicationDataAvailabilityAndCitationsForm(Request $illuminateRequest): JsonResponse
{
$data = $this->getSubmissionAndPublicationData($illuminateRequest);

if (isset($data['error'])) {
return response()->json([ 'error' => $data['error'],], $data['status']);
}

$context = $data['context']; /** @var Context $context*/
$submission = $data['submission']; /** @var Submission $submission */
$publication = $data['publication']; /** @var Publication $publication*/

$publicationApiUrl = $data['publicationApiUrl']; /** @var String $publicationApiUrl*/

$submissionLocale = $submission->getData('locale');
$locales = $this->getPublicationFormLocales($context, $submission);
$dataAvailabilitySetting = (bool) $context->getData('dataAvailability');

$dataAvailabilityAndCitationsForm = new PKPDataAvailabilityAndCitationsForm($publicationApiUrl, $locales, $publication, $dataAvailabilitySetting);

return response()->json($this->getLocalizedForm($dataAvailabilityAndCitationsForm, $submissionLocale, $locales), Response::HTTP_OK);

}

/**
* Get Publication License Form component
*/
Expand Down
13 changes: 13 additions & 0 deletions classes/components/forms/context/PKPMetadataSettingsForm.php
Original file line number Diff line number Diff line change
Expand Up @@ -215,6 +215,19 @@ public function __construct($action, $context)
],
'value' => $context->getData('dataAvailability') ? $context->getData('dataAvailability') : Context::METADATA_DISABLE,
]))
->addField(new FieldMetadataSetting('dataCitations', [
'label' => __('manager.setup.metadata.dataCitations'),
'description' => __('manager.setup.metadata.dataCitations.description'),
'options' => [
['value' => Context::METADATA_ENABLE, 'label' => __('manager.setup.metadata.dataCitations.enable')]
],
'submissionOptions' => [
['value' => Context::METADATA_ENABLE, 'label' => __('manager.setup.metadata.dataCitations.noRequest')],
['value' => Context::METADATA_REQUEST, 'label' => __('manager.setup.metadata.dataCitations.request')],
['value' => Context::METADATA_REQUIRE, 'label' => __('manager.setup.metadata.dataCitations.require')],
],
'value' => $context->getData('dataCitations') ? $context->getData('dataCitations') : Context::METADATA_DISABLE,
]))
->addField(new FieldOptions('submitWithCategories', [
'label' => __('category.category'),
'description' => __('manager.submitWithCategories.description'),
Expand Down
Loading