From ba8cbca954ad636bcc66ced34fb116d8f65c00be Mon Sep 17 00:00:00 2001
From: Tobias Gross-Vogt <tgros@tugraz.at>
Date: Thu, 1 Dec 2022 08:48:02 +0100
Subject: [PATCH] campusonline and core update; support for automatic local
 data by config

---
 composer.lock                                 | 12 +++----
 src/DependencyInjection/Configuration.php     | 32 ++++++++++---------
 ...pRelayBasePersonConnectorLdapExtension.php |  7 +++-
 src/Event/PersonPreEvent.php                  |  4 +--
 .../PersonPostEventSubscriber.php             | 16 ++++++++++
 src/Resources/config/services.yaml            |  4 +++
 src/Service/LDAPApi.php                       | 10 +++---
 .../PersonFromUserItemSubscriber.php          |  5 ++-
 tests/PersonTest.php                          |  2 +-
 9 files changed, 61 insertions(+), 31 deletions(-)
 create mode 100644 src/EventSubscriber/PersonPostEventSubscriber.php

diff --git a/composer.lock b/composer.lock
index 2079642..ac64c22 100644
--- a/composer.lock
+++ b/composer.lock
@@ -348,11 +348,11 @@
         },
         {
             "name": "dbp/relay-base-person-bundle",
-            "version": "v0.2.6",
+            "version": "v0.2.8",
             "source": {
                 "type": "git",
                 "url": "https://gitlab.tugraz.at/dbp/relay/dbp-relay-base-person-bundle",
-                "reference": "d0fbe7236914d9f5343366cd50d6903c41446758"
+                "reference": "8d145411476f522f867dbd7442f7a5fbd91e6f68"
             },
             "require": {
                 "api-platform/core": "^2.6.3",
@@ -393,15 +393,15 @@
             "license": [
                 "AGPL-3.0-or-later"
             ],
-            "time": "2022-11-24T08:50:01+00:00"
+            "time": "2022-11-30T12:35:39+00:00"
         },
         {
             "name": "dbp/relay-core-bundle",
-            "version": "v0.1.61",
+            "version": "v0.1.63",
             "source": {
                 "type": "git",
                 "url": "https://gitlab.tugraz.at/dbp/relay/dbp-relay-core-bundle",
-                "reference": "996fc7d43361720e3749401fd0f005ed3d97404b"
+                "reference": "3c696f31a84b65cec38a975d4adaf64e3bc2fdcb"
             },
             "require": {
                 "api-platform/core": "^2.6.8 <2.7.0",
@@ -465,7 +465,7 @@
                 "AGPL-3.0-or-later"
             ],
             "description": "The core bundle of the Relay API gateway",
-            "time": "2022-11-23T12:35:13+00:00"
+            "time": "2022-11-30T12:11:21+00:00"
         },
         {
             "name": "doctrine/annotations",
diff --git a/src/DependencyInjection/Configuration.php b/src/DependencyInjection/Configuration.php
index 24e185f..1f94e8b 100644
--- a/src/DependencyInjection/Configuration.php
+++ b/src/DependencyInjection/Configuration.php
@@ -4,6 +4,7 @@ declare(strict_types=1);
 
 namespace Dbp\Relay\BasePersonConnectorLdapBundle\DependencyInjection;
 
+use Dbp\Relay\BasePersonConnectorLdapBundle\EventSubscriber\PersonPostEventSubscriber;
 use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
 use Symfony\Component\Config\Definition\Builder\TreeBuilder;
 use Symfony\Component\Config\Definition\ConfigurationInterface;
@@ -20,29 +21,30 @@ class Configuration implements ConfigurationInterface
         $ldapBuilder = new TreeBuilder('ldap');
         $ldapNode = $ldapBuilder->getRootNode()
             ->children()
-            ->scalarNode('host')->end()
-            ->scalarNode('base_dn')->end()
-            ->scalarNode('username')->end()
-            ->scalarNode('password')->end()
-            ->enumNode('encryption')
-                ->info('simple_tls uses port 636 and is sometimes referred to as "SSL", start_tls uses port 389 and is sometimes referred to as "TLS", plain means none')
-                ->values(['start_tls', 'simple_tls', 'plain'])
-                ->defaultValue('start_tls')
-            ->end()
+                ->scalarNode('host')->end()
+                ->scalarNode('base_dn')->end()
+                ->scalarNode('username')->end()
+                ->scalarNode('password')->end()
+                ->enumNode('encryption')
+                    ->info('simple_tls uses port 636 and is sometimes referred to as "SSL", start_tls uses port 389 and is sometimes referred to as "TLS", plain means none')
+                    ->values(['start_tls', 'simple_tls', 'plain'])
+                    ->defaultValue('start_tls')
+                ->end()
             ->end();
 
         $attributesBuilder = new TreeBuilder('attributes');
         $attributesNode = $attributesBuilder->getRootNode()
             ->children()
-            ->scalarNode('identifier')->end()
-            ->scalarNode('given_name')->end()
-            ->scalarNode('family_name')->end()
-            ->scalarNode('email')->end()
-            ->scalarNode('birthday')->end()
+                ->scalarNode('identifier')->end()
+                ->scalarNode('given_name')->end()
+                ->scalarNode('family_name')->end()
+                ->scalarNode('email')->end()
+                ->scalarNode('birthday')->end()
             ->end();
-        $ldapNode->append($attributesNode);
 
+        $ldapNode->append($attributesNode);
         $rootNode->append($ldapNode);
+        $rootNode->append(PersonPostEventSubscriber::getConfigNode());
 
         return $treeBuilder;
     }
diff --git a/src/DependencyInjection/DbpRelayBasePersonConnectorLdapExtension.php b/src/DependencyInjection/DbpRelayBasePersonConnectorLdapExtension.php
index 8155ad0..695787d 100644
--- a/src/DependencyInjection/DbpRelayBasePersonConnectorLdapExtension.php
+++ b/src/DependencyInjection/DbpRelayBasePersonConnectorLdapExtension.php
@@ -4,6 +4,8 @@ declare(strict_types=1);
 
 namespace Dbp\Relay\BasePersonConnectorLdapBundle\DependencyInjection;
 
+use Dbp\Relay\BasePersonConnectorLdapBundle\EventSubscriber\PersonPostEventSubscriber;
+use Dbp\Relay\BasePersonConnectorLdapBundle\Service\LDAPApi;
 use Symfony\Component\Cache\Adapter\FilesystemAdapter;
 use Symfony\Component\Config\FileLocator;
 use Symfony\Component\DependencyInjection\ContainerBuilder;
@@ -30,10 +32,13 @@ class DbpRelayBasePersonConnectorLdapExtension extends ConfigurableExtension
         $personCacheDef->addTag('cache.pool');
 
         // Inject the config value into the UCardService service
-        $definition = $container->getDefinition('Dbp\Relay\BasePersonConnectorLdapBundle\Service\LDAPApi');
+        $definition = $container->getDefinition(LDAPApi::class);
         $definition->addMethodCall('setConfig', [$mergedConfig]);
         $definition->addMethodCall('setLDAPCache', [$ldapCache, 360]);
         $definition->addMethodCall('setPersonCache', [$personCacheDef]);
+
+        $postEventSubscriber = $container->getDefinition(PersonPostEventSubscriber::class);
+        $postEventSubscriber->addMethodCall('setConfig', [$mergedConfig]);
     }
 
     private function extendArrayParameter(ContainerBuilder $container, string $parameter, array $values)
