Skip to content

Commit

Permalink
Merge branch 'notifyTokenExpiration330-736' into 'stable-3_3_0'
Browse files Browse the repository at this point in the history
Notifica administrador quando token está próximo de expirar - 330

See merge request softwares-pkp/plugins_ojs/dataverse!173
  • Loading branch information
JhonathanLepidus committed Jan 17, 2025
2 parents 9a7b6ac + 6504265 commit ab4c615
Show file tree
Hide file tree
Showing 9 changed files with 200 additions and 6 deletions.
8 changes: 8 additions & 0 deletions classes/dispatchers/DataverseEventsDispatcher.inc.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ protected function registerHooks(): void
HookRegistry::register('initiateexternalreviewform::display', array($this, 'addSelectDataFilesForReview'));
HookRegistry::register('initiateexternalreviewform::execute', array($this, 'saveSelectedDataFilesForReview'));
HookRegistry::register('Publication::edit', array($this, 'updateDatasetOnPublicationUpdate'));
HookRegistry::register('AcronPlugin::parseCronTab', [$this, 'addDataverseTasksToCrontab']);
}

public function modifySubmissionSchema(string $hookName, array $params): bool
Expand Down Expand Up @@ -441,4 +442,11 @@ public function setupDataverseHandlers($hookName, $params): bool
}
return false;
}

public function addDataverseTasksToCrontab($hookName, $params)
{
$taskFilesPath = &$params[0];
$taskFilesPath[] = $this->plugin->getPluginPath() . DIRECTORY_SEPARATOR . 'scheduledTasks.xml';
return false;
}
}
86 changes: 86 additions & 0 deletions classes/tasks/NotifyDataverseTokenExpiration.inc.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
<?php

import('lib.pkp.classes.scheduledTask.ScheduledTask');
import('lib.pkp.classes.mail.MailTemplate');
import('plugins.generic.dataverse.dataverseAPI.DataverseClient');

class NotifyDataverseTokenExpiration extends ScheduledTask
{
public function executeActions()
{
$dataverseClient = new DataverseClient();
$tokenExpirationDate = $dataverseClient->getDataverseCollectionActions()->getApiTokenExpirationDate();

if (empty($tokenExpirationDate)) {
return false;
}

$momentsToSendNotification = ['4 weeks', '3 weeks', '2 weeks', '1 week', '1 day'];
$today = date('Y-m-d');

foreach ($momentsToSendNotification as $moment) {
$momentDate = date('Y-m-d', strtotime($tokenExpirationDate . " -$moment"));

if ($today == $momentDate) {
$this->sendNotificationEmail($dataverseClient, $tokenExpirationDate);
break;
}
}

return true;
}

private function sendNotificationEmail($dataverseClient, $tokenExpirationDate)
{
$context = Application::get()->getRequest()->getContext();

$admin = $this->getAdminUser($context->getId());
if (!$admin) {
return;
}

$email = new MailTemplate('DATAVERSE_TOKEN_EXPIRATION', null, $context, false);
$email->setFrom($context->getData('contactEmail'), $context->getData('contactName'));
$email->setRecipients([['name' => $admin->getFullName(), 'email' => $admin->getEmail()]]);

$dataverseCollection = $dataverseClient->getDataverseCollectionActions()->get();
$email->sendWithParams([
'contextName' => $context->getLocalizedName(),
'dataverseName' => $dataverseCollection->getName(),
'keyExpirationDate' => $tokenExpirationDate
]);
}

private function getAdminUser($contextId)
{
$applicationName = Application::get()->getName();
$adminEnAbbrev = ($applicationName == 'ojs2' ? 'jm' : 'psm');

$adminUserGroup = $this->getUserGroupByAbbrev($contextId, $adminEnAbbrev);
if (!$adminUserGroup) {
return null;
}

$adminUsers = Services::get('user')->getMany([
'contextId' => $contextId,
'userGroupIds' => [$adminUserGroup->getId()]
]);

return $adminUsers->current();
}

private function getUserGroupByAbbrev(int $contextId, string $abbrev)
{
$contextUserGroups = DAORegistry::getDAO('UserGroupDAO')->getByContextId($contextId)->toArray();

foreach ($contextUserGroups as $userGroup) {
$userGroupAbbrev = strtolower($userGroup->getData('abbrev', 'en_US'));

if ($userGroupAbbrev === $abbrev) {
return $userGroup;
}
}

return null;
}
}
12 changes: 12 additions & 0 deletions dataverseAPI/actions/DataverseCollectionActions.inc.php
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,18 @@ public function getLicenses(): array
return $dataverseLicenses['data'] ?? [];
}

public function getApiTokenExpirationDate(): string
{
$uri = $this->createNativeAPIURI('users', 'token');
$response = $this->nativeAPIRequest('GET', $uri);
$decodedResponse = json_decode($response->getBody(), true);

$message = $decodedResponse['data']['message'];
preg_match('/expires on (\d{4}-\d{2}-\d{2})/', $message, $matches);

return $matches[1] ?? '';
}

