Skip to content

Commit

Permalink
Convert envelope trait to abstract class
Browse files Browse the repository at this point in the history
  • Loading branch information
viktorprogger committed Dec 15, 2024
1 parent 8af373f commit 8700123
Show file tree
Hide file tree
Showing 8 changed files with 25 additions and 68 deletions.
28 changes: 7 additions & 21 deletions src/Message/EnvelopeTrait.php → src/Message/Envelope.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,33 +4,22 @@

namespace Yiisoft\Queue\Message;

trait EnvelopeTrait
abstract class Envelope implements EnvelopeInterface
{
private MessageInterface $message;

/**
* A mirror of {@see MessageInterface::fromData()}
*/
abstract public static function fromMessage(MessageInterface $message): self;
public function __construct(protected MessageInterface $message)
{
}

public static function fromData(string $handlerName, mixed $data, array $metadata = []): MessageInterface
{
return self::fromMessage(Message::fromData($handlerName, $data, $metadata));
return static::fromMessage(Message::fromData($handlerName, $data, $metadata));
}

public function getMessage(): MessageInterface
{
return $this->message;
}

public function withMessage(MessageInterface $message): self
{
$instance = clone $this;
$instance->message = $message;

return $instance;
}

public function getHandlerName(): string
{
return $this->message->getHandlerName();
Expand All @@ -48,15 +37,12 @@ public function getMetadata(): array
[
self::ENVELOPE_STACK_KEY => array_merge(
$this->message->getMetadata()[self::ENVELOPE_STACK_KEY] ?? [],
[self::class],
[static::class],
),
],
$this->getEnvelopeMetadata(),
);
}

public function getEnvelopeMetadata(): array
{
return [];
}
abstract protected function getEnvelopeMetadata(): array;
}
2 changes: 0 additions & 2 deletions src/Message/EnvelopeInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,4 @@ interface EnvelopeInterface extends MessageInterface
public static function fromMessage(MessageInterface $message): self;

public function getMessage(): MessageInterface;

