The libraries interlibrary loan form module
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

216 lines
6.2 KiB

<?php
/**
* @file
* Contains helper functions for working with Relais requests.
*/
/**
* Clean the form content before sending it to relais or logging it.
*
* @param $value
* @param $key
*/
use Drupal\Component\Utility\Html;
/**
* Lookup the user via a simple verification endpoint and verify the surname matches.
*
* Makes an HTTP GET to the configured URL (e.g., https://ill.libraryupei.ca/verify_eg_user.php)
* with a `userid` query parameter, and compares the returned `family_name`.
*
* @param string $user_id
* The Evergreen user ID.
* @param string $surname
* The surname to check against.
*
* @return bool
* TRUE if the surname matches, FALSE otherwise.
*/
function upei_roblib_ill_authenticate($user_id, $surname): bool
{
if (empty($user_id) || empty($surname)) {
return FALSE;
}
$config = \Drupal::config('upei_roblib_ill.settings');
// Use the configured URL, falling back to the custom one if not set accurately.
$evergreen_api_url = $config->get('evergreen_api_url');
if (empty($evergreen_api_url)) {
$evergreen_api_url = 'https://ill.libraryupei.ca/verify_eg_user.php';
}
try {
$response = \Drupal::httpClient()->get($evergreen_api_url, [
'timeout' => 10,
'query' => [
'userid' => $user_id,
],
]);
$data = json_decode((string)$response->getBody(), TRUE);
if (!empty($data['error'])) {
\Drupal::logger('upei_roblib_ill')->warning('Evergreen REST API returned error for user ID @user_id: @error', [
'@user_id' => $user_id,
'@error' => $data['error'],
]);
return FALSE;
}
$evergreen_surname = $data['family_name'] ?? '';
// Case-insensitive comparison of the Evergreen surname and provided surname.
if (strcasecmp(trim($evergreen_surname), trim($surname)) === 0) {
return TRUE;
}
\Drupal::logger('upei_roblib_ill')->warning('Evergreen authentication failed for user ID @user_id. Expected surname: @surname, got: @evergreen_surname', [
'@user_id' => $user_id,
'@surname' => $surname,
'@evergreen_surname' => $evergreen_surname,
]);
return FALSE;
}
catch (\Exception $e) {
\Drupal::logger('upei_roblib_ill')->error('Failed to connect to Evergreen REST API: @message', [
'@message' => $e->getMessage(),
]);
return FALSE;
}
}
/**
* Allows us to ask for _REQUEST variables that may or may not exist without
* generating a php warning. Also does some formatting for certain variables.
*
* @param string $variable
* The name of the $_REQUEST variable to check
*
* @return string
* The value of the $_REQUEST variable or an empty string.
*/
function upei_roblib_ill_get_request_variable($variable)
{
if ($variable == 'author' && empty($_REQUEST[$variable])) {
//google scholar usually sends auinit aulast instead of author
$initial = isset($_REQUEST['auinit']) ?Html::escape($_REQUEST['auinit']) : NULL;
$last_name = isset($_REQUEST['aulast']) ?Html::escape($_REQUEST['aulast']) : NULL;
return !empty($last_name) ? $last_name . ',' . $initial : '';
}
if ($variable == 'issn' && !empty($_REQUEST[$variable])) {
// ebsco sometimes sends garbage as issns verify this is a valid issn before displaying the value in the form.
return preg_match('/^\d{4}-?\d{3}[\dxX]$/', $_REQUEST[$variable]) ?Html::escape($_REQUEST[$variable]) : '';
}
// ebsco sometimes returns bookitem we only understand chapter
if (($variable == 'genre' && !empty($_REQUEST[$variable])) && $_REQUEST[$variable] == 'bookitem') {
return 'chapter';
}
return isset($_REQUEST[$variable]) ?Html::escape($_REQUEST[$variable]) : '';
}
function upei_roblib_ill_get_doi_from_request()
{
return (!empty($_REQUEST['doi'])) ? $_REQUEST['doi'] : upei_roblib_ill_get_doi_from_id();
}
function upei_roblib_ill_get_doi_from_id()
{
if (!empty($_REQUEST['ID'])) {
return (strpos($_REQUEST['ID'], 'doi:') !== 0) ? '' : $_REQUEST['ID'];
}
return '';
}
/**
* Removes empty elements and drupal specific elements from an array
*
* @param $values
* A drupal form_state['values] array
*
* @return array
* An array where the keys in the array that have empty values are removed and
* drupal specific elements are removed.
*/
function upei_roblib_ill_clean_array($values)
{
$arr = array_filter($values);
if (isset($arr['ISSN'])) {
$arr['ISSN'] = [$arr['ISSN']];
}
if (isset($arr['ISBN'])) {
$arr['ISBN'] = [$arr['ISBN']];
}
// The below checks are due to ebscos habit of sending sending the same info in both atitle and title etc.
if (isset($arr['Genre']) && $arr['Genre'] == 'article' && isset($arr['Author'])) {
// We want ArticleAuthor
unset($arr['Author']);
}
if (isset($arr['Genre']) && $arr['Genre'] == 'book' && isset($arr['ArticleAuthor'])) {
// We want Author
unset($arr['ArticleAuthor']);
}
if (isset($arr['Genre']) && $arr['Genre'] == 'book' && isset($arr['ArticleTitle'])) {
// We want Title only
unset($arr['ArticleTitle']);
}
if (isset($arr['doi'])) {
$arr['AdditionalNumbers'] = $arr['doi'];
}
unset($arr['form_build_id']);
unset($arr['form_token']);
unset($arr['form_id']);
unset($arr['op']);
unset($arr['submit']);
unset($arr['next']);
unset($arr['certify']);
unset($arr['doi']);
unset($arr['doi_button']);
unset($arr['honeypot_time']);
array_walk($arr, 'upei_roblib_ill_check_arr_item');
return $arr;
}
function upei_roblib_ill_check_arr_item(&$value, $key) {
if (is_array($value)) {
array_walk($value, 'upei_roblib_ill_check_arr_item');
}
//else {
// $value = Xss::filter($value);
//}
}
/**
* Creates a summary Table based on the biblio information in the form_state
* array for display
*
* @param $form_state
*
* @return string
*/
function upei_roblib_format_biblio_info($form_state)
{
$values = $form_state->getValues();
$data = upei_roblib_ill_clean_array($values);
$rows = [];
foreach ($data as $key => $value) {
if ($key == 'ISSN' || $key == 'ISBN') {
$value = reset($value);
}
array_push($rows, [$key, $value]);
}
$output = [
'#theme' => 'table',
'#rows' => $rows,
'#prefix' => '<div class=upei-roblib-ill-biblio-info>',
'#suffix' => '</div>',
];
$html_output = \Drupal::service('renderer')->render($output);
return $html_output;
}