From a4b73cc997c53dfa5aa39e75fd70bb3a8da64fe9 Mon Sep 17 00:00:00 2001 From: viktorprogger Date: Wed, 25 Jun 2025 19:25:18 +0500 Subject: [PATCH 1/5] Add a middleware for automatic ID creation for messages before push --- .../Push/Implementation/IdMiddleware.php | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 src/Middleware/Push/Implementation/IdMiddleware.php diff --git a/src/Middleware/Push/Implementation/IdMiddleware.php b/src/Middleware/Push/Implementation/IdMiddleware.php new file mode 100644 index 00000000..78e30bb5 --- /dev/null +++ b/src/Middleware/Push/Implementation/IdMiddleware.php @@ -0,0 +1,25 @@ +getMessage()->getMetadata()[IdEnvelope::MESSAGE_ID_KEY] ?? null) === null) { + $request = $request->withMessage(new IdEnvelope($request->getMessage(), uniqid('yii3-message-', true))); + } + + return $handler->handlePush($request); + } +} From 9e539fe1e110db9c399df58c3a664fc83da836b8 Mon Sep 17 00:00:00 2001 From: viktorprogger Date: Fri, 27 Jun 2025 18:22:53 +0500 Subject: [PATCH 2/5] Add tests --- .../Push/Implementation/IdMiddlewareTest.php | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 tests/Unit/Middleware/Push/Implementation/IdMiddlewareTest.php diff --git a/tests/Unit/Middleware/Push/Implementation/IdMiddlewareTest.php b/tests/Unit/Middleware/Push/Implementation/IdMiddlewareTest.php new file mode 100644 index 00000000..97474ff5 --- /dev/null +++ b/tests/Unit/Middleware/Push/Implementation/IdMiddlewareTest.php @@ -0,0 +1,51 @@ + 'test-id']); + $originalRequest = new PushRequest($message, null); + $handler = $this->createMock(MessageHandlerPushInterface::class); + + $handler->expects($this->once()) + ->method('handlePush') + ->willReturnArgument(0); + + $middleware = new IdMiddleware(); + $finalRequest = $middleware->processPush($originalRequest, $handler); + + $this->assertSame($originalRequest, $finalRequest); + $this->assertNotInstanceOf(IdEnvelope::class, $finalRequest->getMessage()); + $this->assertEquals('test-id', $finalRequest->getMessage()->getMetadata()[IdEnvelope::MESSAGE_ID_KEY]); + } + + public function testWithoutId(): void + { + $message = new Message('test', null); + $originalRequest = new PushRequest($message, null); + $handler = $this->createMock(MessageHandlerPushInterface::class); + + $handler->expects($this->once()) + ->method('handlePush') + ->willReturnArgument(0); + + $middleware = new IdMiddleware(); + $finalRequest = $middleware->processPush($originalRequest, $handler); + + $this->assertInstanceOf(IdEnvelope::class, $finalRequest->getMessage()); + $this->assertNotSame($originalRequest, $finalRequest); + $this->assertNotEmpty($finalRequest->getMessage()->getMetadata()[IdEnvelope::MESSAGE_ID_KEY] ?? null); + } +} From 51964d43f3d223eb006ce593ad0365d9163256c0 Mon Sep 17 00:00:00 2001 From: Viktor Babanov Date: Fri, 27 Jun 2025 18:33:55 +0500 Subject: [PATCH 3/5] Update src/Middleware/Push/Implementation/IdMiddleware.php Co-authored-by: Alexander Makarov --- src/Middleware/Push/Implementation/IdMiddleware.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Middleware/Push/Implementation/IdMiddleware.php b/src/Middleware/Push/Implementation/IdMiddleware.php index 78e30bb5..387683f4 100644 --- a/src/Middleware/Push/Implementation/IdMiddleware.php +++ b/src/Middleware/Push/Implementation/IdMiddleware.php @@ -10,7 +10,7 @@ use Yiisoft\Queue\Middleware\Push\MessageHandlerPushInterface; /** - * A middleware interface for message ID setting. It must be implemented in an adapter package or in a project. + * A middleware for message ID setting. */ final class IdMiddleware implements MiddlewarePushInterface { From 862a802b5cfc267cded2b886a4ef4828282c963d Mon Sep 17 00:00:00 2001 From: viktorprogger Date: Fri, 27 Jun 2025 18:36:41 +0500 Subject: [PATCH 4/5] More precious tests --- .../Unit/Middleware/Push/Implementation/IdMiddlewareTest.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/Unit/Middleware/Push/Implementation/IdMiddlewareTest.php b/tests/Unit/Middleware/Push/Implementation/IdMiddlewareTest.php index 97474ff5..c2f72513 100644 --- a/tests/Unit/Middleware/Push/Implementation/IdMiddlewareTest.php +++ b/tests/Unit/Middleware/Push/Implementation/IdMiddlewareTest.php @@ -29,6 +29,8 @@ public function testWithId(): void $this->assertSame($originalRequest, $finalRequest); $this->assertNotInstanceOf(IdEnvelope::class, $finalRequest->getMessage()); $this->assertEquals('test-id', $finalRequest->getMessage()->getMetadata()[IdEnvelope::MESSAGE_ID_KEY]); + $this->assertSame($originalRequest->getMessage()->getData(), $finalRequest->getMessage()->getData()); + $this->assertSame($originalRequest->getMessage()->getHandlerName(), $finalRequest->getMessage()->getHandlerName()); } public function testWithoutId(): void @@ -47,5 +49,7 @@ public function testWithoutId(): void $this->assertInstanceOf(IdEnvelope::class, $finalRequest->getMessage()); $this->assertNotSame($originalRequest, $finalRequest); $this->assertNotEmpty($finalRequest->getMessage()->getMetadata()[IdEnvelope::MESSAGE_ID_KEY] ?? null); + $this->assertSame($originalRequest->getMessage()->getData(), $finalRequest->getMessage()->getData()); + $this->assertSame($originalRequest->getMessage()->getHandlerName(), $finalRequest->getMessage()->getHandlerName()); } } From ea8387fc8fe60e27491818ab207e155d7744127a Mon Sep 17 00:00:00 2001 From: viktorprogger Date: Fri, 27 Jun 2025 18:38:15 +0500 Subject: [PATCH 5/5] Fix message id chacking --- src/Middleware/Push/Implementation/IdMiddleware.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Middleware/Push/Implementation/IdMiddleware.php b/src/Middleware/Push/Implementation/IdMiddleware.php index 387683f4..cd086d96 100644 --- a/src/Middleware/Push/Implementation/IdMiddleware.php +++ b/src/Middleware/Push/Implementation/IdMiddleware.php @@ -16,7 +16,8 @@ final class IdMiddleware implements MiddlewarePushInterface { public function processPush(PushRequest $request, MessageHandlerPushInterface $handler): PushRequest { - if (($request->getMessage()->getMetadata()[IdEnvelope::MESSAGE_ID_KEY] ?? null) === null) { + $meta = $request->getMessage()->getMetadata(); + if (empty($meta[IdEnvelope::MESSAGE_ID_KEY])) { $request = $request->withMessage(new IdEnvelope($request->getMessage(), uniqid('yii3-message-', true))); }