diff --git a/README.md b/README.md index b03fa1f960acea6da8251a3c94ba18c43212028b..facef3abae63efa8c9f0a8bca6d6ee28afe30e69 100644 --- a/README.md +++ b/README.md @@ -52,18 +52,155 @@ dbp_relay_base_person_connector_ldap: For more info on bundle configuration see https://symfony.com/doc/current/bundles/configuration.html -## Customization +## Events -TODO: Update +To modify the behavior of the connector bundle the following events are registered: -You can implement the [LDAPApiProviderInterface](https://gitlab.tugraz.at/dbp/relay/dbp-relay-base-person-connector-ldap-bundle/-/blob/main/src/API/LDAPApiProviderInterface.php) -to customize how attributes are fetched from the LDAP server and assigned to the `Person` entity or what `Person` entities -are fetched from certain external services like in the [ALMA Bundle](https://gitlab.tugraz.at/dbp/library/api-alma-bundle). +### PersonUserItemPreEvent -You'll find an example at [DummyLDAPApiProvider.php](https://gitlab.tugraz.at/dbp/relay/dbp-relay-base-person-connector-ldap-bundle/-/blob/main/src/Service/DummyLDAPApiProvider.php). +This event allows to modify the identifier before a user is loaded from LDAP. -If you don't need any customization, you don't need to implement the interface, -there is the default implementation which is used by default. +An event subscriber receives a `\Dbp\Relay\BasePersonConnectorLdapBundle\Event\PersonUserItemPreEvent` instance +in a service for example in `src/EventSubscriber/PersonUserItemSubscriber.php`: + +```php +<?php + +namespace App\EventSubscriber; + +use Dbp\Relay\BasePersonConnectorLdapBundle\Event\PersonUserItemPreEvent; +use Symfony\Component\EventDispatcher\EventSubscriberInterface; + +class PersonUserItemSubscriber implements EventSubscriberInterface +{ + public static function getSubscribedEvents(): array + { + return [ + PersonUserItemPreEvent::NAME => 'onPre', + ]; + } + + public function onPre(PersonUserItemPreEvent $event) + { + $identifier = $event->getIdentifier(); + + // Example: + // Replace once or double encoded $ character at the start like "%2524F1234" or "%24F1234" + $identifier = preg_replace('/^%(25)?24/', '$', $identifier); + + $event->setIdentifier($identifier); + } +} +``` + +### PersonForExternalServiceEvent + +Some integration services may need to fetch a person from an external API with a +`\Dbp\Relay\BasePersonBundle\API\PersonProviderInterface`, for example: + +```php +$person = $this->personProvider->getPersonForExternalService('SOME_SERVICE', $userId); +``` + +To implement such a fetch process from an external API this event can be used. + +An event subscriber receives a `\Dbp\Relay\BasePersonConnectorLdapBundle\Event\PersonForExternalServiceEvent` instance +in a service for example in `src/EventSubscriber/PersonForExternalServiceSubscriber.php`: + +```php +<?php + +namespace App\EventSubscriber; + +use Dbp\Relay\BasePersonConnectorLdapBundle\Event\PersonForExternalServiceEvent; +use Dbp\Relay\BasePersonConnectorLdapBundle\Service\LDAPApi; +use Symfony\Component\EventDispatcher\EventSubscriberInterface; +use App\Service\ExternalApi; + +class PersonForExternalServiceSubscriber implements EventSubscriberInterface +{ + private $ldap; + private $externalApi; + + public function __construct(LDAPApi $ldap, ExternalApi $externalApi) + { + $this->ldap = $ldap; + $this->externalApi = $externalApi; + } + + public static function getSubscribedEvents(): array + { + return [ + PersonForExternalServiceEvent::NAME => 'onEvent', + ]; + } + + public function onEvent(PersonForExternalServiceEvent $event) + { + $service = $event->getService(); + $serviceID = $event->getServiceID(); + + if ($service === 'SOME_SERVICE') { + $user = $this->externalApi->getPersonUserItemByExternalUserId($serviceID); + $person = $this->ldap->personFromUserItem($user, true); + $event->setPerson($person); + } + } +} +``` + +### PersonFromUserItemPostEvent + +This event allows to modify the person after it is converted from an LDAP User. +You can use this for example to populate the person with additional data. + +An event subscriber receives a `\Dbp\Relay\BasePersonConnectorLdapBundle\Event\PersonFromUserItemPostEvent` instance +in a service for example in `src/EventSubscriber/PersonFromUserItemSubscriber.php`: + +```php +<?php + +namespace App\EventSubscriber; + +use Dbp\Relay\BasePersonConnectorLdapBundle\Event\PersonFromUserItemPostEvent; +use Symfony\Component\EventDispatcher\EventSubscriberInterface; + +class PersonFromUserItemSubscriber implements EventSubscriberInterface +{ + public static function getSubscribedEvents(): array + { + return [ + PersonFromUserItemPostEvent::NAME => 'onPost', + ]; + } + + public function onPost(PersonFromUserItemPostEvent $event) + { + $attributes = $event->getAttributes(); + $person = $event->getPerson(); + + $birthDateString = trim($attributes['dateofbirth'][0] ?? ''); + + if ($birthDateString !== '') { + $matches = []; + + if (preg_match('/^(\d{4})-(\d{2})-(\d{2})$/', $birthDateString, $matches)) { + $person->setBirthDate("{$matches[1]}-{$matches[2]}-{$matches[3]}"); + // get birthday from LDAP DateOfBirth (e.g. 19810718) + } elseif (preg_match('/^(\d{4})(\d{2})(\d{2})$/', $birthDateString, $matches)) { + $person->setBirthDate("{$matches[1]}-{$matches[2]}-{$matches[3]}"); + // sometimes also "1994-06-14 00:00:00" + } elseif (preg_match('/^(\d{4})-(\d{2})-(\d{2}) .*$/', $birthDateString, $matches)) { + $person->setBirthDate("{$matches[1]}-{$matches[2]}-{$matches[3]}"); + } + } + + $person->setExtraData('special_data', $attributes['some_special_attribute'] ?? ''); + + $event->setPerson($person); + } +} +``` ## Development & Testing