public function publish(): void
{
$uri = $this->getCurrentDataverseURI() . '/actions/:publish';
Expand Down
18 changes: 17 additions & 1 deletion emailTemplates.xml
Original file line number Diff line number Diff line change
Expand Up @@ -11,5 +11,21 @@
-->

<emails>
<email key="DATASET_DELETE_NOTIFICATION" can_edit="1" can_disable="0" subject="emails.datasetDeleteNotification.subject" description="emails.datasetDeleteNotification.description" body="emails.datasetDeleteNotification.body" />
<email
key="DATASET_DELETE_NOTIFICATION"
can_edit="1"
can_disable="0"
subject="emails.datasetDeleteNotification.subject"
description="emails.datasetDeleteNotification.description"
body="emails.datasetDeleteNotification.body"
/>
<email
key="DATAVERSE_TOKEN_EXPIRATION"
can_edit="1"
can_disable="0"
name="emails.dataverseTokenExpiration.name"
description="emails.dataverseTokenExpiration.description"
subject="emails.dataverseTokenExpiration.subject"
body="emails.dataverseTokenExpiration.body"
/>
</emails>
25 changes: 23 additions & 2 deletions locale/en_US/emails.po
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@

msgid "emails.datasetDeleteNotification.subject"
msgstr "Research data delete notification"

Expand All @@ -12,4 +11,26 @@ msgstr ""

msgid "emails.datasetDeleteNotification.description"
msgstr ""
"Email template used to notify the author about the research data deleting."
"Email template used to notify the author about the research data deleting."



msgid "emails.dataverseTokenExpiration.name"
msgstr "Dataverse API Key Expiration"

msgid "emails.dataverseTokenExpiration.description"
msgstr "Email template to notify the administrator about the Dataverse API key expiration"

msgid "emails.dataverseTokenExpiration.subject"
msgstr "Dataverse API Key Expiration"

msgid "emails.dataverseTokenExpiration.body"
msgstr ""
"Dear Administrator of <em>{$contextName}</em><br />\n"
"<br />\n"
"The token that enables integration between <em>{$contextName}</em> and the Dataverse repository <em>{$dataverseName}</em> will expire in {$keyExpirationDate}.<br />\n"
"<br />\n"
"To ensure that the integration between the platforms continues to work correctly, make sure to generate a new token"
" and update it in the Dataverse plugin settings before {$keyExpirationDate}.<br />\n"
"<br />\n"
"If you have any questions, please contact the technical support team that maintains the platforms.<br />\n"
22 changes: 21 additions & 1 deletion locale/es_ES/emails.po
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@

msgid "emails.datasetDeleteNotification.subject"
msgstr "Notificación de eliminación de los datos de investigación"

Expand All @@ -13,3 +12,24 @@ msgstr ""
msgid "emails.datasetDeleteNotification.description"
msgstr ""
"Plantilla de correo electrónico utilizada para notificar al autor sobre la eliminación de los datos de investigación."


msgid "emails.dataverseTokenExpiration.name"
msgstr "Expiración de la clave API de Dataverse"

msgid "emails.dataverseTokenExpiration.description"
msgstr "Plantilla de correo electrónico para notificar al administrador sobre la expiración de la clave API de Dataverse"

msgid "emails.dataverseTokenExpiration.subject"
msgstr "Expiración de la clave API de Dataverse"

msgid "emails.dataverseTokenExpiration.body"
msgstr ""
"Estimado/a administrador/a de <em>{$contextName}</em><br />\n"
"<br />\n"
"El token que permite la integración entre <em>{$contextName}</em> y el repositorio Dataverse <em>{$dataverseName}</em> expirará en {$keyExpirationDate}.<br />\n"
"<br />\n"
"Para garantizar que la integración entre las plataformas siga funcionando correctamente, asegúrese de generar un nuevo token"
" y actualizarlo en la configuración del módulo Dataverse antes de {$keyExpirationDate}.<br />\n"
"<br />\n"
"Si tiene alguna duda, póngase en contacto con el equipo de asistencia técnica que mantiene las plataformas.<br />\n"
21 changes: 21 additions & 0 deletions locale/pt_BR/emails.po
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,24 @@ msgstr ""
msgid "emails.datasetDeleteNotification.description"
msgstr ""
"Modelo de e-mail usado para notificar o autor sobre a exclusão dos dados de pesquisa."


msgid "emails.dataverseTokenExpiration.name"
msgstr "Expiração da Chave de API do Dataverse"

msgid "emails.dataverseTokenExpiration.description"
msgstr "Modelo de e-mail para notificar o(a) administrador(a) sobre a expiração da chave de API do Dataverse"

msgid "emails.dataverseTokenExpiration.subject"
msgstr "Expiração da Chave de API do Dataverse"

msgid "emails.dataverseTokenExpiration.body"
msgstr ""
"Prezado(a) Administrador(a) do <em>{$contextName}</em><br />\n"
"<br />\n"
"O token que possibilita a integração entre o <em>{$contextName}</em> e o repositório Dataverse <em>{$dataverseName}</em> expirará em {$keyExpirationDate}.<br />\n"
"<br />\n"
"Para garantir que a integração entre as plataformas continue funcionando corretamente, certifique-se de gerar um novo token"
" e atualizá-lo nas configurações do plugin Dataverse antes de {$keyExpirationDate}.<br />\n"
"<br />\n"
"Em caso de dúvidas, contate o suporte técnico mantenedor das plataformas.<br />\n"
10 changes: 10 additions & 0 deletions scheduledTasks.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE scheduled_tasks SYSTEM "../../../lib/pkp/dtd/scheduledTasks.dtd">

<scheduled_tasks>
<task class="plugins.generic.dataverse.classes.tasks.NotifyDataverseTokenExpiration">
<descr>Notify the administrator when the Dataverse Token is close to expiration</descr>
<frequency hour="3"/>
</task>
</scheduled_tasks>
4 changes: 2 additions & 2 deletions version.xml
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@
<version>
<application>dataverse</application>
<type>plugins.generic</type>
<release>2.6.2.1</release>
<date>2024-12-26</date>
<release>2.7.0.0</release>
<date>2025-01-17</date>
<lazy-load>1</lazy-load>
<class>DataversePlugin</class>
</version>

0 comments on commit ab4c615

Please sign in to comment.