public function withMessage(MessageInterface $message): self;
}
16 changes: 5 additions & 11 deletions src/Message/IdEnvelope.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,34 +7,28 @@
/**
* ID envelope allows to identify a message.
*/
final class IdEnvelope implements EnvelopeInterface
final class IdEnvelope extends Envelope
{
use EnvelopeTrait;

public const MESSAGE_ID_KEY = 'yii-message-id';

public function __construct(
private MessageInterface $message,
private string|int|null $id = null,
MessageInterface $message,
private readonly string|int|null $id,
) {
parent::__construct($message);
}

public static function fromMessage(MessageInterface $message): self
{
return new self($message, $message->getMetadata()[self::MESSAGE_ID_KEY] ?? null);
}

public function setId(string|int|null $id): void
{
$this->id = $id;
}

public function getId(): string|int|null
{
return $this->id ?? $this->message->getMetadata()[self::MESSAGE_ID_KEY] ?? null;
}

private function getEnvelopeMetadata(): array
protected function getEnvelopeMetadata(): array
{
return [self::MESSAGE_ID_KEY => $this->getId()];
}
Expand Down
10 changes: 1 addition & 9 deletions src/Message/Message.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@
final class Message implements MessageInterface
{
/**
* @param string $handlerName A name of a handler which should handle this message.
* @param mixed $data Message data, encodable by a queue adapter
* @param array $metadata Message metadata, encodable by a queue adapter
* @param string|null $id Message id
*/
public function __construct(
private string $handlerName,
Expand Down Expand Up @@ -37,12 +37,4 @@ public function getMetadata(): array
{
return $this->metadata;
}

public function withMetadata(array $metadata): self
{
$instance = clone $this;
$instance->metadata = $metadata;

return $instance;
}
}
6 changes: 0 additions & 6 deletions src/Message/MessageInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,22 +10,16 @@ public static function fromData(string $handlerName, mixed $data, array $metadat

/**
* Returns handler name.
*
* @return string
*/
public function getHandlerName(): string;

/**
* Returns payload data.
*
* @return mixed
*/
public function getData(): mixed;

/**
* Returns message metadata: timings, attempts count, metrics, etc.
*
* @return array
*/
public function getMetadata(): array;
}
20 changes: 8 additions & 12 deletions src/Middleware/FailureHandling/FailureEnvelope.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,32 +4,28 @@

namespace Yiisoft\Queue\Middleware\FailureHandling;

use Yiisoft\Queue\Message\EnvelopeInterface;
use Yiisoft\Queue\Message\EnvelopeTrait;
use Yiisoft\Arrays\ArrayHelper;
use Yiisoft\Queue\Message\Envelope;
use Yiisoft\Queue\Message\MessageInterface;

final class FailureEnvelope implements EnvelopeInterface
final class FailureEnvelope extends Envelope
{
use EnvelopeTrait;

public const FAILURE_META_KEY = 'failure-meta';

public function __construct(
private MessageInterface $message,
private array $meta = [],
MessageInterface $message,
private readonly array $failureMeta = [],
) {
parent::__construct($message);
}

public static function fromMessage(MessageInterface $message): self
{
return new self($message, $message->getMetadata()[self::FAILURE_META_KEY] ?? []);
}

public function getMetadata(): array
protected function getEnvelopeMetadata(): array
{
$meta = $this->message->getMetadata();
$meta[self::FAILURE_META_KEY] = array_merge($meta[self::FAILURE_META_KEY] ?? [], $this->meta);

return $meta;
return [self::FAILURE_META_KEY => ArrayHelper::merge($this->message->getMetadata()[self::FAILURE_META_KEY] ?? [], $this->failureMeta)];
}
}
2 changes: 1 addition & 1 deletion tests/Unit/Message/JsonMessageSerializerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,7 @@ public function testRestoreOriginalMessageClass(): void

public function testRestoreOriginalMessageClassWithEnvelope(): void
{
$message = new IdEnvelope(new TestMessage());
$message = new IdEnvelope(new TestMessage(), 1);
$serializer = $this->createSerializer();
$serializer->unserialize($serializer->serialize($message));

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -151,9 +151,6 @@ public function testQueueSendingStrategies(
$this->expectExceptionMessage('testException');
}

$metaInitial = [FailureEnvelope::FAILURE_META_KEY => $metaInitial];
$metaResult = [FailureEnvelope::FAILURE_META_KEY => $metaResult];

$handler = $this->getHandler($metaResult, $suites);
$queue = $this->getPreparedQueue($metaResult, $suites);

Expand All @@ -162,7 +159,7 @@ public function testQueueSendingStrategies(
new Message(
'test',
null,
$metaInitial
[FailureEnvelope::FAILURE_META_KEY => $metaInitial]
),
new Exception('testException'),
$queue
Expand Down Expand Up @@ -194,7 +191,7 @@ private function getHandler(array $metaResult, bool $suites): MessageFailureHand
$pipelineAssertion = static function (FailureHandlingRequest $request) use (
$metaResult
): FailureHandlingRequest {
Assert::assertEquals($metaResult, $request->getMessage()->getMetadata());
Assert::assertEquals($metaResult, $request->getMessage()->getMetadata()[FailureEnvelope::FAILURE_META_KEY] ?? []);

throw $request->getException();
};
Expand All @@ -209,7 +206,7 @@ private function getHandler(array $metaResult, bool $suites): MessageFailureHand
private function getPreparedQueue(array $metaResult, bool $suites): QueueInterface
{
$queueAssertion = static function (MessageInterface $message) use ($metaResult): MessageInterface {
Assert::assertEquals($metaResult, $message->getMetadata());
Assert::assertEquals($metaResult, $message->getMetadata()[FailureEnvelope::FAILURE_META_KEY] ?? []);

return $message;
};
Expand Down

0 comments on commit 8700123

Please sign in to comment.