Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ before starting to add changes. Use example [placed in the end of the page](#exa

## [Unreleased]

- Updated `os2forms_fbs_handler` to use latest endpoints and operations.

## [3.21.0] 2024-12-17

- Updated `os2web_audit`.
Expand Down
105 changes: 74 additions & 31 deletions modules/os2forms_fbs_handler/src/Client/FBS.php
Original file line number Diff line number Diff line change
Expand Up @@ -75,34 +75,22 @@ public function isLoggedIn(): bool {
* @param string $cpr
* The users personal security number.
*
* @return \Drupal\os2forms_fbs_handler\Client\Model\Patron|null
* NULL if not else the Patron.
* @return string|null
* NULL if not else the PatronId.
*
* @throws \GuzzleHttp\Exception\GuzzleException
* @throws \JsonException
*/
public function doUserExists(string $cpr): ?Patron {
public function authenticatePatron(string $cpr): ?string {
// Check if session has been created with FBS and if not creates it.
if (!$this->isLoggedIn()) {
$this->login();
}

// Try pre-authenticate the user/parent.
$json = $this->request('/external/{agency_id}/patrons/preauthenticated/v9', $cpr);
// Authenticate the patron.
$json = $this->request('/external/{agency_id}/patrons/preauthenticated/v10', $cpr);
if ($json->authenticateStatus === $this::AUTHENTICATE_STATUS_VALID) {
return new Patron(
$json->patron->patronId,
(bool) $json->patron->receiveSms,
(bool) $json->patron->receivePostalMail,
$json->patron->notificationProtocols,
$json->patron->phoneNumber,
is_null($json->patron->onHold) ? $json->patron->onHold : (array) $json->patron->onHold,
$json->patron->preferredLanguage,
(bool) $json->patron->guardianVisibility,
$json->patron->emailAddress,
(bool) $json->patron->receiveEmail,
$json->patron->preferredPickupBranch
);
return $json->patronId;
}

return NULL;
Expand All @@ -123,17 +111,60 @@ public function doUserExists(string $cpr): ?Patron {
* @throws \JsonException
*/
public function createPatronWithGuardian(Patron $patron, Guardian $guardian) {
$uri = '/external/{agency_id}/patrons/withGuardian/v1';
$uri = '/external/{agency_id}/patrons/withGuardian/v4';
$payload = [
'cprNumber' => $patron->cpr,
'personId' => $patron->personId,
'pincode' => $patron->pincode,
'preferredPickupBranch' => $patron->preferredPickupBranch,
'name' => 'Unknown Name',
'email' => $patron->emailAddress,
'emailAddresses' => $patron->emailAddresses,
'guardian' => $guardian->toArray(),
];

return $this->request($uri, $payload,);
return $this->request($uri, $payload);
}

/**
* Get patron information.
*
* @param string $patronId
* The patron to update.
*
* @return \Drupal\os2forms_fbs_handler\Client\Model\Patron
* Patron object
*
* @throws \GuzzleHttp\Exception\GuzzleException
* @throws \JsonException
*/
public function getPatron(string $patronId): ?Patron {
$uri = '/external/{agency_id}/patrons/' . $patronId . '/v4';

$json = $this->request($uri, [], RequestMethodInterface::METHOD_GET);

if ($json->authenticateStatus === "VALID") {
return new Patron(
$json->patron->patronId,
(bool) $json->patron->receiveSms,
(bool) $json->patron->receivePostalMail,
$json->patron->notificationProtocols,
$json->patron->phoneNumber,
is_null($json->patron->onHold) ? $json->patron->onHold : (array) $json->patron->onHold,
$json->patron->preferredLanguage,
(bool) $json->patron->guardianVisibility,
$json->patron->defaultInterestPeriod,
(bool) $json->patron->resident,
[
[
'emailAddress' => $json->patron->emailAddress,
'receiveNotification' => $json->patron->receiveEmail,
],
],
(bool) $json->patron->receiveEmail,
$json->patron->preferredPickupBranch
);
}

return NULL;
}

/**
Expand All @@ -149,19 +180,27 @@ public function createPatronWithGuardian(Patron $patron, Guardian $guardian) {
* @throws \JsonException
*/
public function updatePatron(Patron $patron): bool {
$uri = '/external/{agency_id}/patrons/' . $patron->patronId . '/v6';
$uri = '/external/{agency_id}/patrons/' . $patron->patronId . '/v8';
$payload = [
'patronid' => $patron->patronId,
'patron' => $patron->toArray(),
'patron' => [
'preferredPickupBranch' => $patron->preferredPickupBranch,
'emailAddresses' => $patron->emailAddresses,
'guardianVisibility' => $patron->guardianVisibility,
'receivePostalMail' => $patron->receiveEmail,
'phoneNumbers' => [
[
'receiveNotification' => TRUE,
'phoneNumber' => $patron->phoneNumber,
],
],
],
'pincodeChange' => [
'pincode' => $patron->pincode,
'libraryCardNumber' => $patron->cpr,
'libraryCardNumber' => $patron->personId,
],
];

$json = $this->request($uri, $payload, Request::METHOD_PUT);

return $json->authenticateStatus === $this::AUTHENTICATE_STATUS_VALID;
return $this->request($uri, $payload, RequestMethodInterface::METHOD_PUT);
}

/**
Expand All @@ -179,7 +218,7 @@ public function updatePatron(Patron $patron): bool {
* @throws \JsonException
*/
public function createGuardian(Patron $patron, Guardian $guardian): int {
$uri = '/external/{agency_id}/patrons/withGuardian/v1';
$uri = '/external/{agency_id}/patrons/withGuardian/v2';
$payload = [
'patronId' => $patron->patronId,
'guardian' => $guardian->toArray(),
Expand All @@ -199,7 +238,7 @@ public function createGuardian(Patron $patron, Guardian $guardian): int {
* The type of request to send (Default: POST).
*
* @return mixed
* Json response from FBS.
* Json response from FBS or TRUE on updatePatron response.
*
* @throws \GuzzleHttp\Exception\GuzzleException
* @throws \JsonException
Expand Down Expand Up @@ -230,6 +269,10 @@ private function request(string $uri, array|string $data, string $method = Reque

$response = $this->client->request($method, $url, $options);

if ($response->getStatusCode() === 204) {
return TRUE;
}

return json_decode($response->getBody(), FALSE, 512, JSON_THROW_ON_ERROR);
}

Expand Down
2 changes: 1 addition & 1 deletion modules/os2forms_fbs_handler/src/Client/Model/Guardian.php
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ public function __construct(
*/
public function toArray(): array {
return [
'cprNumber' => $this->cpr,
'personIdentifier' => $this->cpr,
'name' => $this->name,
'email' => $this->email,
];
Expand Down
11 changes: 8 additions & 3 deletions modules/os2forms_fbs_handler/src/Client/Model/Patron.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,13 @@ public function __construct(
public readonly ?array $onHold = NULL,
public readonly ?string $preferredLanguage = NULL,
public readonly ?bool $guardianVisibility = NULL,
public readonly ?int $defaultInterestPeriod = NULL,
public readonly ?bool $resident = NULL,
// Allow these properties below to be updatable.
public ?string $emailAddress = NULL,
public ?array $emailAddresses = NULL,
public ?bool $receiveEmail = NULL,
public ?string $preferredPickupBranch = NULL,
public ?string $cpr = NULL,
public ?string $personId = NULL,
public ?string $pincode = NULL,
) {
}
Expand All @@ -36,16 +38,19 @@ public function __construct(
*/
public function toArray(): array {
return [
'patronId' => $this->patronId,
'receiveEmail' => $this->receiveEmail,
'receiveSms' => $this->receiveSms,
'receivePostalMail' => $this->receivePostalMail,
'emailAddress' => $this->emailAddress,
'emailAddresses' => $this->emailAddresses,
'notificationProtocols' => $this->notificationProtocols,
'phoneNumber' => $this->phoneNumber,
'preferredPickupBranch' => $this->preferredPickupBranch,
'onHold' => $this->onHold,
'preferredLanguage' => $this->preferredLanguage,
'guardianVisibility' => $this->guardianVisibility,
'defaultInterestPeriod' => $this->defaultInterestPeriod,
'resident' => $this->resident,
];
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,36 +87,50 @@ public function process(Job $job): JobResult {

$data = $webformSubmission->getData();

// Checker child patron exists.
$patron = $fbs->doUserExists($data['barn_cpr']);

// Create Guardian.
$guardian = new Guardian(
$data['cpr'],
$data['navn'],
$data['email']
);

// Check if child patron exists.
$patronId = $fbs->authenticatePatron($data['barn_cpr']);

// If "yes" update the child patron and create the guardian (the
// guardian is not another patron user).
if (!is_null($patron)) {
// Create Patron object with updated values.
$patron->preferredPickupBranch = $data['afhentningssted'];
$patron->emailAddress = $data['barn_mail'];
$patron->receiveEmail = TRUE;
$patron->cpr = $data['barn_cpr'];
$patron->pincode = $data['pinkode'];

$fbs->updatePatron($patron);
$fbs->createGuardian($patron, $guardian);
if (!is_null($patronId)) {
// Fetch patron.
$patron = $fbs->getPatron($patronId);

if (!is_null($patron)) {
// Create Patron object with updated values.
$patron->preferredPickupBranch = $data['afhentningssted'];
$patron->emailAddresses = [
[
'emailAddress' => $data['barn_mail'],
'receiveNotification' => TRUE,
],
];
$patron->receiveEmail = TRUE;
$patron->pincode = $data['pinkode'];

$fbs->updatePatron($patron);
$fbs->createGuardian($patron, $guardian);
}
}
else {
// If "no" create child patron and guardian.
$patron = new Patron();
$patron->preferredPickupBranch = $data['afhentningssted'];
$patron->emailAddress = $data['barn_mail'];
$patron->emailAddresses = [
[
'emailAddress' => $data['barn_mail'],
'receiveNotification' => TRUE,
],
];
$patron->receiveEmail = TRUE;
$patron->cpr = $data['barn_cpr'];
$patron->personId = $data['barn_cpr'];
$patron->pincode = $data['pinkode'];

$fbs->createPatronWithGuardian($patron, $guardian);
Expand Down
Loading