#63 - permissions (#67)

* wip

* fix

* wip

* #63 - permissions

Co-authored-by: EwelinaLasowy <ewelina.lasowy@blumilk.pl>
This commit is contained in:
Adrian Hopek
2022-03-02 09:52:50 +01:00
committed by GitHub
parent 5cb46d2fc4
commit d825dd727f
47 changed files with 1027 additions and 411 deletions

View File

@@ -6,15 +6,24 @@ namespace Toby\Domain;
use Illuminate\Contracts\Auth\Factory as Auth;
use Illuminate\Contracts\Events\Dispatcher;
use Toby\Domain\Enums\VacationRequestState;
use Toby\Domain\Events\VacationRequestAcceptedByAdministrative;
use Toby\Domain\Events\VacationRequestAcceptedByTechnical;
use Toby\Domain\Events\VacationRequestApproved;
use Toby\Domain\Events\VacationRequestCancelled;
use Toby\Domain\Events\VacationRequestCreated;
use Toby\Domain\Events\VacationRequestRejected;
use Toby\Domain\Events\VacationRequestStateChanged;
use Toby\Domain\Events\VacationRequestWaitsForAdminApproval;
use Toby\Domain\Events\VacationRequestWaitsForTechApproval;
use Toby\Domain\States\VacationRequest\AcceptedByAdministrative;
use Toby\Domain\States\VacationRequest\AcceptedByTechnical;
use Toby\Domain\States\VacationRequest\Approved;
use Toby\Domain\States\VacationRequest\Cancelled;
use Toby\Domain\States\VacationRequest\Rejected;
use Toby\Domain\States\VacationRequest\VacationRequestState;
use Toby\Domain\States\VacationRequest\WaitingForAdministrative;
use Toby\Domain\States\VacationRequest\WaitingForTechnical;
use Toby\Eloquent\Models\User;
use Toby\Eloquent\Models\VacationRequest;
class VacationRequestStateManager
@@ -25,64 +34,77 @@ class VacationRequestStateManager
) {
}
public function markAsCreated(VacationRequest $vacationRequest): void
public function markAsCreated(VacationRequest $vacationRequest, ?User $user = null): void
{
$this->changeState($vacationRequest, VacationRequestState::Created);
$this->fireStateChangedEvent($vacationRequest, null, $vacationRequest->state, $user);
$this->dispatcher->dispatch(new VacationRequestCreated($vacationRequest));
}
public function approve(VacationRequest $vacationRequest): void
public function approve(VacationRequest $vacationRequest, ?User $user = null): void
{
$this->changeState($vacationRequest, VacationRequestState::Approved);
$this->changeState($vacationRequest, Approved::class, $user);
$this->dispatcher->dispatch(new VacationRequestApproved($vacationRequest));
}
public function reject(VacationRequest $vacationRequest): void
public function reject(VacationRequest $vacationRequest, ?User $user = null): void
{
$this->changeState($vacationRequest, VacationRequestState::Rejected);
$this->changeState($vacationRequest, Rejected::class, $user);
$this->dispatcher->dispatch(new VacationRequestRejected($vacationRequest));
}
public function cancel(VacationRequest $vacationRequest): void
public function cancel(VacationRequest $vacationRequest, ?User $user = null): void
{
$this->changeState($vacationRequest, VacationRequestState::Cancelled);
$this->changeState($vacationRequest, Cancelled::class, $user);
$this->dispatcher->dispatch(new VacationRequestCancelled($vacationRequest));
}
public function acceptAsTechnical(VacationRequest $vacationRequest): void
public function acceptAsTechnical(VacationRequest $vacationRequest, ?User $user = null): void
{
$this->changeState($vacationRequest, VacationRequestState::AcceptedByTechnical);
$this->changeState($vacationRequest, AcceptedByTechnical::class, $user);
$this->dispatcher->dispatch(new VacationRequestAcceptedByTechnical($vacationRequest));
}
public function acceptAsAdministrative(VacationRequest $vacationRequest): void
public function acceptAsAdministrative(VacationRequest $vacationRequest, ?User $user = null): void
{
$this->changeState($vacationRequest, VacationRequestState::AcceptedByAdministrative);
$this->changeState($vacationRequest, AcceptedByAdministrative::class, $user);
$this->dispatcher->dispatch(new VacationRequestAcceptedByAdministrative($vacationRequest));
}
public function waitForTechnical(VacationRequest $vacationRequest): void
public function waitForTechnical(VacationRequest $vacationRequest, ?User $user = null): void
{
$this->changeState($vacationRequest, VacationRequestState::WaitingForTechnical);
$this->changeState($vacationRequest, WaitingForTechnical::class, $user);
$this->dispatcher->dispatch(new VacationRequestWaitsForTechApproval($vacationRequest));
}
public function waitForAdministrative(VacationRequest $vacationRequest): void
public function waitForAdministrative(VacationRequest $vacationRequest, ?User $user = null): void
{
$this->changeState($vacationRequest, VacationRequestState::WaitingForAdministrative);
$this->changeState($vacationRequest, WaitingForAdministrative::class, $user);
$this->dispatcher->dispatch(new VacationRequestWaitsForAdminApproval($vacationRequest));
}
protected function changeState(VacationRequest $vacationRequest, VacationRequestState $state): void
protected function changeState(VacationRequest $vacationRequest, string $state, ?User $user = null): void
{
$vacationRequest->changeStateTo($state);
$previousState = $vacationRequest->state;
$vacationRequest->state->transitionTo($state);
$vacationRequest->save();
$this->fireStateChangedEvent($vacationRequest, $previousState, $vacationRequest->state, $user);
}
protected function fireStateChangedEvent(
VacationRequest $vacationRequest,
?VacationRequestState $from,
VacationRequestState $to,
?User $user = null,
): void {
$event = new VacationRequestStateChanged($vacationRequest, $from, $to, $user);
$this->dispatcher->dispatch($event);
}
}