Compare commits
10 Commits
| Author | SHA1 | Date |
|---|---|---|
|
|
a6b47a1173 | 1 day ago |
|
|
392f5377fe | 1 week ago |
|
|
9eaf39c6dc | 1 week ago |
|
|
5c1d2b1b02 | 1 week ago |
|
|
a13b7c260e | 1 week ago |
|
|
a441faf8f9 | 1 week ago |
|
|
096d940d61 | 1 week ago |
|
|
ae684455e6 | 1 week ago |
|
|
a232bbf226 | 1 week ago |
|
|
f752780439 | 1 week ago |
12 changed files with 709 additions and 431 deletions
@ -1,13 +1,95 @@
|
||||
# Robertson Library ILL Forms module |
||||
# Robertson Library ILL Forms Module |
||||
|
||||
## Introduction |
||||
|
||||
Standalone module to submit ILL requests to Relais. Can read openurl parameters or lookup data based on a DOI |
||||
This Drupal module provides a front-end Interlibrary Loan (ILL) request form for |
||||
the UPEI Robertson Library. Patrons fill out a two-step form with bibliographic |
||||
information and authentication details, and the request is submitted to |
||||
**RapidILL** for processing. |
||||
|
||||
**Branch guide:** |
||||
|
||||
- `1.x` -- Relais integration (legacy) |
||||
- `3.x` -- RapidILL integration (current) |
||||
|
||||
## How It Works |
||||
|
||||
1. **Step 1 -- Bibliographic Information:** The patron selects a genre |
||||
(article, book, or chapter) and enters citation details. A DOI lookup button |
||||
can auto-populate fields from CrossRef. |
||||
2. **Step 2 -- Patron Authentication:** The patron provides their name, UPEI |
||||
ID, email, department, and patron type. The module verifies the patron |
||||
against the Evergreen ILS REST API by matching the provided surname to the |
||||
`family_name` on file. |
||||
3. **Submission:** On successful authentication the request is sent to RapidILL |
||||
and logged to the `upei_roblib_ill_request` database table. |
||||
4. **Confirmation:** The patron is redirected to a confirmation page with the |
||||
RapidILL request number. |
||||
|
||||
OpenURL parameters and DOIs can be passed in via query string so the form can be |
||||
pre-populated from discovery tools such as EBSCO or Google Scholar. |
||||
|
||||
## Requirements |
||||
|
||||
* Drupal 7 |
||||
- Drupal 9 or 10 |
||||
- An Evergreen ILS instance with the `osrf-gateway-v1` REST API accessible |
||||
- A RapidILL account (username, password, Rapid code, and branch name) |
||||
- A CrossRef OpenURL PID (for DOI lookups) |
||||
|
||||
## Installation |
||||
|
||||
Install as you would any Drupal module. No additional dependencies are required. |
||||
|
||||
## Configuration |
||||
|
||||
Navigate to **Administration > Settings > Roblib ILL** |
||||
(`/admin/settings/roblibill`) and configure the following sections: |
||||
|
||||
### General |
||||
|
||||
| Setting | Description | |
||||
|----------------------|-------------------------------------------------------| |
||||
| ILL Library Symbol | Your Relais/RapidILL library symbol | |
||||
| OpenURL PID | Your CrossRef OpenURL PID for DOI resolution | |
||||
| Contact Email | Email shown on the confirmation page (e.g. ill@upei.ca) | |
||||
| Contact Phone | Phone number shown on the confirmation page | |
||||
|
||||
### Evergreen ILS |
||||
|
||||
| Setting | Description | |
||||
|--------------------------|--------------------------------------------------------------| |
||||
| Evergreen API URL | Base URL of your Evergreen server (e.g. `https://catalogue.example.com`) | |
||||
| Evergreen Staff Username | Staff account used for REST API authentication | |
||||
| Evergreen Staff Password | Password for the staff account | |
||||
|
||||
The module authenticates against Evergreen by calling |
||||
`open-ils.auth.authenticate.init` / `open-ils.auth.authenticate.complete` to |
||||
obtain a session token, then retrieves the patron record with |
||||
`open-ils.actor.user.retrieve` and compares the `family_name` field to the |
||||
surname provided by the user. |
||||
|
||||
### RapidILL |
||||
|
||||
| Setting | Description | |
||||
|----------------------|-------------------------------------------| |
||||
| RapidILL Username | Your RapidILL API username | |
||||
| RapidILL Password | Your RapidILL API password | |
||||
| RapidILL Rapid Code | Your library's Rapid code | |
||||
| RapidILL Branch Name | Your library branch name (e.g. Main) | |
||||
|
||||
## Routes |
||||
|
||||
| Path | Description | |
||||
|---------------------------------|------------------------------| |
||||
| `/admin/settings/roblibill` | Module settings form | |
||||
| `/upei/roblib/ill/{parameters}` | ILL request form | |
||||
| `/upei/roblib/ill/finished` | Post-submission confirmation | |
||||
|
||||
## Views Integration |
||||
|
||||
The module exposes the `upei_roblib_ill_request` table to Drupal Views, so |
||||
administrators can build custom reports and lists of submitted ILL requests. |
||||
|
||||
## Maintainers/Sponsors |
||||
## Maintainers / Sponsors |
||||
|
||||
* UPEI Robertson Library |
||||
- UPEI Robertson Library |
||||
|
||||
@ -0,0 +1,37 @@
|
||||
upei_roblib_ill.settings: |
||||
type: config_object |
||||
label: 'UPEI Roblib ILL settings' |
||||
mapping: |
||||
ill_library_symbol: |
||||
type: string |
||||
label: 'Your ILL Library Symbol' |
||||
ill_doi_openurl_pid: |
||||
type: string |
||||
label: 'OpenURL PID' |
||||
ill_contact_email: |
||||
type: string |
||||
label: 'Contact Email' |
||||
ill_contact_phone: |
||||
type: string |
||||
label: 'Contact Phone Number' |
||||
rapid_ill_username: |
||||
type: string |
||||
label: 'RapidILL Username' |
||||
rapid_ill_password: |
||||
type: string |
||||
label: 'RapidILL Password' |
||||
rapid_ill_code: |
||||
type: string |
||||
label: 'RapidILL Rapid Code' |
||||
rapid_ill_branch_name: |
||||
type: string |
||||
label: 'RapidILL Branch Name' |
||||
evergreen_api_url: |
||||
type: string |
||||
label: 'Evergreen API URL' |
||||
evergreen_username: |
||||
type: string |
||||
label: 'Evergreen Staff Username' |
||||
evergreen_password: |
||||
type: string |
||||
label: 'Evergreen Staff Password' |
||||
@ -1,80 +0,0 @@
|
||||
<?php |
||||
/** |
||||
* @file |
||||
* the administrative form for upei_roblib_ill |
||||
*/ |
||||
|
||||
|
||||
function upei_roblib_ill_admin_form($form, &$form_state) { |
||||
$form = []; |
||||
$form['upei_roblib_ill_add_url'] = [ |
||||
'#required' => TRUE, |
||||
'#type' => 'textfield', |
||||
'#size' => 200, |
||||
'#title' => t('The Relais AddRequest URL'), |
||||
'#description' => t('The URL for the Relais ILL server AddRequest service, the default is |
||||
https://caul-cbua.relais-host.com/portal-service/request/add'), |
||||
'#default_value' => variable_get('upei_roblib_ill_add_url', 'https://caul-cbua.relais-host.com/portal-service/request/add'), |
||||
]; |
||||
$form['upei_roblib_ill_auth_url'] = [ |
||||
'#required' => TRUE, |
||||
'#type' => 'textfield', |
||||
'#size' => 200, |
||||
'#title' => t('The Relais Auth URL'), |
||||
'#description' => t('The URL for the Relais ILL server Auth service (retrieve the aid), the default is |
||||
https://caul-cbua.relais-host.com/portal-service/user/authentication'), |
||||
'#default_value' => variable_get('upei_roblib_ill_auth_url', 'https://caul-cbua.relais-host.com/portal-service/user/authentication'), |
||||
]; |
||||
$form['upei_roblib_ill_library_symbol'] = [ |
||||
'#required' => TRUE, |
||||
'#type' => 'textfield', |
||||
'#size' => 200, |
||||
'#title' => t('Your Relais Library Symbol'), |
||||
'#description' => t('Your Relais Library Symbol'), |
||||
'#default_value' => variable_get('upei_roblib_ill_library_symbol'), |
||||
]; |
||||
|
||||
$form['upei_roblib_ill_relais_key'] = [ |
||||
'#required' => TRUE, |
||||
'#type' => 'textfield', |
||||
'#size' => 200, |
||||
'#title' => t('The Relais API key'), |
||||
'#description' => t('The API key used to communicate with the Relais API, Contact Relais International to get your key'), |
||||
'#default_value' => variable_get('upei_roblib_ill_relais_key'), |
||||
]; |
||||
$form['upei_roblib_ill_doi_openurl_pid'] = [ |
||||
'#required' => TRUE, |
||||
'#type' => 'textfield', |
||||
'#size' => 200, |
||||
'#title' => t('OpenURL PID'), |
||||
'#description' => t('An identifier to call yourself, for the OpenURL endpoint. To use this service you first need to register for an account here: http://www.crossref.org/requestaccount/'), |
||||
'#default_value' => variable_get('upei_roblib_ill_doi_openurl_pid'), |
||||
]; |
||||
$form['upei_roblib_ill_contact_email'] = [ |
||||
'#required' => TRUE, |
||||
'#type' => 'textfield', |
||||
'#size' => 200, |
||||
'#title' => t('Contact Email'), |
||||
'#description' => t('The email address we want to show after a user has submitted an ILL request'), |
||||
'#default_value' => variable_get('upei_roblib_ill_contact_email', 'ill@upei.ca'), |
||||
]; |
||||
$form['upei_roblib_ill_contact_phone'] = [ |
||||
'#required' => TRUE, |
||||
'#type' => 'textfield', |
||||
'#size' => 200, |
||||
'#title' => t('Contact Phone Number'), |
||||
'#description' => t('The phone number we want to show to the user after a user has submitted an ILL request'), |
||||
'#default_value' => variable_get('upei_roblib_ill_contact_phone', '902-566-0445'), |
||||
]; |
||||
$form['upei_roblib_ill_header_message'] = [ |
||||
'#required' => TRUE, |
||||
'#type' => 'textarea', |
||||
'#title' => t('ILL Header Message'), |
||||
'#description' => t('The message that appears at the top of the ILL form, recently used for Covid messages. Leave this blank for no message to appear at the top of the form.'), |
||||
'#default_value' => variable_get('upei_roblib_ill_header_message', ''), |
||||
]; |
||||
|
||||
|
||||
return system_settings_form($form); |
||||
|
||||
} |
||||
@ -0,0 +1,260 @@
|
||||
<?php |
||||
|
||||
/** |
||||
* @file |
||||
* Contains the RapidIllRequestHandler class for submitting ILL requests |
||||
* to RapidILL using the roblib/rapidillrequest package. |
||||
*/ |
||||
|
||||
use Drupal\Core\Form\FormStateInterface; |
||||
use RapidIll\InsertRequest; |
||||
use RapidIll\InsertResponse; |
||||
use RapidIll\RapidIllClient; |
||||
use RapidIll\RapidIllException; |
||||
use RapidIll\RequestType; |
||||
|
||||
/** |
||||
* Handles building and submitting RapidILL requests from the ILL loan form. |
||||
* |
||||
* Usage (from the form submit handler): |
||||
* @code |
||||
* \Drupal::moduleHandler()->loadInclude('upei_roblib_ill', 'inc', 'includes/rapidill'); |
||||
* $handler = new RapidIllRequestHandler(); |
||||
* $response = $handler->submitRequest($form_state); |
||||
* @endcode |
||||
*/ |
||||
class RapidIllRequestHandler { |
||||
|
||||
/** |
||||
* Drupal config object for upei_roblib_ill.settings. |
||||
* |
||||
* @var \Drupal\Core\Config\ImmutableConfig |
||||
*/ |
||||
protected $config; |
||||
|
||||
/** |
||||
* Constructs a new RapidIllRequestHandler. |
||||
*/ |
||||
public function __construct() { |
||||
$this->config = \Drupal::config('upei_roblib_ill.settings'); |
||||
} |
||||
|
||||
/** |
||||
* Maps a form Genre value to a RapidILL RequestType enum. |
||||
* |
||||
* @param string $genre |
||||
* The genre value from the ILL form ('article', 'book', or 'chapter'). |
||||
* |
||||
* @return \RapidIll\RequestType |
||||
* The corresponding RequestType enum value. |
||||
*/ |
||||
public function getRequestType(string $genre): RequestType { |
||||
return match ($genre) { |
||||
'book' => RequestType::Book, |
||||
'chapter' => RequestType::BookChapter, |
||||
default => RequestType::Article, |
||||
}; |
||||
} |
||||
|
||||
/** |
||||
* Builds a RapidILL InsertRequest from the Drupal form state. |
||||
* |
||||
* Reads bibliographic data from form storage (step 1) and patron data |
||||
* from the current form values (step 2). |
||||
* |
||||
* @param \Drupal\Core\Form\FormStateInterface $form_state |
||||
* The current form state containing both steps of the ILL form. |
||||
* |
||||
* @return \RapidIll\InsertRequest |
||||
* A populated InsertRequest ready to be submitted. |
||||
*/ |
||||
public function buildInsertRequest(FormStateInterface $form_state): InsertRequest { |
||||
$storage = $form_state->getStorage(); |
||||
$biblio = $storage['request'] ?? []; |
||||
$patron = $form_state->getValues(); |
||||
|
||||
$genre = $biblio['Genre'] ?? 'article'; |
||||
$request = new InsertRequest(); |
||||
$request->setRequestType($this->getRequestType($genre)); |
||||
|
||||
// -- Bibliographic fields -- |
||||
if (!empty($biblio['Title'])) { |
||||
$request->setJournalTitle($biblio['Title']); |
||||
} |
||||
|
||||
if (!empty($biblio['ArticleTitle'])) { |
||||
$request->setArticleTitle($biblio['ArticleTitle']); |
||||
} |
||||
|
||||
// Use ArticleAuthor for articles/chapters, Author for books. |
||||
$author = ''; |
||||
if ($genre !== 'book' && !empty($biblio['ArticleAuthor'])) { |
||||
$author = $biblio['ArticleAuthor']; |
||||
} |
||||
elseif (!empty($biblio['Author'])) { |
||||
$author = $biblio['Author']; |
||||
} |
||||
if (!empty($author)) { |
||||
$request->setArticleAuthor($author); |
||||
} |
||||
|
||||
if (!empty($biblio['ISSN'])) { |
||||
$issn = is_array($biblio['ISSN']) ? reset($biblio['ISSN']) : $biblio['ISSN']; |
||||
if (!empty($issn)) { |
||||
$request->addIssn($issn); |
||||
} |
||||
} |
||||
|
||||
if (!empty($biblio['ISBN'])) { |
||||
$isbn = is_array($biblio['ISBN']) ? reset($biblio['ISBN']) : $biblio['ISBN']; |
||||
if (!empty($isbn)) { |
||||
$request->addIsbn($isbn); |
||||
} |
||||
} |
||||
|
||||
if (!empty($biblio['Volume'])) { |
||||
$request->setJournalVolume($biblio['Volume']); |
||||
} |
||||
|
||||
if (!empty($biblio['Issue'])) { |
||||
$request->setJournalIssue($biblio['Issue']); |
||||
} |
||||
|
||||
if (!empty($biblio['PagesRequested'])) { |
||||
$request->setArticlePages($biblio['PagesRequested']); |
||||
} |
||||
|
||||
if (!empty($biblio['Date'])) { |
||||
$request->setJournalYear($biblio['Date']); |
||||
} |
||||
|
||||
// -- Patron fields -- |
||||
if (!empty($patron['campus_id'])) { |
||||
$request->setPatronId($patron['campus_id']); |
||||
} |
||||
|
||||
$first_name = $patron['FirstName'] ?? ''; |
||||
$surname = $patron['Surname'] ?? ''; |
||||
$full_name = trim("$first_name $surname"); |
||||
if (!empty($full_name)) { |
||||
$request->setPatronName($full_name); |
||||
} |
||||
|
||||
if (!empty($patron['DeliveryAddress'])) { |
||||
$request->setPatronEmail($patron['DeliveryAddress']); |
||||
} |
||||
|
||||
if (!empty($patron['Department'])) { |
||||
$request->setPatronDepartment($patron['Department']); |
||||
} |
||||
|
||||
// Combine user notes and DOI (if present) into patron notes. |
||||
$notes_parts = []; |
||||
if (!empty($patron['notes'])) { |
||||
$notes_parts[] = $patron['notes']; |
||||
} |
||||
if (!empty($biblio['doi'])) { |
||||
$notes_parts[] = 'DOI: ' . $biblio['doi']; |
||||
} |
||||
if (!empty($notes_parts)) { |
||||
$request->setPatronNotes(implode(' | ', $notes_parts)); |
||||
} |
||||
|
||||
return $request; |
||||
} |
||||
|
||||
/** |
||||
* Creates a RapidIllClient from the module's Drupal configuration. |
||||
* |
||||
* Reads the following config keys from 'upei_roblib_ill.settings': |
||||
* - rapid_ill_username |
||||
* - rapid_ill_password |
||||
* - rapid_ill_code |
||||
* - rapid_ill_branch_name |
||||
* |
||||
* @return \RapidIll\RapidIllClient |
||||
* A configured RapidILL client. |
||||
* |
||||
* @throws \RuntimeException |
||||
* If any required configuration value is missing. |
||||
*/ |
||||
protected function createClient(): RapidIllClient { |
||||
$username = $this->config->get('rapid_ill_username'); |
||||
$password = $this->config->get('rapid_ill_password'); |
||||
$rapid_code = $this->config->get('rapid_ill_code'); |
||||
$branch_name = $this->config->get('rapid_ill_branch_name'); |
||||
|
||||
if (empty($username) || empty($password) || empty($rapid_code) || empty($branch_name)) { |
||||
\Drupal::logger('upei_roblib_ill')->error( |
||||
'RapidILL configuration is incomplete. Please set rapid_ill_username, rapid_ill_password, rapid_ill_code, and rapid_ill_branch_name in the ILL settings.' |
||||
); |
||||
throw new \RuntimeException('RapidILL configuration is incomplete.'); |
||||
} |
||||
|
||||
return new RapidIllClient( |
||||
username: $username, |
||||
password: $password, |
||||
rapidCode: $rapid_code, |
||||
branchName: $branch_name, |
||||
); |
||||
} |
||||
|
||||
/** |
||||
* Builds and submits a RapidILL request from an InsertRequest object. |
||||
* |
||||
* @param \RapidIll\InsertRequest $insert_request |
||||
* The fully built RapidILL request object. |
||||
* |
||||
* @return array |
||||
* An associative array with at least a 'ConfirmMessage' key, and |
||||
* optionally a 'RequestNumber' key on success. |
||||
*/ |
||||
public function submitRequest(InsertRequest $insert_request): array { |
||||
\Drupal::moduleHandler()->loadInclude('upei_roblib_ill', 'inc', 'includes/db'); |
||||
|
||||
try { |
||||
$client = $this->createClient(); |
||||
} |
||||
catch (\RuntimeException $e) { |
||||
$error_response = [ |
||||
'ConfirmMessage' => 'RapidILL is not configured. Please contact the library.', |
||||
]; |
||||
upei_roblib_ill_log_request($insert_request, $error_response); |
||||
return $error_response; |
||||
} |
||||
|
||||
try { |
||||
/** @var \RapidIll\InsertResponse $response */ |
||||
$response = $client->insertRequest($insert_request); |
||||
} |
||||
catch (RapidIllException $e) { |
||||
\Drupal::logger('upei_roblib_ill')->error( |
||||
'RapidILL request failed: @message', |
||||
['@message' => $e->getMessage()] |
||||
); |
||||
$error_response = [ |
||||
'ConfirmMessage' => 'Error communicating with RapidILL: ' . $e->getMessage(), |
||||
]; |
||||
upei_roblib_ill_log_request($insert_request, $error_response); |
||||
return $error_response; |
||||
} |
||||
|
||||
// Build a response array compatible with the existing form redirect. |
||||
if ($response->isSuccessful) { |
||||
$result = [ |
||||
'RequestNumber' => $response->rapidRequestId, |
||||
'ConfirmMessage' => 'Your Interlibrary Loan request has been successfully submitted to RapidILL. Your Rapid Request ID is: ' . $response->rapidRequestId, |
||||
]; |
||||
} |
||||
else { |
||||
$message = $response->verificationNote ?? 'Unknown error from RapidILL.'; |
||||
$result = [ |
||||
'ConfirmMessage' => 'RapidILL could not process your request: ' . $message, |
||||
]; |
||||
} |
||||
|
||||
upei_roblib_ill_log_request($insert_request, $result); |
||||
return $result; |
||||
} |
||||
|
||||
} |
||||
@ -1,167 +0,0 @@
|
||||
<?php |
||||
/** |
||||
* @file |
||||
* Contains the functions to send and receive data to/from Relais. |
||||
*/ |
||||
|
||||
use Drupal\Core\Url; |
||||
use Drupal\Core\Link; |
||||
|
||||
function upei_roblib_ill_get_pub_type($genre) { |
||||
switch ($genre) { |
||||
case 'book' : |
||||
return 'B'; |
||||
case 'chapter' : |
||||
return 'I'; |
||||
default : |
||||
return 'J'; |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* Submit an ILL AddRequest to relais. |
||||
* |
||||
* @param array $form_state |
||||
* A drupal form_state array |
||||
* @param string $aid |
||||
* A relais authentication id (token) |
||||
* |
||||
* @return array|mixed |
||||
*/ |
||||
function upei_roblib_ill_add_request($form_state, $aid) { |
||||
module_load_include('inc', 'upei_roblib_ill', 'includes/db'); |
||||
module_load_include('inc', 'upei_roblib_ill', 'includes/utilities'); |
||||
$config = \Drupal::config('upei_roblib_ill.settings'); |
||||
$url = trim($config->get('ill_add_url')); |
||||
$relais_arr = upei_roblib_ill_build_relais_arr($form_state); |
||||
$relais_json = json_encode($relais_arr); |
||||
$options = [ |
||||
'body' => $relais_json, |
||||
'timeout' => 15, |
||||
'headers' => ['Content-Type' => 'application/json'], |
||||
]; |
||||
if (!isset($aid) || is_array($aid)) { |
||||
upei_roblib_ill_log_request($relais_arr, $aid); |
||||
\Drupal::messenger()->addMessage(t('Error retrieving authentication token, @message', ['@message' => $aid['Problem']['Message']]), 'error'); |
||||
return ['ConfirmMessage' => t('There was an error processing your request, @msg', ['@msg' => $aid['Problem']['Message']])]; |
||||
} |
||||
//$result = drupal_http_request($url . '?aid=' . $aid, $options); |
||||
try { |
||||
$response = \Drupal::httpClient()->post($url . '?aid=' . $aid, $options); |
||||
//$response_data = (string) $response->getBody(); |
||||
} |
||||
catch (Exception $e) { |
||||
return ['ConfirmMessage' => 'Error Communicating with Relais, ' . $e->getMessage()]; |
||||
} |
||||
$response_arr = json_decode($response->getBody(),TRUE); |
||||
|
||||
if (!isset($response_arr)) { |
||||
return ['ConfirmMessage' => 'Error Communicating with Relais, no data returned.']; |
||||
} |
||||
$response_arr['ConfirmMessage'] = isset($response_arr['Problem']['ErrorMessage']) ? $response_arr['Problem']['ErrorMessage'] : $response_arr['ConfirmMessage']; |
||||
upei_roblib_ill_log_request($relais_arr, $response_arr); |
||||
return $response_arr; |
||||
} |
||||
|
||||
/** |
||||
* @param $form_state |
||||
* |
||||
* @return array |
||||
*/ |
||||
function upei_roblib_ill_build_relais_arr($form_state) { |
||||
module_load_include('inc', 'upei_roblib_ill', 'includes/utilities'); |
||||
$storage = $form_state->getStorage(); |
||||
$ill_request = $storage['request']; |
||||
$values = $form_state->getValues(); |
||||
$config = \Drupal::config('upei_roblib_ill.settings'); |
||||
$relais_arr = [ |
||||
"SupplyingLibrarySymbol" => $config->get('ill_library_symbol'), |
||||
]; |
||||
$pub_type = upei_roblib_ill_get_pub_type($ill_request['Genre']); |
||||
$relais_arr['BibliographicInfo'] = upei_roblib_ill_clean_array($ill_request); |
||||
$relais_arr['DeliveryAddress'] = upei_roblib_ill_clean_array($values); |
||||
if ($pub_type != 'B') { |
||||
// this is not a book but is a journal or chapter we will send electronically and as copy |
||||
$relais_arr['ElectronicDelivery']['DeliveryAddress'] = $relais_arr['ElectronicDelivery']['MessagingAddress'] = |
||||
$relais_arr['DeliveryAddress']['DeliveryAddress']; |
||||
} |
||||
$request_info = upei_roblib_ill_request_info_array($relais_arr['BibliographicInfo'], $values['notes']); |
||||
$relais_arr['RequestInfo'] = $request_info; |
||||
$relais_arr['PublisherInfo']['PublicationDate'] = isset($ill_request['Date']) ? |
||||
$ill_request['Date'] : ''; |
||||
$relais_arr['PublisherInfo']['PublicationType'] = $pub_type; |
||||
return $relais_arr; |
||||
} |
||||
|
||||
/** |
||||
* Request an aid from Relais. |
||||
* |
||||
* @param string $barcode |
||||
* A patron_id, campus_id or barcode to identify a user |
||||
* |
||||
* @return string/array |
||||
* Returns a Relais authentication id (token) or an array containing the |
||||
* Relais response error which should include the error message if |
||||
* authentication fails |
||||
*/ |
||||
function upei_roblib_ill_authenticate($barcode, $surname) { |
||||
//$url = variable_get('upei_roblib_ill_auth_url', 'https://caul-cbua.relais-host.com/portal-service/user/authentication'); |
||||
$config = \Drupal::config('upei_roblib_ill.settings'); |
||||
$url = $config->get('ill_auth_url'); |
||||
$json_arr = []; |
||||
$json_arr['ApiKey'] = $config->get('ill_relais_key'); |
||||
$json_arr['UserGroup'] = 'patron'; |
||||
$json_arr['LibrarySymbol'] = $config->get('ill_library_symbol'); |
||||
$json_arr['PatronId'] = $barcode; |
||||
$request_json = json_encode($json_arr); |
||||
$options = [ |
||||
'body' => $request_json, |
||||
'timeout' => 15, |
||||
'headers' => ['Content-Type' => 'application/json'], |
||||
]; |
||||
try { |
||||
$response = \Drupal::httpClient()->post($url, $options); |
||||
} |
||||
catch (Exception $e) { |
||||
$human_readable = ''; |
||||
if($e->getCode() == '401') { |
||||
$human_readable = t('There may have been an issue with your Campus ID, ' |
||||
. 'Please verify it is correct. '); |
||||
} |
||||
$response_data['Problem']['Message'] = $e->getMessage(); |
||||
$response_data['Problem']['HR_Message'] = upei_roblib_ill_build_err_msg($human_readable); |
||||
return $response_data; |
||||
} |
||||
|
||||
$response_data = json_decode($response->getBody(),TRUE); |
||||
$status_code = $response->getStatusCode(); |
||||
if ($status_code == '200') { |
||||
if (isset($response_data['Problem']) || strtolower($response_data['LastName']) !== strtolower($surname)) { |
||||
$err_message = isset($response_data['Problem']['Message']) ? $response_data['Problem']['Message'] : ''; |
||||
$response_data['Problem']['Message'] = upei_roblib_ill_build_err_msg($err_message); |
||||
return $response_data; |
||||
} |
||||
$aid = $response_data['AuthorizationId']; |
||||
} |
||||
return isset($aid) ? $aid : $response_data; |
||||
} |
||||
|
||||
function upei_roblib_ill_build_err_msg($msg_from_server) { |
||||
$campus_id = Link::fromTextAndUrl(t('Campus ID'), Url::fromUri('http://www.upei.ca/vpaf/campuscard')); |
||||
//$campus_id = l(t('Campus ID'), 'http://www.upei.ca/vpaf/campuscard'); |
||||
$ill_email = Link::fromTextAndUrl('ill@upei.ca', Url::fromUri('mailto:ill@upei.ca')); |
||||
//$ill_email = l(t('ill@upei.ca'), 'mailto:ill@upei.ca'); |
||||
$phone = Link::fromTextAndUrl('902-566-0583', Url::fromUri('tel:902-566-0353')); |
||||
//$phone = l(t('902-566-0583'), 'tel:902-566-0353'); |
||||
$server_response = !empty($msg_from_server) ? 'Server Response: ' . $msg_from_server : ''; |
||||
return t('Oops. Something went wrong.<br />Check the "Your Last Name" and "Your Campus ID" fields - those two need to match what is on file |
||||
. (Your @campus_id appears as the NUMBER near the middle of your campus card). If you do not have a @campus_id, please contact the Robertson Library Service Desk, or, |
||||
call @phone. Note: if you are a student taking online courses only, please email @ill_email.<br />@msg_from_server', |
||||
[ |
||||
'@campus_id' => $campus_id->toString(), |
||||
'@ill_email' => $ill_email->toString(), |
||||
'@phone' => $phone->toString(), |
||||
'@msg_from_server' => $server_response, |
||||
]); |
||||
} |
||||
|
||||
Loading…
Reference in new issue