This commit is contained in:
Adrian Hopek
2022-02-07 08:05:35 +01:00
parent 41c769d4ab
commit eadf984f30
21 changed files with 323 additions and 104 deletions

View File

@@ -1,16 +0,0 @@
<?php
declare(strict_types=1);
namespace Toby\Domain\Validation\Rules;
use Closure;
use Toby\Eloquent\Models\VacationRequest;
class ApprovedVacationDaysInSameRange implements VacationRequestRule
{
public function check(VacationRequest $vacationRequest, Closure $next)
{
return $next($vacationRequest);
}
}

View File

@@ -4,13 +4,22 @@ declare(strict_types=1);
namespace Toby\Domain\Validation\Rules;
use Closure;
use Toby\Domain\VacationTypeConfigRetriever;
use Toby\Eloquent\Models\VacationRequest;
class DoesNotExceedLimitRule implements VacationRequestRule
class DoesNotExceedLimitRule extends VacationRequestRule
{
public function check(VacationRequest $vacationRequest, Closure $next)
public function __construct(protected VacationTypeConfigRetriever $configRetriever)
{
return $next($vacationRequest);
}
public function passes(VacationRequest $vacationRequest): bool
{
return true;
}
public function errorMessage(): string
{
return __("You have exceeded your vacation limit.");
}
}

View File

@@ -4,13 +4,24 @@ declare(strict_types=1);
namespace Toby\Domain\Validation\Rules;
use Closure;
use Toby\Domain\VacationDaysCalculator;
use Toby\Eloquent\Models\VacationRequest;
class MinimumOneVacationDayRule implements VacationRequestRule
class MinimumOneVacationDayRule extends VacationRequestRule
{
public function check(VacationRequest $vacationRequest, Closure $next)
public function __construct(protected VacationDaysCalculator $vacationDaysCalculator)
{
return $next($vacationRequest);
}
public function passes(VacationRequest $vacationRequest): bool
{
return $this->vacationDaysCalculator
->calculateDays($vacationRequest->yearPeriod, $vacationRequest->from, $vacationRequest->to)
->isNotEmpty();
}
public function errorMessage(): string
{
return __("Vacation needs minimum one day.");
}
}

View File

@@ -0,0 +1,26 @@
<?php
declare(strict_types=1);
namespace Toby\Domain\Validation\Rules;
use Toby\Domain\Enums\VacationRequestState;
use Toby\Eloquent\Models\VacationRequest;
class NoApprovedVacationRequestsInRange extends VacationRequestRule
{
public function passes(VacationRequest $vacationRequest): bool
{
return $vacationRequest
->user
->vacationRequests()
->overlapsWith($vacationRequest)
->states(VacationRequestState::successStates())
->exists();
}
public function errorMessage(): string
{
return __("You have approved vacation request in this range.");
}
}

View File

@@ -0,0 +1,26 @@
<?php
declare(strict_types=1);
namespace Toby\Domain\Validation\Rules;
use Toby\Domain\Enums\VacationRequestState;
use Toby\Eloquent\Models\VacationRequest;
class NoPendingVacationRequestInRange extends VacationRequestRule
{
public function passes(VacationRequest $vacationRequest): bool
{
return $vacationRequest
->user
->vacationRequests()
->overlapsWith($vacationRequest)
->states(VacationRequestState::pendingStates())
->exists();
}
public function errorMessage(): string
{
return __("You have pending vacation request in this range.");
}
}

View File

@@ -1,16 +0,0 @@
<?php
declare(strict_types=1);
namespace Toby\Domain\Validation\Rules;
use Closure;
use Toby\Eloquent\Models\VacationRequest;
class PendingVacationRequestInSameRange implements VacationRequestRule
{
public function check(VacationRequest $vacationRequest, Closure $next)
{
return $next($vacationRequest);
}
}

View File

@@ -1,16 +0,0 @@
<?php
declare(strict_types=1);
namespace Toby\Domain\Validation\Rules;
use Closure;
use Toby\Eloquent\Models\VacationRequest;
class UsedVacationDaysInSameRange
{
public function check(VacationRequest $vacationRequest, Closure $next)
{
return $next($vacationRequest);
}
}

View File

@@ -0,0 +1,20 @@
<?php
declare(strict_types=1);
namespace Toby\Domain\Validation\Rules;
use Toby\Eloquent\Models\VacationRequest;
class VacationRangeIsInTheSameYearRule extends VacationRequestRule
{
public function passes(VacationRequest $vacationRequest): bool
{
return $vacationRequest->from->isSameYear($vacationRequest->to);
}
public function errorMessage(): string
{
return __("The vacation request cannot be created at the turn of the year.");
}
}

View File

@@ -4,10 +4,18 @@ declare(strict_types=1);
namespace Toby\Domain\Validation\Rules;
use Closure;
use Illuminate\Validation\ValidationException;
use Toby\Eloquent\Models\VacationRequest;
interface VacationRequestRule
abstract class VacationRequestRule
{
public function check(VacationRequest $vacationRequest, Closure $next);
public function check(VacationRequest $vacationRequest): void
{
if (! $this->passes($vacationRequest)) {
throw ValidationException::withMessages(["vacationRequest" => $this->errorMessage()]);
}
}
public abstract function passes(VacationRequest $vacationRequest): bool;
public abstract function errorMessage(): string;
}

View File

@@ -5,19 +5,21 @@ declare(strict_types=1);
namespace Toby\Domain\Validation;
use Illuminate\Pipeline\Pipeline;
use Toby\Domain\Validation\Rules\ApprovedVacationDaysInSameRange;
use Toby\Domain\Validation\Rules\NoApprovedVacationRequestsInRange;
use Toby\Domain\Validation\Rules\DoesNotExceedLimitRule;
use Toby\Domain\Validation\Rules\MinimumOneVacationDayRule;
use Toby\Domain\Validation\Rules\PendingVacationRequestInSameRange;
use Toby\Domain\Validation\Rules\NoPendingVacationRequestInRange;
use Toby\Domain\Validation\Rules\VacationRangeIsInTheSameYearRule;
use Toby\Eloquent\Models\VacationRequest;
class VacationRequestValidator
{
protected array $rules = [
VacationRangeIsInTheSameYearRule::class,
MinimumOneVacationDayRule::class,
DoesNotExceedLimitRule::class,
PendingVacationRequestInSameRange::class,
ApprovedVacationDaysInSameRange::class,
NoPendingVacationRequestInRange::class,
NoApprovedVacationRequestsInRange::class,
];
public function __construct(
@@ -27,9 +29,8 @@ class VacationRequestValidator
public function validate(VacationRequest $vacationRequest): void
{
$this->pipeline
->send($vacationRequest)
->through($this->rules)
->via("check");
foreach ($this->rules as $rule) {
app($rule)->check($vacationRequest);
}
}
}