Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions src/Domain/MessageSubscriptions.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

use ConferenceTools\Attendance\Domain\Delegate;
use ConferenceTools\Attendance\Domain\Discounting\DiscountType;
use ConferenceTools\Attendance\Domain\Prizes\Prize;
use ConferenceTools\Attendance\Domain\Purchasing;
use ConferenceTools\Attendance\Domain\Discounting\Command as DiscountingCommand;
use ConferenceTools\Attendance\Domain\Discounting\Event as DiscountingEvent;
Expand Down Expand Up @@ -40,6 +41,19 @@ public static function getSubscriptions()
DiscountType::class,
],

Prizes\Command\ChooseWinner::class => [
Prizes\Prize::class,
],
Prizes\Command\GiveawayPrize::class => [
Prizes\Prize::class,
],
Prizes\Command\WinnerIs::class => [
Prizes\Prize::class,
],
Prizes\Command\ReplaceWinner::class => [
Prizes\Prize::class,
],

PurchasingCommand\CheckPurchaseTimeout::class => [
Purchasing\Purchase::class,
],
Expand Down Expand Up @@ -87,6 +101,13 @@ public static function getSubscriptions()
Discounting\Projector::class,
],

Prizes\Event\PrizeGiveaway::class => [
Prizes\Projector::class,
],
Prizes\Event\WinnerChosen::class => [
Prizes\Projector::class,
],

PurchasingEvent\TicketReservationExpired::class => [
Tickets::class,
Purchasing\Projector::class,
Expand Down
30 changes: 30 additions & 0 deletions src/Domain/Prizes/Command/ChooseWinner.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<?php

namespace ConferenceTools\Attendance\Domain\Prizes\Command;

use JMS\Serializer\Annotation as Jms;
use Phactor\Message\HasActorId;

class ChooseWinner implements HasActorId
{
/** @Jms\Type("string") */
private $id;
/** @Jms\Type("array<string>") */
private $entrants;

public function __construct(string $id, string ...$entrants)
{
$this->id = $id;
$this->entrants = $entrants;
}

public function getActorId(): string
{
return $this->id;
}

public function getEntrants(): array
{
return $this->entrants;
}
}
23 changes: 23 additions & 0 deletions src/Domain/Prizes/Command/GiveawayPrize.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<?php

namespace ConferenceTools\Attendance\Domain\Prizes\Command;

use JMS\Serializer\Annotation as Jms;

class GiveawayPrize
{
/**
* @Jms\Type("string")
*/
private $name;

public function __construct(string $name)
{
$this->name = $name;
}

public function getName(): string
{
return $this->name;
}
}
24 changes: 24 additions & 0 deletions src/Domain/Prizes/Command/ReplaceWinner.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<?php


namespace ConferenceTools\Attendance\Domain\Prizes\Command;

use JMS\Serializer\Annotation as Jms;
use Phactor\Message\HasActorId;

class ReplaceWinner implements HasActorId
{
/** @Jms\Type("string")
*/
private $id;

public function __construct(string $id)
{
$this->id = $id;
}

public function getActorId(): string
{
return $this->id;
}
}
38 changes: 38 additions & 0 deletions src/Domain/Prizes/Command/WinnerIs.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
<?php

namespace ConferenceTools\Attendance\Domain\Prizes\Command;

use JMS\Serializer\Annotation as Jms;
use Phactor\Message\HasActorId;

class WinnerIs implements HasActorId
{
/** @Jms\Type("string") */
private $id;
/** @Jms\Type("string") */
private $winner;
/** @Jms\Type("array<string>") */
private $entrants;

public function __construct(string $id, string $winner, string ...$entrants)
{
$this->id = $id;
$this->winner = $winner;
$this->entrants = $entrants;
}

public function getActorId(): string
{
return $this->id;
}

public function getWinner(): string
{
return $this->winner;
}

public function getEntrants(): array
{
return $this->entrants;
}
}
33 changes: 33 additions & 0 deletions src/Domain/Prizes/Event/PrizeGiveaway.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
<?php

namespace ConferenceTools\Attendance\Domain\Prizes\Event;

use JMS\Serializer\Annotation as Jms;

class PrizeGiveaway
{
/**
* @Jms\Type("string")
*/
private $id;
/**
* @Jms\Type("string")
*/
private $name;

public function __construct(string $id, string $name)
{
$this->id = $id;
$this->name = $name;
}

public function getId(): string
{
return $this->id;
}

public function getName(): string
{
return $this->name;
}
}
30 changes: 30 additions & 0 deletions src/Domain/Prizes/Event/WinnerChosen.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<?php


namespace ConferenceTools\Attendance\Domain\Prizes\Event;

use JMS\Serializer\Annotation as Jms;

class WinnerChosen
{
/** @Jms\Type("string") */
private $id;
/** @Jms\Type("string") */
private $winner;

public function __construct(string $id, string $winner)
{
$this->id = $id;
$this->winner = $winner;
}

public function getId(): string
{
return $this->id;
}

public function getWinner(): string
{
return $this->winner;
}
}
71 changes: 71 additions & 0 deletions src/Domain/Prizes/Prize.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
<?php

namespace ConferenceTools\Attendance\Domain\Prizes;


use ConferenceTools\Attendance\Domain\Prizes\Command\ChooseWinner;
use ConferenceTools\Attendance\Domain\Prizes\Command\GiveawayPrize;
use ConferenceTools\Attendance\Domain\Prizes\Command\ReplaceWinner;
use ConferenceTools\Attendance\Domain\Prizes\Event\PrizeGiveaway;
use ConferenceTools\Attendance\Domain\Prizes\Event\WinnerChosen;
use ConferenceTools\Attendance\Domain\Prizes\Command\WinnerIs;
use Phactor\Actor\AbstractActor;

class Prize extends AbstractActor
{
private $name;
private $entrants;

protected function handleGiveawayPrize(GiveawayPrize $command)
{
$this->fire(new PrizeGiveaway($this->id(), $command->getName()));
}

protected function applyPrizeGiveaway(PrizeGiveaway $event)
{
$this->name = $event->getName();
}

protected function handleChooseWinner(ChooseWinner $command)
{
$entrants = $command->getEntrants();
$winner = array_pop($entrants);
$this->fire(new WinnerChosen($this->id(), $winner));
}

protected function handleWinnerIs(WinnerIs $command)
{
$this->fire(new WinnerChosen($this->id(), $command->getWinner()));
}

protected function applyWinnerIs(WinnerIs $command)
{
$this->entrants = $command->getEntrants();
}

protected function applyChooseWinner(ChooseWinner $command)
{
$entrants = $command->getEntrants();
array_pop($entrants);
$this->entrants = $entrants;
}

protected function applyWinnerChosen(WinnerChosen $event)
{
$this->winner = $event->getWinner();
}

protected function handleReplaceWinner(ReplaceWinner $command)
{
$entrants = $this->entrants;
$winner = array_pop($entrants);
$this->fire(new WinnerChosen($this->id(), $winner));
}

protected function applyReplaceWinner(ReplaceWinner $command)
{
array_pop($this->entrants);
}

// Collected
}
49 changes: 49 additions & 0 deletions src/Domain/Prizes/Projector.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
<?php


namespace ConferenceTools\Attendance\Domain\Prizes;


use ConferenceTools\Attendance\Domain\Prizes\Event\PrizeGiveaway;
use ConferenceTools\Attendance\Domain\Prizes\Event\WinnerChosen;
use Phactor\Message\DomainMessage;
use Phactor\Message\Handler;
use Phactor\ReadModel\Repository;

class Projector implements Handler
{
private $repository;

public function __construct(Repository $repository)
{
$this->repository = $repository;
}

public function handle(DomainMessage $message)
{
$event = $message->getMessage();
switch (true) {
case $event instanceof PrizeGiveaway:
$this->prizeGiveaway($event);
break;
case $event instanceof WinnerChosen:
$this->winnerChosen($event);
break;
}

$this->repository->commit();
}

private function prizeGiveaway(PrizeGiveaway $event): void
{
$entity = new ReadModel\Prize($event->getId(), $event->getName());
$this->repository->add($event);
}

private function winnerChosen(WinnerChosen $event): void
{
/** @var ReadModel\Prize $entity */
$entity = $this->repository->get($event->getId());
$entity->winnerChosen($event->getWinner());
}
}
Loading