Completed
Pull Request — master (#66)
by Frank
07:06 queued 04:59
created

InMemoryMessageRepository   A

Complexity

Total Complexity 13

Size/Duplication

Total Lines 63
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 3
Bugs 0 Features 0
Metric Value
eloc 22
c 3
b 0
f 0
dl 0
loc 63
rs 10
ccs 16
cts 16
cp 1
wmc 13

5 Methods

Rating   Name   Duplication   Size   Complexity  
A purgeLastCommit() 0 3 1
A persist() 0 8 2
A lastCommit() 0 3 1
A retrieveAll() 0 12 4
A retrieveAllAfterVersion() 0 13 5
1
<?php
2
3
declare(strict_types=1);
4
5
namespace EventSauce\EventSourcing;
6
7
use Generator;
8
9
final class InMemoryMessageRepository implements MessageRepository
10
{
11
    /**
12
     * @var Message[]
13
     */
14
    private $messages = [];
15
16
    /**
17
     * @var object[]
18
     */
19
    private $lastCommit = [];
20
21
    /**
22
     * @return object[]
23
     */
24 8
    public function lastCommit(): array
25
    {
26 8
        return $this->lastCommit;
27
    }
28
29 8
    public function purgeLastCommit(): void
30
    {
31 8
        $this->lastCommit = [];
32 8
    }
33
34 9
    public function persist(Message ...$messages): void
35
    {
36 9
        $this->lastCommit = [];
37
38
        /* @var Message $event */
39 9
        foreach ($messages as $message) {
40 5
            $this->messages[] = $message;
41 5
            $this->lastCommit[] = $message->event();
42
        }
43 9
    }
44
45 8
    public function retrieveAll(AggregateRootId $id): Generator
46
    {
47 8
        $lastMessage = null;
48 3
49 2
        foreach ($this->messages as $message) {
50
            if ($id->toString() === $message->header(Header::AGGREGATE_ROOT_ID)->toString()) {
51
                yield $message;
52
                $lastMessage = $message;
53 8
            }
54
        }
55
56
        return $lastMessage instanceof Message ? $lastMessage->aggregateVersion() : 0;
57
    }
58
59
    public function retrieveAllAfterVersion(AggregateRootId $id, int $aggregateRootVersion): Generator
60
    {
61
        $lastMessage = null;
62
63
        foreach ($this->messages as $message) {
64
            if ($id->toString() === $message->header(Header::AGGREGATE_ROOT_ID)->toString()
65
                && $message->header(Header::AGGREGATE_ROOT_VERSION) > $aggregateRootVersion) {
66
                yield $message;
67
                $lastMessage = $message;
68
            }
69
        }
70
71
        return $lastMessage instanceof Message ? $lastMessage->aggregateVersion() : 0;
72
    }
73
}
74