15
15
namespace Kreta \SharedKernel \Infrastructure \Persistence \InMemory \EventStore ;
16
16
17
17
use Kreta \SharedKernel \Domain \Model \AggregateDoesNotExistException ;
18
+ use Kreta \SharedKernel \Domain \Model \DomainEvent ;
18
19
use Kreta \SharedKernel \Domain \Model \DomainEventCollection ;
19
20
use Kreta \SharedKernel \Event \EventStore ;
20
21
use Kreta \SharedKernel \Event \Stream ;
@@ -29,7 +30,7 @@ public function __construct()
29
30
$ this ->store = [];
30
31
}
31
32
32
- public function appendTo (Stream $ stream ) : void
33
+ public function append (Stream $ stream ) : void
33
34
{
34
35
foreach ($ stream ->events () as $ event ) {
35
36
$ content = [];
@@ -52,18 +53,7 @@ public function streamOfName(StreamName $name) : Stream
52
53
$ events = new DomainEventCollection ();
53
54
foreach ($ this ->store as $ event ) {
54
55
if ($ event ['stream_name ' ] === $ name ->name ()) {
55
- $ eventData = json_decode ($ event ['content ' ]);
56
- $ eventReflection = new \ReflectionClass ($ event ['type ' ]);
57
- $ parameters = $ eventReflection ->getConstructor ()->getParameters ();
58
- $ arguments = [];
59
- foreach ($ parameters as $ parameter ) {
60
- foreach ($ eventData as $ key => $ data ) {
61
- if ($ key === $ parameter ->getName ()) {
62
- $ arguments [] = $ data ;
63
- }
64
- }
65
- }
66
- $ events ->add (new $ event ['type ' ](...$ arguments ));
56
+ $ events ->add ($ this ->buildEvent ($ event ));
67
57
}
68
58
}
69
59
if (0 === $ events ->count ()) {
@@ -72,4 +62,42 @@ public function streamOfName(StreamName $name) : Stream
72
62
73
63
return new Stream ($ name , $ events );
74
64
}
65
+
66
+ public function eventsSince (?\DateTimeInterface $ since , int $ offset = 0 , int $ limit = -1 ) : array
67
+ {
68
+ $ since = $ since instanceof \DateTimeInterface ? $ since ->getTimestamp () : 0 ;
69
+
70
+ $ events = array_map (function (array $ event ) use ($ since ) {
71
+ $ domainEvent = $ this ->buildEvent ($ event );
72
+ if ($ domainEvent ->occurredOn ()->getTimestamp () >= $ since ) {
73
+ $ evenContent = json_decode ($ event ['content ' ], true );
74
+ $ evenContent ['occurredOn ' ] = $ domainEvent ->occurredOn ()->getTimestamp ();
75
+
76
+ return [
77
+ 'stream_name ' => $ event ['stream_name ' ],
78
+ 'type ' => $ event ['type ' ],
79
+ 'content ' => $ evenContent ,
80
+ ];
81
+ }
82
+ }, $ this ->store );
83
+
84
+ return array_slice ($ events , $ offset );
85
+ }
86
+
87
+ private function buildEvent (array $ event ) : DomainEvent
88
+ {
89
+ $ eventData = json_decode ($ event ['content ' ]);
90
+ $ eventReflection = new \ReflectionClass ($ event ['type ' ]);
91
+ $ parameters = $ eventReflection ->getConstructor ()->getParameters ();
92
+ $ arguments = [];
93
+ foreach ($ parameters as $ parameter ) {
94
+ foreach ($ eventData as $ key => $ data ) {
95
+ if ($ key === $ parameter ->getName ()) {
96
+ $ arguments [] = $ data ;
97
+ }
98
+ }
99
+ }
100
+
101
+ return new $ event ['type ' ](...$ arguments );
102
+ }
75
103
}
0 commit comments