diff --git a/src/Event/PersonPreEvent.php b/src/Event/PersonPreEvent.php
index fe7d76d..93105a0 100644
--- a/src/Event/PersonPreEvent.php
+++ b/src/Event/PersonPreEvent.php
@@ -4,9 +4,9 @@ declare(strict_types=1);
 
 namespace Dbp\Relay\BasePersonConnectorLdapBundle\Event;
 
-use Dbp\Relay\CoreBundle\LocalData\LocalDataAwarePreEvent;
+use Dbp\Relay\CoreBundle\LocalData\LocalDataPreEvent;
 
-class PersonPreEvent extends LocalDataAwarePreEvent
+class PersonPreEvent extends LocalDataPreEvent
 {
     public const NAME = 'dbp.relay.base_person_connector_ldap_bundle.person_event.pre';
 }
diff --git a/src/EventSubscriber/PersonPostEventSubscriber.php b/src/EventSubscriber/PersonPostEventSubscriber.php
new file mode 100644
index 0000000..1deebde
--- /dev/null
+++ b/src/EventSubscriber/PersonPostEventSubscriber.php
@@ -0,0 +1,16 @@
+<?php
+
+declare(strict_types=1);
+
+namespace Dbp\Relay\BasePersonConnectorLdapBundle\EventSubscriber;
+
+use Dbp\Relay\BasePersonBundle\Event\PersonProviderPostEvent;
+use Dbp\Relay\CoreBundle\LocalData\AbstractLocalDataPostEventSubscriber;
+
+class PersonPostEventSubscriber extends AbstractLocalDataPostEventSubscriber
+{
+    public static function getSubscribedEventName(): string
+    {
+        return PersonProviderPostEvent::NAME;
+    }
+}
diff --git a/src/Resources/config/services.yaml b/src/Resources/config/services.yaml
index c5bd7a0..89f2868 100644
--- a/src/Resources/config/services.yaml
+++ b/src/Resources/config/services.yaml
@@ -4,5 +4,9 @@ services:
     autowire: true
     autoconfigure: true
 
