InMemoryMessageRepository   A
last analyzed

Complexity

Total Complexity 13

Size/Duplication

Total Lines 63
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

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

5 Methods

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