From 241b04488167b9d5db9143fe34f4dae44452d4c1 Mon Sep 17 00:00:00 2001 From: Taslan Graham Date: Thu, 10 Oct 2024 11:21:30 -0500 Subject: [PATCH] pkp/pkp-lib#10336 Expose additional publication forms via API --- api/v1/submissions/SubmissionController.php | 160 ++++++++++++++++++++ api/v1/submissions/index.php | 2 +- 2 files changed, 161 insertions(+), 1 deletion(-) create mode 100644 api/v1/submissions/SubmissionController.php diff --git a/api/v1/submissions/SubmissionController.php b/api/v1/submissions/SubmissionController.php new file mode 100644 index 00000000000..1b9c635172c --- /dev/null +++ b/api/v1/submissions/SubmissionController.php @@ -0,0 +1,160 @@ +requiresSubmissionAccess, 'getAudienceForm', 'getCatalogEntryForm', 'getPublicationDatesForm'); + } + + /** + * @copydoc \PKP\core\PKPBaseController::getGroupRoutes() + */ + public function getGroupRoutes(): void + { + parent::getGroupRoutes(); + + Route::middleware([ + self::roleAuthorizer([Role::ROLE_ID_SUB_EDITOR, Role::ROLE_ID_MANAGER, Role::ROLE_ID_SITE_ADMIN, Role::ROLE_ID_ASSISTANT]), + ])->group(function () { + Route::prefix('{submissionId}/publications/{publicationId}/_components')->group(function () { + Route::get('audience', $this->getAudienceForm(...))->name('submission.publication._components.audience'); + Route::get('catalogEntry', $this->getCatalogEntryForm(...))->name('submission.publication._components.catalogEntry'); + Route::get('publicationDates', $this->getPublicationDatesForm(...))->name('submission.publication._components.publicationDates'); + Route::get('permissionDisclosure', $this->getPublicationLicenseForm(...))->name('submission.publication._components.permissionDisclosure'); + })->whereNumber(['submissionId', 'publicationId']); + }); + } + + /** + * Get AudienceForm form component + */ + protected function getAudienceForm(Request $illuminateRequest): JsonResponse + { + $data = $this->getSubmissionAndPublicationData($illuminateRequest); + + if (isset($data['error'])) { + return response()->json(['error' => $data['error']], $data['status']); + } + + $request = $this->getRequest(); + $submission = $data['submission']; /** @var Submission $submission */ + $context = $data['context']; /** @var Context $context */ + + $submissionApiUrl = $request->getDispatcher()->url($request, PKPApplication::ROUTE_API, $context->getData('urlPath'), 'submissions/' . $submission->getId()); + $audienceForm = new AudienceForm($submissionApiUrl, $submission); + + return response()->json($audienceForm->getConfig(), Response::HTTP_OK); + } + + + /** + * Get CatalogEntryForm form component + */ + protected function getCatalogEntryForm(Request $illuminateRequest): JsonResponse + { + $data = $this->getSubmissionAndPublicationData($illuminateRequest); + + if (isset($data['error'])) { + return response()->json(['error' => $data['error']], $data['status']); + } + + $request = $this->getRequest(); + + $submission = $data['submission']; /** @var Submission $submission */ + $publication = $data['publication']; /** @var Publication $publication */ + $context = $data['context']; /** @var Context $context */ + $locales = $this->getPublicationFormLocales($context, $submission); + $publicationApiUrl = $data['publicationApiUrl']; /** @var String $publicationApiUrl */ + $temporaryFileApiUrl = $request->getDispatcher()->url($request, PKPApplication::ROUTE_API, $context->getData('urlPath'), 'temporaryFiles'); + + $publicFileManager = new PublicFileManager(); + $baseUrl = $request->getBaseUrl() . '/' . $publicFileManager->getContextFilesPath($context->getId()); + + $catalogEntryForm = new CatalogEntryForm($publicationApiUrl, $locales, $publication, $submission, $baseUrl, $temporaryFileApiUrl); + $submissionLocale = $submission->getData('locale'); + + return response()->json($this->getLocalizedForm($catalogEntryForm, $submissionLocale, $locales), Response::HTTP_OK); + } + + /** + * Get PublicationDatesForm form component + */ + protected function getPublicationDatesForm(Request $illuminateRequest): JsonResponse + { + $data = $this->getSubmissionAndPublicationData($illuminateRequest); + + if (isset($data['error'])) { + return response()->json(['error' => $data['error']], $data['status']); + } + + $request = $this->getRequest(); + + $submission = $data['submission']; /** @var Submission $submission */ + $context = $data['context']; /** @var Context $context */ + $submissionApiUrl = $request->getDispatcher()->url($request, PKPApplication::ROUTE_API, $context->getData('urlPath'), 'submissions/' . $submission->getId()); + + $publicationDatesForm = new PublicationDatesForm($submissionApiUrl, $submission); + + return response()->json($publicationDatesForm->getConfig()); + } + + /** + * Get PublicationLicenseForm form component + */ + protected function getPublicationLicenseForm(Request $illuminateRequest): JsonResponse + { + $data = $this->getSubmissionAndPublicationData($illuminateRequest); + + if (isset($data['error'])) { + return response()->json(['error' => $data['error']], $data['status']); + } + + $submission = $data['submission']; /** @var Submission $submission */ + $context = $data['context']; /** @var Context $context */ + $publication = $data['publication']; /** @var Publication $publication */ + $publicationApiUrl = $data['publicationApiUrl']; /** @var String $publicationApiUrl */ + + $locales = $this->getPublicationFormLocales($context, $submission); + $authorUserGroups = Repo::userGroup()->getByRoleIds([Role::ROLE_ID_AUTHOR], $submission->getData('contextId')); + + $publicationLicenseForm = new PublicationLicenseForm($publicationApiUrl, $locales, $publication, $context, $authorUserGroups); + $submissionLocale = $submission->getData('locale'); + + return response()->json($this->getLocalizedForm($publicationLicenseForm, $submissionLocale, $locales), Response::HTTP_OK); + } +} diff --git a/api/v1/submissions/index.php b/api/v1/submissions/index.php index 414792abbb9..1fbf71000ff 100644 --- a/api/v1/submissions/index.php +++ b/api/v1/submissions/index.php @@ -24,5 +24,5 @@ if (strpos($requestPath, '/files')) { return new \PKP\handler\APIHandler(new \PKP\API\v1\submissions\PKPSubmissionFileController()); } else { - return new \PKP\handler\APIHandler(new \PKP\API\v1\submissions\PKPSubmissionController()); + return new \PKP\handler\APIHandler(new \APP\API\v1\submissions\SubmissionController()); }