+  Dbp\Relay\BasePersonConnectorLdapBundle\EventSubscriber\PersonPostEventSubscriber:
+    autowire: true
+    autoconfigure: true
+
   Dbp\Relay\BasePersonBundle\API\PersonProviderInterface:
     '@Dbp\Relay\BasePersonConnectorLdapBundle\Service\LDAPPersonProvider'
diff --git a/src/Service/LDAPApi.php b/src/Service/LDAPApi.php
index a1638ce..b0174d8 100644
--- a/src/Service/LDAPApi.php
+++ b/src/Service/LDAPApi.php
@@ -22,7 +22,7 @@ use Dbp\Relay\BasePersonConnectorLdapBundle\Event\PersonUserItemPreEvent;
 use Dbp\Relay\CoreBundle\API\UserSessionInterface;
 use Dbp\Relay\CoreBundle\Exception\ApiError;
 use Dbp\Relay\CoreBundle\Helpers\Tools as CoreTools;
-use Dbp\Relay\CoreBundle\LocalData\LocalDataAwareEventDispatcher;
+use Dbp\Relay\CoreBundle\LocalData\LocalDataEventDispatcher;
 use Psr\Cache\CacheItemPoolInterface;
 use Psr\Container\ContainerInterface;
 use Psr\Log\LoggerAwareInterface;
@@ -66,7 +66,7 @@ class LDAPApi implements LoggerAwareInterface, ServiceSubscriberInterface
 
     private $birthdayAttributeName;
 
-    /** @var LocalDataAwareEventDispatcher */
+    /** @var LocalDataEventDispatcher */
     private $eventDispatcher;
 
     public function __construct(ContainerInterface $locator, EventDispatcherInterface $dispatcher)
@@ -76,7 +76,7 @@ class LDAPApi implements LoggerAwareInterface, ServiceSubscriberInterface
         $this->currentPerson = null;
         $this->locator = $locator;
         $this->deploymentEnv = 'production';
-        $this->eventDispatcher = new LocalDataAwareEventDispatcher(Person::class, $dispatcher);
+        $this->eventDispatcher = new LocalDataEventDispatcher(Person::class, $dispatcher);
     }
 
     public function setConfig(array $config)
@@ -312,10 +312,10 @@ class LDAPApi implements LoggerAwareInterface, ServiceSubscriberInterface
             }
         }
 
-        $postEvent = new PersonProviderPostEvent($attributes, $person);
+        $postEvent = new PersonProviderPostEvent($person, $attributes);
         $this->eventDispatcher->dispatch($postEvent, PersonProviderPostEvent::NAME);
 
-        return $postEvent->getEntity();
+        return $person;
     }
 
     /**
diff --git a/src/TestUtils/PersonFromUserItemSubscriber.php b/src/TestUtils/PersonFromUserItemSubscriber.php
index d771d62..0c5acad 100644
--- a/src/TestUtils/PersonFromUserItemSubscriber.php
+++ b/src/TestUtils/PersonFromUserItemSubscriber.php
@@ -4,6 +4,7 @@ declare(strict_types=1);
 
 namespace Dbp\Relay\BasePersonConnectorLdapBundle\TestUtils;
 
+use Dbp\Relay\BasePersonBundle\Entity\Person;
 use Dbp\Relay\BasePersonBundle\Event\PersonProviderPostEvent;
 use Symfony\Component\EventDispatcher\EventSubscriberInterface;
 
@@ -19,6 +20,8 @@ class PersonFromUserItemSubscriber implements EventSubscriberInterface
     public function onPost(PersonProviderPostEvent $event)
     {
         $person = $event->getEntity();
-        $person->setExtraData('test', 'my-test-string');
+        if ($person instanceof Person) {
+            $person->setExtraData('test', 'my-test-string');
+        }
     }
 }
diff --git a/tests/PersonTest.php b/tests/PersonTest.php
index 62e9c0b..95ef315 100644
--- a/tests/PersonTest.php
+++ b/tests/PersonTest.php
@@ -2,7 +2,7 @@
 
 declare(strict_types=1);
 
-namespace Tugraz\Relay\TugrazBundle\Tests;
+namespace Dbp\Relay\BasePersonConnectorLdapBundle\Tests;
 
 use Adldap\Connections\ConnectionInterface;
 use Adldap\Models\User as AdldapUser;
-- 
GitLab