From e595d3f17270070dfeb9a811e904eea91cdcd877 Mon Sep 17 00:00:00 2001 From: Robert Zondervan Date: Wed, 8 Jan 2025 16:52:51 +0100 Subject: [PATCH 1/5] First stages on fixing the event dispatcher calls The way events are dispatched now is deprecated, this fix updates it to the most recent version --- lib/Controller/ObjectsController.php | 22 +++++++-------- lib/Db/ObjectEntityMapper.php | 41 ++++++++++++++++++++-------- 2 files changed, 40 insertions(+), 23 deletions(-) diff --git a/lib/Controller/ObjectsController.php b/lib/Controller/ObjectsController.php index bc8c25f8ce..1e14c331fc 100644 --- a/lib/Controller/ObjectsController.php +++ b/lib/Controller/ObjectsController.php @@ -13,7 +13,7 @@ use OCP\AppFramework\Http\JSONResponse; use OCP\DB\Exception; use OCP\IAppConfig; -use OCP\IRequest; +use OCP\IRequest; use OCP\App\IAppManager; use Psr\Container\ContainerExceptionInterface; use Psr\Container\NotFoundExceptionInterface; @@ -111,7 +111,7 @@ public function index(ObjectService $objectService, SearchService $searchService public function show(string $id): JSONResponse { try { - return new JSONResponse($this->objectEntityMapper->find(idOrUuid: (int) $id)->getObjectArray()); + return new JSONResponse($this->objectEntityMapper->find((int) $id)->getObjectArray()); } catch (DoesNotExistException $exception) { return new JSONResponse(data: ['error' => 'Not Found'], statusCode: 404); } @@ -146,7 +146,7 @@ public function create(ObjectService $objectService): JSONResponse unset($data['id']); } - // If mapping ID is provided, transform the object using the mapping + // If mapping ID is provided, transform the object using the mapping $mappingService = $this->getOpenConnectorMappingService(); if ($mapping !== null && $mappingService !== null) { @@ -195,7 +195,7 @@ public function update(int $id, ObjectService $objectService): JSONResponse unset($data['id']); } - // If mapping ID is provided, transform the object using the mapping + // If mapping ID is provided, transform the object using the mapping $mappingService = $this->getOpenConnectorMappingService(); if ($mapping !== null && $mappingService !== null) { @@ -211,9 +211,9 @@ public function update(int $id, ObjectService $objectService): JSONResponse return new JSONResponse(['message' => $exception->getMessage(), 'validationErrors' => $formatter->format($exception->getErrors())], 400); } - $this->auditTrailMapper->createAuditTrail(new: $objectEntity, old: $oldObject); +// $this->auditTrailMapper->createAuditTrail(new: $objectEntity, old: $oldObject); - return new JSONResponse($objectEntity->getOBjectArray()); + return new JSONResponse($objectEntity->getObjectArray()); } /** @@ -330,11 +330,11 @@ public function logs(int $id): JSONResponse } } - + /** * Retrieves all available mappings - * + * * This method returns a JSON response containing all available mappings in the system. * * @NoAdminRequired @@ -346,15 +346,15 @@ public function mappings(): JSONResponse { // Get mapping service, which will return null based on implementation $mappingService = $this->getOpenConnectorMappingService(); - + // Initialize results array $results = []; - + // If mapping service exists, get all mappings using find() method if ($mappingService !== null) { $results = $mappingService->getMappings(); } - + // Return response with results array and total count return new JSONResponse([ 'results' => $results, diff --git a/lib/Db/ObjectEntityMapper.php b/lib/Db/ObjectEntityMapper.php index f9bbbd5cef..b62bc2a431 100644 --- a/lib/Db/ObjectEntityMapper.php +++ b/lib/Db/ObjectEntityMapper.php @@ -38,7 +38,7 @@ class ObjectEntityMapper extends QBMapper * @param IEventDispatcher $eventDispatcher The event dispatcher */ public function __construct( - IDBConnection $db, + IDBConnection $db, MySQLJsonService $mySQLJsonService, IEventDispatcher $eventDispatcher ) { @@ -248,6 +248,19 @@ public function findAll(?int $limit = null, ?int $offset = null, ?array $filters return $this->findEntities(query: $qb); } + /** + * @inheritDoc + */ + public function insert(Entity $entity): Entity + { + $entity = parent::insert($entity); + // Dispatch creation event + $this->eventDispatcher->dispatchTyped(new ObjectCreatedEvent($entity)); + + return $entity; + + } + /** * Creates an object from an array * @@ -264,15 +277,25 @@ public function createFromArray(array $object): ObjectEntity $obj = $this->insert($obj); - // Dispatch creation event - $this->eventDispatcher->dispatch( - ObjectCreatedEvent::class, - new ObjectCreatedEvent($obj) - ); return $obj; } + /** + * @inheritDoc + */ + public function update(Entity $entity): Entity + { + $oldObject = $this->find($entity->getId()); + + $entity = parent::update($entity); + // Dispatch creation event + $this->eventDispatcher->dispatchTyped(new ObjectUpdatedEvent($entity, $oldObject)); + + return $entity; + + } + /** * Updates an object from an array * @@ -295,12 +318,6 @@ public function updateFromArray(int $id, array $object): ObjectEntity $newObject = $this->update($newObject); - // Dispatch update event - $this->eventDispatcher->dispatch( - ObjectUpdatedEvent::class, - new ObjectUpdatedEvent($newObject, $oldObject) - ); - return $newObject; } From c497df77cdc1245e9cc2545d32233524c0a3b84b Mon Sep 17 00:00:00 2001 From: Robert Zondervan Date: Thu, 9 Jan 2025 09:46:53 +0100 Subject: [PATCH 2/5] Document new registration route for event listeners --- docs/events.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/events.md b/docs/events.md index abeec18682..934fa18c78 100644 --- a/docs/events.md +++ b/docs/events.md @@ -127,7 +127,9 @@ class SchemaListener implements IEventListener { After creating your listener class, you need to register it with Nextcloud's event dispatcher system. This is done in your application's `lib/AppInfo/Application.php` file by registering the listener in the `register()` method: ```php -$container->query(EventDispatcherInterface::class)->addListener(SchemaCreatedEvent::class, [SchemaListener::class, 'handle']); +/* @var IEventDispatcher $dispatcher */ +$dispatcher = $this->getContainer()->get(IEventDispatcher::class); +$dispatcher->addServiceListener(eventName: SchemaCreatedEvent::class, className: SchemaCreatedEvent::class); ``` This line registers the `SchemaListener` class to handle `SchemaCreatedEvent` events. You can add similar lines for other events to register your listener for those specific events. From 025570b7368c82db150db3df9d2091aff058754e Mon Sep 17 00:00:00 2001 From: Robert Zondervan Date: Thu, 9 Jan 2025 09:54:41 +0100 Subject: [PATCH 3/5] Fix documentation in line with latest Nextcloud documentation --- docs/events.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/events.md b/docs/events.md index 934fa18c78..2eb8b3b356 100644 --- a/docs/events.md +++ b/docs/events.md @@ -120,7 +120,7 @@ class SchemaListener implements IEventListener { // Handle the event } } -``` +``` ### 2. Register the Event Listener From 04956fcce5cc7ed8afebe679674fcebb651f2ca9 Mon Sep 17 00:00:00 2001 From: Robert Zondervan Date: Thu, 9 Jan 2025 09:55:00 +0100 Subject: [PATCH 4/5] Dispatch events one layer deeper --- lib/Db/RegisterMapper.php | 52 +++++++++++++++++++++++++-------------- lib/Db/SchemaMapper.php | 49 ++++++++++++++++++++++-------------- 2 files changed, 64 insertions(+), 37 deletions(-) diff --git a/lib/Db/RegisterMapper.php b/lib/Db/RegisterMapper.php index 44ba9c6862..dee62fa75a 100644 --- a/lib/Db/RegisterMapper.php +++ b/lib/Db/RegisterMapper.php @@ -3,6 +3,7 @@ namespace OCA\OpenRegister\Db; use OCA\OpenRegister\Db\Register; +use OCA\OpenRegister\Event\SchemaCreatedEvent; use OCP\AppFramework\Db\Entity; use OCP\AppFramework\Db\QBMapper; use OCP\DB\QueryBuilder\IQueryBuilder; @@ -33,7 +34,7 @@ class RegisterMapper extends QBMapper * @param IEventDispatcher $eventDispatcher The event dispatcher */ public function __construct( - IDBConnection $db, + IDBConnection $db, SchemaMapper $schemaMapper, IEventDispatcher $eventDispatcher ) { @@ -106,6 +107,19 @@ public function findAll(?int $limit = null, ?int $offset = null, ?array $filters return $this->findEntities(query: $qb); } + /** + * @inheritdoc + */ + public function insert(Entity $entity): Entity + { + $entity = parent::insert($entity); + + // Dispatch creation event + $this->eventDispatcher->dispatchTyped(new SchemaCreatedEvent($entity)); + + return $entity; + } + /** * Create a new register from an array of data * @@ -122,16 +136,24 @@ public function createFromArray(array $object): Register } $register = $this->insert(entity: $register); - - // Dispatch creation event - $this->eventDispatcher->dispatch( - RegisterCreatedEvent::class, - new RegisterCreatedEvent($register) - ); return $register; } + /** + * @inheritdoc + */ + public function update(Entity $entity): Entity + { + $oldSchema = $this->find($entity->getId()); + $entity = parent::update($entity); + + // Dispatch update event + $this->eventDispatcher->dispatchTyped(new RegisterUpdatedEvent($entity, $oldSchema)); + + return $entity; + } + /** * Update an existing register from an array of data * @@ -141,8 +163,7 @@ public function createFromArray(array $object): Register */ public function updateFromArray(int $id, array $object): Register { - $oldRegister = $this->find($id); - $newRegister = clone $oldRegister; + $newRegister = $this->find($id); $newRegister->hydrate($object); if (isset($object['version']) === false) { @@ -152,12 +173,6 @@ public function updateFromArray(int $id, array $object): Register } $newRegister = $this->update($newRegister); - - // Dispatch update event - $this->eventDispatcher->dispatch( - RegisterUpdatedEvent::class, - new RegisterUpdatedEvent($newRegister, $oldRegister) - ); return $newRegister; } @@ -168,13 +183,12 @@ public function updateFromArray(int $id, array $object): Register * @param Register $register The register to delete * @return Register The deleted register */ - public function delete(Entity $register): Register + public function delete(Entity $register): Register { $result = parent::delete($register); - + // Dispatch deletion event - $this->eventDispatcher->dispatch( - RegisterDeletedEvent::class, + $this->eventDispatcher->dispatchTyped( new RegisterDeletedEvent($register) ); diff --git a/lib/Db/SchemaMapper.php b/lib/Db/SchemaMapper.php index f62e9ff1d0..9884ec6bb3 100644 --- a/lib/Db/SchemaMapper.php +++ b/lib/Db/SchemaMapper.php @@ -111,6 +111,19 @@ public function findAll(?int $limit = null, ?int $offset = null, ?array $filters return $this->findEntities(query: $qb); } + /** + * @inheritdoc + */ + public function insert(Entity $entity): Entity + { + $entity = parent::insert($entity); + + // Dispatch creation event + $this->eventDispatcher->dispatchTyped(new SchemaCreatedEvent($entity)); + + return $entity; + } + /** * Creates a schema from an array * @@ -127,16 +140,24 @@ public function createFromArray(array $object): Schema } $schema = $this->insert(entity: $schema); - - // Dispatch creation event - $this->eventDispatcher->dispatch( - SchemaCreatedEvent::class, - new SchemaCreatedEvent($schema) - ); return $schema; } + /** + * @inheritdoc + */ + public function update(Entity $entity): Entity + { + $oldSchema = $this->find($entity->getId()); + $entity = parent::update($entity); + + // Dispatch update event + $this->eventDispatcher->dispatchTyped(new SchemaUpdatedEvent($entity, $oldSchema)); + + return $entity; + } + /** * Updates a schema from an array * @@ -146,8 +167,7 @@ public function createFromArray(array $object): Schema */ public function updateFromArray(int $id, array $object): Schema { - $oldSchema = $this->find($id); - $newSchema = clone $oldSchema; + $newSchema = $this->find($id); $newSchema->hydrate($object); if (isset($object['version']) === false) { @@ -157,12 +177,6 @@ public function updateFromArray(int $id, array $object): Schema } $newSchema = $this->update($newSchema); - - // Dispatch update event - $this->eventDispatcher->dispatch( - SchemaUpdatedEvent::class, - new SchemaUpdatedEvent($newSchema, $oldSchema) - ); return $newSchema; } @@ -173,13 +187,12 @@ public function updateFromArray(int $id, array $object): Schema * @param Schema $schema The schema to delete * @return Schema The deleted schema */ - public function delete(Entity $schema): Schema + public function delete(Entity $schema): Schema { $result = parent::delete($schema); - + // Dispatch deletion event - $this->eventDispatcher->dispatch( - SchemaDeletedEvent::class, + $this->eventDispatcher->dispatchTyped( new SchemaDeletedEvent($schema) ); From 23476dfb3ead3061f9d23c8212d81814bd0fcfb8 Mon Sep 17 00:00:00 2001 From: Robert Zondervan Date: Thu, 9 Jan 2025 13:23:45 +0100 Subject: [PATCH 5/5] Small copy fix --- lib/Db/RegisterMapper.php | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/lib/Db/RegisterMapper.php b/lib/Db/RegisterMapper.php index dee62fa75a..b68bfa9b3b 100644 --- a/lib/Db/RegisterMapper.php +++ b/lib/Db/RegisterMapper.php @@ -7,8 +7,6 @@ use OCP\AppFramework\Db\Entity; use OCP\AppFramework\Db\QBMapper; use OCP\DB\QueryBuilder\IQueryBuilder; -use OCA\OpenRegister\Db\SchemaMapper; -use OCA\OpenRegister\Db\Schema; use OCP\IDBConnection; use Symfony\Component\Uid\Uuid; use OCP\EventDispatcher\IEventDispatcher; @@ -115,7 +113,7 @@ public function insert(Entity $entity): Entity $entity = parent::insert($entity); // Dispatch creation event - $this->eventDispatcher->dispatchTyped(new SchemaCreatedEvent($entity)); + $this->eventDispatcher->dispatchTyped(new RegisterCreatedEvent($entity)); return $entity; } @@ -180,16 +178,16 @@ public function updateFromArray(int $id, array $object): Register /** * Delete a register * - * @param Register $register The register to delete + * @param Register $entity The register to delete * @return Register The deleted register */ - public function delete(Entity $register): Register + public function delete(Entity $entity): Register { - $result = parent::delete($register); + $result = parent::delete($entity); // Dispatch deletion event $this->eventDispatcher->dispatchTyped( - new RegisterDeletedEvent($register) + new RegisterDeletedEvent($entity) ); return $result;