From 6a1fedda478b29cc9b31228beffa659f4b47b1ac Mon Sep 17 00:00:00 2001 From: Taslan Graham Date: Thu, 23 Jan 2025 21:03:38 -0500 Subject: [PATCH] pkp/pkp-lib#10759 Update put-codes for reviews previously deposited to ORCiD --- classes/orcid/actions/SendReviewToOrcid.php | 10 ++ jobs/orcid/ReconcileOrcidReviewPutCode.php | 123 ++++++++++++++++++++ 2 files changed, 133 insertions(+) create mode 100644 jobs/orcid/ReconcileOrcidReviewPutCode.php diff --git a/classes/orcid/actions/SendReviewToOrcid.php b/classes/orcid/actions/SendReviewToOrcid.php index bb9b5a5c7fa..16c8b702fb3 100644 --- a/classes/orcid/actions/SendReviewToOrcid.php +++ b/classes/orcid/actions/SendReviewToOrcid.php @@ -14,7 +14,9 @@ namespace APP\orcid\actions; +use APP\facades\Repo; use APP\jobs\orcid\DepositOrcidReview; +use APP\jobs\orcid\ReconcileOrcidReviewPutCode; use PKP\orcid\actions\PKPSendReviewToOrcid; class SendReviewToOrcid extends PKPSendReviewToOrcid @@ -22,6 +24,14 @@ class SendReviewToOrcid extends PKPSendReviewToOrcid /** @inheritDoc */ public function execute(): void { + $review = Repo::reviewAssignment()->get($this->reviewAssignmentId); + $reviewer = $review ? Repo::user()->get($review->getReviewerId()) : null; + + if ($reviewer && $reviewer->getData('orcidReviewPutCode')) { + $context = app()->get('context')->get(Repo::submission()->get($review->getSubmissionId())->getData('contextId')); + dispatch(new ReconcileOrcidReviewPutCode($reviewer->getId(), $context->getId())); + } + dispatch(new DepositOrcidReview($this->reviewAssignmentId)); } } diff --git a/jobs/orcid/ReconcileOrcidReviewPutCode.php b/jobs/orcid/ReconcileOrcidReviewPutCode.php new file mode 100644 index 00000000000..57c17f5b0c0 --- /dev/null +++ b/jobs/orcid/ReconcileOrcidReviewPutCode.php @@ -0,0 +1,123 @@ +get($this->reviewerId); /** @var User $reviewer */ + + if (!$reviewer || !$reviewer->getData('orcidReviewPutCode')) { + return; + } + + if ($reviewer->getOrcid() && $reviewer->getData('orcidAccessToken')) { + $orcidAccessExpiresOn = Carbon::parse($reviewer->getData('orcidAccessExpiresOn')); + if ($orcidAccessExpiresOn->isFuture()) { + $context = app()->get('context')->get($this->contextId);/** @var Context $context */ + + OrcidManager::logInfo('Attempting to update put-codes for reviewer ' . $reviewer->getId()); + + $orcid = basename(parse_url($reviewer->getOrcid(), PHP_URL_PATH)); + $uri = OrcidManager::getApiPath($context) . OrcidManager::ORCID_API_VERSION_URL . $orcid . '/' . OrcidManager::ORCID_ALL_REVIEWS_URL; + + $headers = [ + 'Content-Type' => 'application/vnd.orcid+json; qs=4', + 'Accept' => 'application/json', + 'Authorization' => 'Bearer ' . $reviewer->getData('orcidAccessToken') + ]; + + $httpClient = Application::get()->getHttpClient(); + + try { + // Get all deposited peer reviews for reviewer + $response = $httpClient->request('GET', $uri, ['headers' => $headers]); + $data = json_decode($response->getBody(), true); + $ojsReviews = []; + + foreach ($data['group'] as $dataGroup) { + // Select only peer reviews submitted from OJS + foreach ($dataGroup['peer-review-group'] as $peerReview) { + if ($peerReview['peer-review-summary'][0]['source']['source-client-id']['path'] === $context->getData(OrcidManager::CLIENT_ID)) { + $ojsReviews[] = $peerReview; + } + } + } + + foreach ($ojsReviews as $review) { + $reviewSummary = $review['peer-review-summary'][0]; + $externalIds = $reviewSummary['external-ids']['external-id']; + $putCode = $reviewSummary['put-code']; + $reviewRoundId = 0; + + foreach ($externalIds as $externalId) { + if ($externalId['external-id-type'] === OrcidManager::ORCID_WORK_TYPE_SOURCE_WORK) { + $reviewRoundId = $externalId['external-id-value']; + break; + } + } + + OrcidManager::logInfo("Processing previously deposited review with put-code: {$putCode}, and external-id-value (reviewRoundId) {$reviewRoundId}."); + + // Find review assignment and update put-code + $reviewAssignment = Repo::reviewAssignment() + ->getCollector() + ->filterByContextIds([$this->contextId]) + ->filterByReviewerIds([$reviewer->getId()]) + ->filterByReviewRoundIds([$reviewRoundId]) + ->getMany()->first(); /**@var ReviewAssignment $reviewAssignment * */ + + if ($reviewAssignment) { + $reviewAssignment->setData('orcidReviewPutCode', $putCode); + Repo::reviewAssignment()->edit($reviewAssignment, ['orcidReviewPutCode']); + OrcidManager::logInfo("Successfully updated put-code ({$putCode}) for review assignment with ID {$reviewAssignment->getId()}, reviewRoundId {$reviewRoundId}, and userID {$reviewer->getId()}."); + } else { + OrcidManager::logInfo("Did not find a review assignment for deposited review with put-code {$putCode}, and external-id-value (reviewRoundId) {$reviewRoundId}."); + } + } + + // Remove old put-code from user object + $reviewer->setData('orcidAccessToken', null); + Repo::user()->edit($reviewer, ['orcidAccessToken']); + } catch (ClientException $exception) { + OrcidManager::logError("Failed to update put-codes for reviewer {$reviewer->getId()}. Error: {$exception->getMessage()}"); + } + } + } + } +}