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 |
## 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 |
## 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