Skip to content

Commit a635d1f

Browse files
committed
repository can return aggregate version after handling which can be passed as TargetVersion for further processing in case of synchronous workflow
1 parent 82ee991 commit a635d1f

40 files changed

+1162
-19
lines changed
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
<?php
2+
3+
namespace Test\Ecotone\Dbal\Fixture\StatefulWorkflow;
4+
5+
use Ecotone\Messaging\Attribute\Asynchronous;
6+
use Ecotone\Messaging\Attribute\Parameter\Header;
7+
use Ecotone\Messaging\Attribute\Parameter\Payload;
8+
use Ecotone\Modelling\Attribute\CommandHandler;
9+
use Ecotone\Modelling\Attribute\EventSourcingHandler;
10+
use Ecotone\Modelling\Attribute\Identifier;
11+
use Ecotone\Modelling\Attribute\QueryHandler;
12+
use Ecotone\Modelling\Attribute\Saga;
13+
use Ecotone\Modelling\WithEvents;
14+
15+
#[Saga]
16+
class AsyncCycle
17+
{
18+
use WithEvents;
19+
20+
/**
21+
* @var list<string>
22+
*/
23+
private array $audits = [];
24+
25+
/**
26+
* @var list<string>
27+
*/
28+
private array $certificates = [];
29+
30+
public function __construct(
31+
#[Identifier] private string $cycleId
32+
) {
33+
}
34+
35+
#[CommandHandler(
36+
routingKey: 'asyncCycle.submitAnAudit',
37+
outputChannelName: 'asyncCycle.validateAnAudit',
38+
identifierMetadataMapping: ['cycleId' => 'cycleId'],
39+
)]
40+
public static function startCycleBySubmittingAnAudit(
41+
#[Header('cycleId')] string $cycleId
42+
): self {
43+
return new self($cycleId);
44+
}
45+
46+
#[CommandHandler(
47+
routingKey: 'asyncCycle.submitAnAudit',
48+
outputChannelName: 'asyncCycle.validateAnAudit',
49+
identifierMetadataMapping: ['cycleId' => 'cycleId'],
50+
)]
51+
public function submitAnAudit(#[Header('audit')] Audit $audit): Audit
52+
{
53+
return $audit;
54+
}
55+
56+
#[CommandHandler(
57+
routingKey: 'asyncCycle.validateAnAudit',
58+
outputChannelName: 'asyncCycle.conductAnAudit'
59+
)]
60+
public function validateAnAudit(#[Header('audit')] Audit $audit): Audit
61+
{
62+
// some validations
63+
64+
return $audit;
65+
}
66+
67+
#[CommandHandler(
68+
routingKey: 'asyncCycle.conductAnAudit',
69+
outputChannelName: 'asyncCycle.issueACertificate'
70+
)]
71+
public function conductAnAudit(#[Payload] Audit $audit): ?Certificate
72+
{
73+
$this->audits[] = $audit->auditId;
74+
$this->recordThat(new AuditConducted($this->cycleId, $audit->auditId));
75+
76+
return $audit->certificate;
77+
}
78+
79+
#[CommandHandler(
80+
routingKey: 'asyncCycle.issueACertificate',
81+
endpointId: 'asyncCycle.issueACertificate.endpoint'
82+
)]
83+
#[Asynchronous('cycle')]
84+
public function issueACertificate(#[Payload] Certificate $certificate): void
85+
{
86+
$this->certificates[] = $certificate->certificateId;
87+
$this->recordThat(new CertificateIssued($this->cycleId, $certificate->certificateId));
88+
}
89+
90+
#[QueryHandler('asyncCycle.conductedAudits')]
91+
public function conductedAudits(): array
92+
{
93+
return $this->audits;
94+
}
95+
96+
#[QueryHandler('asyncCycle.issuedCertificates')]
97+
public function issuedCertificates(): array
98+
{
99+
return $this->certificates;
100+
}
101+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?php
2+
3+
namespace Test\Ecotone\Dbal\Fixture\StatefulWorkflow;
4+
5+
use Ecotone\Messaging\Attribute\BusinessMethod;
6+
use Ecotone\Messaging\Attribute\Parameter\Header;
7+
use Ecotone\Modelling\Attribute\Identifier;
8+
9+
interface AsyncCycleGateway
10+
{
11+
#[BusinessMethod('asyncCycle.submitAnAudit')]
12+
public function submitAnAudit(#[Header('cycleId')] $cycleId, #[Header('audit')] Audit $audit): void;
13+
14+
#[BusinessMethod('asyncCycle.conductedAudits')]
15+
public function conductedAudits(#[Identifier] $cycleId): array;
16+
17+
#[BusinessMethod('asyncCycle.issuedCertificates')]
18+
public function issuedCertificates(#[Identifier] $cycleId): array;
19+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?php
2+
3+
namespace Test\Ecotone\Dbal\Fixture\StatefulWorkflow;
4+
5+
class Audit
6+
{
7+
public function __construct(
8+
public string $auditId,
9+
public ?Certificate $certificate = null,
10+
) {
11+
}
12+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?php
2+
3+
namespace Test\Ecotone\Dbal\Fixture\StatefulWorkflow;
4+
5+
use Ecotone\Modelling\Attribute\NamedEvent;
6+
7+
#[NamedEvent(self::NAME)]
8+
class AuditConducted
9+
{
10+
public const NAME = 'cycle.auditConducted';
11+
12+
public function __construct(public string $cycleId, public string $auditId)
13+
{
14+
}
15+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?php
2+
3+
namespace Test\Ecotone\Dbal\Fixture\StatefulWorkflow;
4+
5+
class Certificate
6+
{
7+
public function __construct(public string $certificateId)
8+
{
9+
}
10+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?php
2+
3+
namespace Test\Ecotone\Dbal\Fixture\StatefulWorkflow;
4+
5+
use Ecotone\Modelling\Attribute\NamedEvent;
6+
7+
#[NamedEvent(self::NAME)]
8+
class CertificateIssued
9+
{
10+
public const NAME = 'cycle.certificateIssued';
11+
12+
public function __construct(public string $cycleId, public string $certificateId)
13+
{
14+
}
15+
}
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
<?php
2+
3+
namespace Test\Ecotone\Dbal\Fixture\StatefulWorkflow;
4+
5+
use Ecotone\Messaging\Attribute\Parameter\Header;
6+
use Ecotone\Messaging\Attribute\Parameter\Payload;
7+
use Ecotone\Modelling\Attribute\CommandHandler;
8+
use Ecotone\Modelling\Attribute\EventSourcingHandler;
9+
use Ecotone\Modelling\Attribute\Identifier;
10+
use Ecotone\Modelling\Attribute\QueryHandler;
11+
use Ecotone\Modelling\Attribute\Saga;
12+
use Ecotone\Modelling\WithEvents;
13+
14+
#[Saga]
15+
class Cycle
16+
{
17+
use WithEvents;
18+
19+
/**
20+
* @var list<string>
21+
*/
22+
private array $audits = [];
23+
24+
/**
25+
* @var list<string>
26+
*/
27+
private array $certificates = [];
28+
29+
public function __construct(
30+
#[Identifier] private string $cycleId
31+
) {
32+
}
33+
34+
#[CommandHandler(
35+
routingKey: 'cycle.submitAnAudit',
36+
outputChannelName: 'cycle.validateAnAudit',
37+
identifierMetadataMapping: ['cycleId' => 'cycleId'],
38+
)]
39+
public static function startCycleBySubmittingAnAudit(
40+
#[Header('cycleId')] string $cycleId
41+
): self {
42+
return new self($cycleId);
43+
}
44+
45+
#[CommandHandler(
46+
routingKey: 'cycle.submitAnAudit',
47+
outputChannelName: 'cycle.validateAnAudit',
48+
identifierMetadataMapping: ['cycleId' => 'cycleId'],
49+
)]
50+
public function submitAnAudit(#[Header('audit')] Audit $audit): Audit
51+
{
52+
return $audit;
53+
}
54+
55+
#[CommandHandler(
56+
routingKey: 'cycle.validateAnAudit',
57+
outputChannelName: 'cycle.conductAnAudit'
58+
)]
59+
public function validateAnAudit(#[Header('audit')] Audit $audit): Audit
60+
{
61+
// some validations
62+
63+
return $audit;
64+
}
65+
66+
#[CommandHandler(
67+
routingKey: 'cycle.conductAnAudit',
68+
outputChannelName: 'cycle.issueACertificate'
69+
)]
70+
public function conductAnAudit(#[Payload] Audit $audit): ?Certificate
71+
{
72+
$this->audits[] = $audit->auditId;
73+
$this->recordThat(new AuditConducted($this->cycleId, $audit->auditId));
74+
75+
return $audit->certificate;
76+
}
77+
78+
#[CommandHandler(
79+
routingKey: 'cycle.issueACertificate',
80+
)]
81+
public function issueACertificate(#[Payload] Certificate $certificate): void
82+
{
83+
$this->certificates[] = $certificate->certificateId;
84+
$this->recordThat(new CertificateIssued($this->cycleId, $certificate->certificateId));
85+
}
86+
87+
#[QueryHandler('cycle.conductedAudits')]
88+
public function conductedAudits(): array
89+
{
90+
return $this->audits;
91+
}
92+
93+
#[QueryHandler('cycle.issuedCertificates')]
94+
public function issuedCertificates(): array
95+
{
96+
return $this->certificates;
97+
}
98+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?php
2+
3+
namespace Test\Ecotone\Dbal\Fixture\StatefulWorkflow;
4+
5+
use Ecotone\Messaging\Attribute\BusinessMethod;
6+
use Ecotone\Messaging\Attribute\Parameter\Header;
7+
use Ecotone\Modelling\Attribute\Identifier;
8+
9+
interface CycleGateway
10+
{
11+
#[BusinessMethod('cycle.submitAnAudit')]
12+
public function submitAnAudit(#[Header('cycleId')] $cycleId, #[Header('audit')] Audit $audit): void;
13+
14+
#[BusinessMethod('cycle.conductedAudits')]
15+
public function conductedAudits(#[Identifier] $cycleId): array;
16+
17+
#[BusinessMethod('cycle.issuedCertificates')]
18+
public function issuedCertificates(#[Identifier] $cycleId): array;
19+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?php
2+
3+
namespace Test\Ecotone\Dbal\Fixture\StatefulWorkflow;
4+
5+
use Ecotone\Modelling\Attribute\NamedEvent;
6+
7+
#[NamedEvent(self::NAME)]
8+
class CycleStarted
9+
{
10+
public const NAME = 'cycle.started';
11+
12+
public function __construct(public string $cycleId)
13+
{
14+
}
15+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
<?php
2+
3+
namespace Test\Ecotone\Dbal\Fixture\StatefulWorkflow;
4+
5+
use Ecotone\Messaging\Attribute\Converter;
6+
7+
class EventsConverters
8+
{
9+
#[Converter]
10+
public function convertFromCycleStarted(CycleStarted $event): array
11+
{
12+
return [
13+
'cycleId' => $event->cycleId,
14+
];
15+
}
16+
17+
#[Converter]
18+
public function convertToCycleStarted(array $payload): CycleStarted
19+
{
20+
return new CycleStarted($payload['cycleId']);
21+
}
22+
23+
#[Converter]
24+
public function convertFromAuditConducted(AuditConducted $event): array
25+
{
26+
return [
27+
'cycleId' => $event->cycleId,
28+
'auditId' => $event->auditId,
29+
];
30+
}
31+
32+
#[Converter]
33+
public function convertToAuditConducted(array $payload): AuditConducted
34+
{
35+
return new AuditConducted($payload['cycleId'], $payload['auditId']);
36+
}
37+
38+
#[Converter]
39+
public function convertFromCertificateIssued(CertificateIssued $event): array
40+
{
41+
return [
42+
'cycleId' => $event->cycleId,
43+
'certificateId' => $event->certificateId,
44+
];
45+
}
46+
47+
#[Converter]
48+
public function convertToCertificateIssued(array $payload): CertificateIssued
49+
{
50+
return new CertificateIssued($payload['cycleId'], $payload['certificateId']);
51+
}
52+
}

0 commit comments

Comments
 (0)