Completed
Pull Request — master (#3)
by Raymond
02:23
created

AppendToStreamRequestFactory::__construct()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 9
Code Lines 6

Duplication

Lines 0
Ratio 0 %
Metric Value
dl 0
loc 9
rs 9.6666
cc 2
eloc 6
nc 2
nop 3
1
<?php
2
3
namespace RayRutjes\GetEventStore\Client\Http;
4
5
use GuzzleHttp\Psr7\Request;
6
use Psr\Http\Message\RequestInterface;
7
use RayRutjes\GetEventStore\EventData;
8
use RayRutjes\GetEventStore\EventDataCollection;
9
use RayRutjes\GetEventStore\ExpectedVersion;
10
use RayRutjes\GetEventStore\StreamId;
11
12
final class AppendToStreamRequestFactory implements RequestFactoryInterface
13
{
14
    /**
15
     * @var StreamId
16
     */
17
    private $streamId;
18
19
    /**
20
     * @var ExpectedVersion
21
     */
22
    private $expectedVersion;
23
24
    /**
25
     * @var EventDataCollection
26
     */
27
    private $events;
28
29
    /**
30
     * @param StreamId            $streamId
31
     * @param ExpectedVersion     $expectedVersion
32
     * @param EventDataCollection $events
33
     */
34
    public function __construct(StreamId $streamId, ExpectedVersion $expectedVersion, EventDataCollection $events)
35
    {
36
        if (empty($events)) {
37
            throw new \InvalidArgumentException('No events provided.');
38
        }
39
        $this->streamId = $streamId;
40
        $this->expectedVersion = $expectedVersion;
41
        $this->events = $events;
42
    }
43
44
    /**
45
     * @return RequestInterface
46
     */
47
    public function buildRequest(): RequestInterface
48
    {
49
        return new Request(
50
            'POST',
51
            sprintf('streams/%s', $this->streamId->toString()),
52
            [
53
                RequestHeader::CONTENT_TYPE     => ContentType::JSON_ES,
54
                RequestHeader::EXPECTED_VERSION => $this->expectedVersion->toInt(),
55
            ],
56
            $this->buildBody()
57
        );
58
    }
59
60
    /**
61
     * @return string
62
     */
63
    private function buildBody(): string
64
    {
65
        $data = [];
66
        foreach ($this->events as $event) {
67
            /* @var $event EventData */
68
            $data[] = [
69
                'eventId'   => $event->getEventId()->toString(),
70
                'eventType' => $event->getType(),
71
                'data'      => $event->getData(),
72
                'metadata'  => $event->getMetadata(),
73
            ];
74
        }
75
76
        return json_encode($data);
77
    }
78
}
79