• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

prooph / event-store-client / 9555551525

17 Jun 2024 10:16PM UTC coverage: 70.262% (-1.1%) from 71.395%
9555551525

push

github

prolic
update coveralls repo token

3466 of 4933 relevant lines covered (70.26%)

67.7 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

88.71
/src/ClientOperations/AppendToStreamOperation.php
1
<?php
2

3
/**
4
 * This file is part of `prooph/event-store-client`.
5
 * (c) 2018-2024 Alexander Miertsch <kontakt@codeliner.ws>
6
 * (c) 2018-2024 Sascha-Oliver Prolic <saschaprolic@googlemail.com>
7
 *
8
 * For the full copyright and license information, please view the LICENSE
9
 * file that was distributed with this source code.
10
 */
11

12
declare(strict_types=1);
13

14
namespace Prooph\EventStoreClient\ClientOperations;
15

16
use Amp\DeferredFuture;
17
use Google\Protobuf\Internal\Message;
18
use Prooph\EventStore\EventData;
19
use Prooph\EventStore\Exception\AccessDenied;
20
use Prooph\EventStore\Exception\InvalidTransaction;
21
use Prooph\EventStore\Exception\StreamDeleted;
22
use Prooph\EventStore\Exception\UnexpectedOperationResult;
23
use Prooph\EventStore\Exception\WrongExpectedVersion;
24
use Prooph\EventStore\Position;
25
use Prooph\EventStore\UserCredentials;
26
use Prooph\EventStore\WriteResult;
27
use Prooph\EventStoreClient\Internal\NewEventConverter;
28
use Prooph\EventStoreClient\Messages\ClientMessages\NewEvent;
29
use Prooph\EventStoreClient\Messages\ClientMessages\OperationResult;
30
use Prooph\EventStoreClient\Messages\ClientMessages\WriteEvents;
31
use Prooph\EventStoreClient\Messages\ClientMessages\WriteEventsCompleted;
32
use Prooph\EventStoreClient\SystemData\InspectionDecision;
33
use Prooph\EventStoreClient\SystemData\InspectionResult;
34
use Prooph\EventStoreClient\SystemData\TcpCommand;
35
use Psr\Log\LoggerInterface as Logger;
36

37
/**
38
 * @internal
39
 * @extends AbstractOperation<WriteEventsCompleted, WriteResult>
40
 */
41
class AppendToStreamOperation extends AbstractOperation
42
{
43
    /**
44
     * @param Logger $logger
45
     * @param DeferredFuture $deferred
46
     * @param bool $requireMaster
47
     * @param string $stream
48
     * @param int $expectedVersion
49
     * @param list<EventData> $events
50
     * @param ?UserCredentials $userCredentials
51
     */
52
    public function __construct(
53
        Logger $logger,
54
        DeferredFuture $deferred,
55
        private readonly bool $requireMaster,
56
        private readonly string $stream,
57
        private readonly int $expectedVersion,
58
        private readonly array $events,
59
        ?UserCredentials $userCredentials
60
    ) {
61
        parent::__construct(
344✔
62
            $logger,
344✔
63
            $deferred,
344✔
64
            $userCredentials,
344✔
65
            TcpCommand::WriteEvents,
344✔
66
            TcpCommand::WriteEventsCompleted,
344✔
67
            WriteEventsCompleted::class
344✔
68
        );
344✔
69
    }
70

71
    protected function createRequestDto(): Message
72
    {
73
        $events = \array_map(
343✔
74
            fn (EventData $event): NewEvent => NewEventConverter::convert($event),
343✔
75
            $this->events
343✔
76
        );
343✔
77

78
        $message = new WriteEvents();
343✔
79
        $message->setEventStreamId($this->stream);
343✔
80
        $message->setExpectedVersion($this->expectedVersion);
343✔
81
        $message->setRequireMaster($this->requireMaster);
343✔
82
        $message->setEvents($events);
343✔
83

84
        return $message;
343✔
85
    }
86

87
    /** @param WriteEventsCompleted $response */
88
    protected function inspectResponse(Message $response): InspectionResult
89
    {
90
        switch ($response->getResult()) {
343✔
91
            case OperationResult::Success:
343✔
92
                $this->succeed($response);
333✔
93

94
                return new InspectionResult(InspectionDecision::EndOperation, 'Success');
333✔
95
            case OperationResult::PrepareTimeout:
26✔
96
                return new InspectionResult(InspectionDecision::Retry, 'PrepareTimeout');
×
97
            case OperationResult::ForwardTimeout:
26✔
98
                return new InspectionResult(InspectionDecision::Retry, 'ForwardTimeout');
×
99
            case OperationResult::CommitTimeout:
26✔
100
                return new InspectionResult(InspectionDecision::Retry, 'CommitTimeout');
×
101
            case OperationResult::WrongExpectedVersion:
26✔
102
                $this->fail(WrongExpectedVersion::with(
9✔
103
                    $this->stream,
9✔
104
                    $this->expectedVersion,
9✔
105
                    (int) $response->getCurrentVersion()
9✔
106
                ));
9✔
107

108
                return new InspectionResult(InspectionDecision::EndOperation, 'WrongExpectedVersion');
9✔
109
            case OperationResult::StreamDeleted:
17✔
110
                $exception = StreamDeleted::with($this->stream);
7✔
111
                $this->fail($exception);
7✔
112

113
                return new InspectionResult(InspectionDecision::EndOperation, 'StreamDeleted');
7✔
114
            case OperationResult::InvalidTransaction:
10✔
115
                $exception = new InvalidTransaction();
×
116
                $this->fail($exception);
×
117

118
                return new InspectionResult(InspectionDecision::EndOperation, 'InvalidTransaction');
×
119
            case OperationResult::AccessDenied:
10✔
120
                $exception = AccessDenied::toStream($this->stream);
10✔
121
                $this->fail($exception);
10✔
122

123
                return new InspectionResult(InspectionDecision::EndOperation, 'AccessDenied');
10✔
124
            default:
125
                throw new UnexpectedOperationResult();
×
126
        }
127
    }
128

129
    /** @param WriteEventsCompleted $response */
130
    protected function transformResponse(Message $response): WriteResult
131
    {
132
        /** @psalm-suppress DocblockTypeContradiction */
133
        return new WriteResult(
333✔
134
            (int) $response->getLastEventNumber(),
333✔
135
            new Position(
333✔
136
                (int) ($response->getCommitPosition() ?? -1),
333✔
137
                (int) ($response->getPreparePosition() ?? -1)
333✔
138
            )
333✔
139
        );
333✔
140
    }
141

142
    public function name(): string
143
    {
144
        return 'AppendToStream';
343✔
145
    }
146

147
    public function __toString(): string
148
    {
149
        return \sprintf(
343✔
150
            'Stream: %s, ExpectedVersion: %d, RequireMaster: %s',
343✔
151
            $this->stream,
343✔
152
            $this->expectedVersion,
343✔
153
            $this->requireMaster ? 'yes' : 'no'
343✔
154
        );
343✔
155
    }
156
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc