Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add get poll result feature #1

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
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
10 changes: 10 additions & 0 deletions src/Application/Component/Provider/DishProviderInterface.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?php

namespace Meals\Application\Component\Provider;

use Meals\Domain\Dish\Dish;

interface DishProviderInterface
{
public function getDish(int $dishId): Dish;
}
3 changes: 0 additions & 3 deletions src/Application/Component/Provider/PollProviderInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,8 @@

namespace Meals\Application\Component\Provider;

use Meals\Domain\Dish\Dish;
use Meals\Domain\Employee\Employee;
use Meals\Domain\Poll\Poll;
use Meals\Domain\Poll\PollList;
use Meals\Domain\Poll\PollResult;

interface PollProviderInterface
{
Expand Down
19 changes: 19 additions & 0 deletions src/Application/Component/Provider/PollResultProviderInterface.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<?php

namespace Meals\Application\Component\Provider;

use DateTimeImmutable;
use Meals\Domain\Dish\Dish;
use Meals\Domain\Employee\Employee;
use Meals\Domain\Poll\Poll;
use Meals\Domain\Poll\PollResult;

interface PollResultProviderInterface
{
public function getPollResult(
Poll $poll,
Dish $dish,
Employee $employee,
DateTimeImmutable $dateTime
): PollResult;
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
<?php

namespace Meals\Application\Component\Validator\Exception;

class AccessDeniedException extends \RuntimeException
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<?php

namespace Meals\Application\Component\Validator\Exception;

class PollDateTimeIsNotAllowedException extends \RuntimeException
{

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<?php

namespace Meals\Application\Component\Validator\Exception;

class PollHasNoDishException extends \RuntimeException
{

}
20 changes: 20 additions & 0 deletions src/Application/Component/Validator/PollDateTimeValidator.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<?php

namespace Meals\Application\Component\Validator;

use DateTimeImmutable;
use Meals\Application\Component\Validator\Exception\PollDateTimeIsNotAllowedException;

class PollDateTimeValidator
{
public function validate(DateTimeImmutable $dateTime): void
{
if (
$dateTime->format('w') != 1
|| $dateTime->format('G') < 6
|| $dateTime->format('G') >= 22
) {
throw new PollDateTimeIsNotAllowedException();
}
}
}
17 changes: 17 additions & 0 deletions src/Application/Component/Validator/PollHasDishValidator.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<?php

namespace Meals\Application\Component\Validator;

use Meals\Application\Component\Validator\Exception\PollHasNoDishException;
use Meals\Domain\Dish\Dish;
use Meals\Domain\Poll\Poll;

class PollHasDishValidator
{
public function validate(Poll $poll, Dish $dish): void
{
if (!$poll->getMenu()->getDishes()->hasDish($dish)) {
throw new PollHasNoDishException();
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
<?php

namespace Meals\Application\Feature\Poll\UseCase\EmployeeGetsPollResult;

use DateTimeImmutable;
use Meals\Application\Component\Provider\DishProviderInterface;
use Meals\Application\Component\Provider\PollProviderInterface;
use Meals\Application\Component\Provider\EmployeeProviderInterface;
use Meals\Application\Component\Provider\PollResultProviderInterface;
use Meals\Application\Component\Validator\PollDateTimeValidator;
use Meals\Application\Component\Validator\PollHasDishValidator;
use Meals\Application\Component\Validator\PollIsActiveValidator;
use Meals\Application\Component\Validator\UserHasAccessToViewPollsValidator;
use Meals\Domain\Poll\PollResult;

class Interactor
{
/** @var EmployeeProviderInterface */
private $employeeProvider;

/** @var PollProviderInterface */
private $pollProvider;

/** @var PollResultProviderInterface */
private $pollResultProvider;

/** @var DishProviderInterface */
private $dishProvider;

/** @var UserHasAccessToViewPollsValidator */
private $userHasAccessToPollsValidator;

/** @var PollIsActiveValidator */
private $pollIsActiveValidator;

/** @var PollHasDishValidator */
private $pollHasDishValidator;

/** @var PollDateTimeValidator */
private $pollDateTimeValidator;

/**
* Interactor constructor.
* @param EmployeeProviderInterface $employeeProvider
* @param PollProviderInterface $pollProvider
* @param PollResultProviderInterface $pollResultProvider
* @param DishProviderInterface $dishProvider
* @param UserHasAccessToViewPollsValidator $userHasAccessToPollsValidator
* @param PollIsActiveValidator $pollIsActiveValidator
* @param PollHasDishValidator $pollHasDishValidator
* @param PollDateTimeValidator $pollDateTimeValidator
*/
public function __construct(
EmployeeProviderInterface $employeeProvider,
PollProviderInterface $pollProvider,
PollResultProviderInterface $pollResultProvider,
DishProviderInterface $dishProvider,
UserHasAccessToViewPollsValidator $userHasAccessToPollsValidator,
PollIsActiveValidator $pollIsActiveValidator,
PollHasDishValidator $pollHasDishValidator,
PollDateTimeValidator $pollDateTimeValidator
) {
$this->employeeProvider = $employeeProvider;
$this->pollProvider = $pollProvider;
$this->pollResultProvider = $pollResultProvider;
$this->dishProvider = $dishProvider;
$this->userHasAccessToPollsValidator = $userHasAccessToPollsValidator;
$this->pollIsActiveValidator = $pollIsActiveValidator;
$this->pollHasDishValidator = $pollHasDishValidator;
$this->pollDateTimeValidator = $pollDateTimeValidator;
}

/**
* @param int $pollId
* @param int $employeeId
* @param int $dishId
* @param DateTimeImmutable $dateTime
* @return PollResult
*/
public function getPullResult(int $pollId, int $employeeId, int $dishId, DateTimeImmutable $dateTime): PollResult
{
$employee = $this->employeeProvider->getEmployee($employeeId);
$poll = $this->pollProvider->getPoll($pollId);
$dish = $this->dishProvider->getDish($dishId);

$this->userHasAccessToPollsValidator->validate($employee->getUser());
$this->pollIsActiveValidator->validate($poll);
$this->pollHasDishValidator->validate($poll, $dish);
$this->pollDateTimeValidator->validate($dateTime);

return $this->pollResultProvider->getPollResult($poll, $dish, $employee, $dateTime);
}
}
22 changes: 22 additions & 0 deletions tests/Functional/Fake/Provider/FakeDishProvider.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<?php

namespace tests\Meals\Functional\Fake\Provider;

use Meals\Application\Component\Provider\DishProviderInterface;
use Meals\Domain\Dish\Dish;

class FakeDishProvider implements DishProviderInterface
{
/** @var Dish */
private $dish;

public function getDish(int $dishId): Dish
{
return $this->dish;
}

public function setDish(Dish $dish)
{
$this->dish = $dish;
}
}
25 changes: 25 additions & 0 deletions tests/Functional/Fake/Provider/FakePollResultProvider.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<?php

namespace tests\Meals\Functional\Fake\Provider;

use Meals\Application\Component\Provider\PollResultProviderInterface;
use Meals\Domain\Dish\Dish;
use Meals\Domain\Employee\Employee;
use Meals\Domain\Poll\Poll;
use Meals\Domain\Poll\PollResult;
use DateTimeImmutable;

class FakePollResultProvider implements PollResultProviderInterface
{
/** @var PollResult */
private $pollResult;

public function setPollResult(PollResult $pollResult): void
{
$this->pollResult = $pollResult;
}
public function getPollResult(Poll $poll, Dish $dish, Employee $employee, DateTimeImmutable $dateTime): PollResult
{
return $this->pollResult;
}
}
Loading