Generates Idempotent Consumer components for PHP 8.4. Creates message deduplication infrastructure with idempotency key management, storage backends, middleware, and unit tests.
From accnpx claudepluginhub dykyi-roman/awesome-claude-code --plugin accThis skill uses the workspace's default tool permissions.
references/examples.mdreferences/templates.mdCreates Idempotent Consumer pattern infrastructure for exactly-once message processing guarantees.
| Scenario | Example |
|---|---|
| Payment processing | Prevent double charges on message replay |
| Inventory updates | Avoid duplicate stock deductions |
| Event handlers | Process domain events exactly once |
| Webhook processing | Handle duplicate webhook deliveries |
| Message queue consumers | Deduplicate redelivered messages |
Determine:
Domain Layer (src/Domain/Shared/Idempotency/)
IdempotencyKey.php — Key value objectProcessingResult.php — Result value object with statusProcessingStatus.php — Status enum (Processed/Duplicate/Failed)Application Layer (src/Application/Shared/Idempotency/)
IdempotencyStoreInterface.php — Storage portIdempotentConsumerMiddleware.php — Middleware wrapperInfrastructure Layer (src/Infrastructure/Idempotency/)
DatabaseIdempotencyStore.php — PDO implementationRedisIdempotencyStore.php — Redis implementationTests
IdempotencyKeyTest.phpProcessingResultTest.phpIdempotentConsumerMiddlewareTest.phpDatabaseIdempotencyStoreTest.php| Layer | Path |
|---|---|
| Domain Types | src/Domain/Shared/Idempotency/ |
| Application Port | src/Application/Shared/Idempotency/ |
| Infrastructure | src/Infrastructure/Idempotency/ |
| Unit Tests | tests/Unit/{Layer}/{Path}/ |
| Component | Pattern | Example |
|---|---|---|
| Key VO | IdempotencyKey | IdempotencyKey |
| Result VO | ProcessingResult | ProcessingResult |
| Status Enum | ProcessingStatus | ProcessingStatus |
| Store Interface | IdempotencyStoreInterface | IdempotencyStoreInterface |
| DB Store | DatabaseIdempotencyStore | DatabaseIdempotencyStore |
| Redis Store | RedisIdempotencyStore | RedisIdempotencyStore |
| Middleware | IdempotentConsumerMiddleware | IdempotentConsumerMiddleware |
| Test | {ClassName}Test | IdempotencyKeyTest |
final readonly class IdempotencyKey
{
public function __construct(
public string $messageId,
public string $handlerName,
) {}
public static function fromMessage(string $messageId, string $handlerName): self;
public function toString(): string;
public function equals(self $other): bool;
}
interface IdempotencyStoreInterface
{
public function has(IdempotencyKey $key): bool;
public function mark(IdempotencyKey $key, \DateTimeImmutable $expiresAt): void;
public function remove(IdempotencyKey $key): void;
}
$middleware = new IdempotentConsumerMiddleware($store);
$result = $middleware->process(
key: IdempotencyKey::fromMessage($message->id, 'handle_payment'),
handler: fn() => $paymentHandler->handle($message),
ttl: new \DateTimeImmutable('+7 days')
);
match ($result->status) {
ProcessingStatus::Processed => $logger->info('Processed'),
ProcessingStatus::Duplicate => $logger->info('Skipped duplicate'),
ProcessingStatus::Failed => $logger->error('Failed', ['error' => $result->error]),
};
CREATE TABLE idempotency_keys (
key VARCHAR(255) PRIMARY KEY,
handler_name VARCHAR(255) NOT NULL,
processed_at TIMESTAMP(6) NOT NULL,
expires_at TIMESTAMP(6) NOT NULL
);
CREATE INDEX idx_idempotency_expires ON idempotency_keys (expires_at);
For complete PHP templates and test examples, see:
references/templates.md — All component templatesreferences/examples.md — Payment handler example and unit testsProvides UI/UX resources: 50+ styles, color palettes, font pairings, guidelines, charts for web/mobile across React, Next.js, Vue, Svelte, Tailwind, React Native, Flutter. Aids planning, building, reviewing interfaces.