TicketRecord::handleTicketReleased()   A
last analyzed

Complexity

Conditions 2
Paths 4

Size

Total Lines 8
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 6

Importance

Changes 0
Metric Value
cc 2
eloc 5
nc 4
nop 1
dl 0
loc 8
ccs 0
cts 5
cp 0
crap 6
rs 9.4285
c 0
b 0
f 0
1
<?php
2
3
namespace ConferenceTools\Tickets\Domain\Projection;
4
5
use Carnage\Cqrs\MessageHandler\AbstractMethodNameMessageHandler;
6
use Doctrine\ORM\EntityManagerInterface;
7
use ConferenceTools\Tickets\Domain\Event\Ticket\DiscountCodeApplied;
8
use ConferenceTools\Tickets\Domain\Event\Ticket\TicketAssigned;
9
use ConferenceTools\Tickets\Domain\Event\Ticket\TicketCancelled;
10
use ConferenceTools\Tickets\Domain\Event\Ticket\TicketPurchaseCreated;
11
use ConferenceTools\Tickets\Domain\Event\Ticket\TicketPurchasePaid;
12
use ConferenceTools\Tickets\Domain\Event\Ticket\TicketPurchaseTimedout;
13
use ConferenceTools\Tickets\Domain\Event\Ticket\TicketPurchaseTotalPriceCalculated;
14
use ConferenceTools\Tickets\Domain\Event\Ticket\TicketReleased;
15
use ConferenceTools\Tickets\Domain\Event\Ticket\TicketReserved;
16
use ConferenceTools\Tickets\Domain\ReadModel\TicketRecord\PurchaseRecord;
17
use ConferenceTools\Tickets\Domain\ReadModel\TicketRecord\TicketRecord as TicketRecordReadModel;
18
19
class TicketRecord extends AbstractMethodNameMessageHandler
20
{
21
    private $em;
22
23
    public function __construct(EntityManagerInterface $em)
24
    {
25
        $this->em = $em;
26
    }
27
28
    protected function handleTicketPurchaseCreated(TicketPurchaseCreated $event)
29
    {
30
        $entity = new PurchaseRecord($event->getId());
31
        $this->em->persist($entity);
32
        $this->em->flush();
33
    }
34
35
    protected function handleTicketPurchaseTotalPriceCalculated(TicketPurchaseTotalPriceCalculated $event)
36
    {
37
        $purchase = $this->fetchPurchaseRecord($event->getId());
38
        $purchase->setTotalCost($event->getTotal());
39
        $this->em->flush();
40
    }
41
42
    protected function handleTicketPurchasePaid(TicketPurchasePaid $event)
43
    {
44
        $purchase = $this->fetchPurchaseRecord($event->getId());
45
46
        $purchase->pay($event->getPurchaserEmail());
47
        $this->em->flush();
48
    }
49
50
    protected function handleTicketPurchaseTimedout(TicketPurchaseTimedout $event)
51
    {
52
        try {
53
            $purchase = $this->fetchPurchaseRecord($event->getId());
54
            $this->em->remove($purchase);
55
            $this->em->flush();
56
        } catch (\InvalidArgumentException $e) {
0 ignored issues
show
Coding Style Comprehensibility introduced by
Consider adding a comment why this CATCH block is empty.
Loading history...
57
        }
58
    }
59
60
    protected function handleTicketReserved(TicketReserved $event)
61
    {
62
        $purchase = $this->fetchPurchaseRecord($event->getPurchaseId());
63
64
        $purchase->addTicketRecord($event->getTicketType(), $event->getId());
65
        $this->em->flush();
66
    }
67
68
    protected function handleTicketReleased(TicketReleased $event)
69
    {
70
        try {
71
            //not bothering to reduce ticket count as this will (should) be followed by a kill purchase event anyway
72
            $ticket = $this->fetchTicketRecord($event->getPurchaseId(), $event->getId());
73
            $this->em->remove($ticket);
74
            $this->em->flush();
75
        } catch (\InvalidArgumentException $e) {
0 ignored issues
show
Coding Style Comprehensibility introduced by
Consider adding a comment why this CATCH block is empty.
Loading history...
76
        }
77
    }
78
79
    protected function handleTicketAssigned(TicketAssigned $event)
80
    {
81
        $ticket = $this->fetchTicketRecord($event->getPurchaseId(), $event->getTicketId());
82
83
        $ticket->updateDelegate($event->getDelegate());
84
        $this->em->flush();
85
    }
86
87
    protected function handleDiscountCodeApplied(DiscountCodeApplied $event)
88
    {
89
        $purchase = $this->fetchPurchaseRecord($event->getId());
90
91
        $purchase->applyDiscountCode($event->getDiscountCode());
92
        $this->em->flush();
93
    }
94
95
    protected function handleTicketCancelled(TicketCancelled $event)
96
    {
97
        $purchase = $this->fetchPurchaseRecord($event->getId());
98
        $purchase->cancelTicket($event->getTicketId());
99
        if ($purchase->shouldBeCancelled()) {
100
            $this->em->remove($purchase);
101
        }
102
103
        $this->em->flush();
104
    }
105
106
    /**
107
     * @param string $purchaseId
108
     * @return PurchaseRecord
109
     */
110
    private function fetchPurchaseRecord(string $purchaseId): PurchaseRecord
111
    {
112
        $purchase = $this->em->getRepository(PurchaseRecord::class)->findOneBy([
113
            'purchaseId' => $purchaseId
114
        ]);
115
116
        if ($purchase === null) {
117
            throw new \InvalidArgumentException('Purchase Id does not exist');
118
        }
119
120
        return $purchase;
121
    }
122
123
    /**
124
     * @param string $purchaseId
125
     * @param string $ticketId
126
     * @return TicketRecordReadModel
127
     */
128
    private function fetchTicketRecord(string $purchaseId, string $ticketId): TicketRecordReadModel
129
    {
130
        $purchase = $this->fetchPurchaseRecord($purchaseId);
131
        $ticket = $purchase->getTicketRecord($ticketId);
132
        return $ticket;
133
    }
134
}