<?phpnamespace Whater\Domain\User\Model;use BornFree\TacticianDomainEvent\Recorder\ContainsRecordedEvents;use BornFree\TacticianDomainEvent\Recorder\EventRecorderCapabilities;use Assert\Assertion;use Whater\Domain\Common\Exception\InvalidUUIDException;use Whater\Domain\User\Event\RoleWasCreated;use Whater\Domain\User\Exception\InvalidRoleException;use Ramsey\Uuid\Uuid;/** * Class Role * * @package Whater\Domain\User\Model */class Role implements ContainsRecordedEvents{ use EventRecorderCapabilities; const BASE_ROLE_USER = 'BASE_ROLE_USER'; const BASE_ROLE_ADMIN = 'BASE_ROLE_ADMIN'; const ROLE_ADMIN = 'ROLE_ADMIN'; const ROLE_USER = 'ROLE_USER'; /** * @var string */ private $uuid; /** * @var string */ private $type; /** * @var boolean */ private $isEnabled; /** * @var \DateTime */ private $createdAt; /** * @var null|\DateTime */ private $updatedAt; /** * @var \Whater\Domain\User\Model\User */ private $user; /** * User constructor. * * @param string $roleId * @param string $type * @param boolean $isEnabled * @param User $user */ public function __construct(string $roleId = null, string $type, bool $isEnabled, User $user) { try { $this->uuid = Uuid::fromString($roleId ?: Uuid::uuid4())->toString(); } catch (\InvalidArgumentException $e) { throw new InvalidUUIDException(); } $this->type = $type; $this->isEnabled = $isEnabled; $this->user = $user; $this->createdAt = new \DateTime(); $this->updatedAt = new \DateTime(); // RoleWasCreated Event $this->record(new RoleWasCreated($this, $user->plainPassword())); } public function updateType(string $type) { $this->type = $type; } /** * @return string */ public function id(): string { return $this->uuid; } /** * @return string */ public function type(): string { return $this->type; } /** * @return bool */ public function isEnabled(): bool { return $this->isEnabled; } /** * @return \DateTime */ public function createdAt(): \DateTime { return $this->createdAt; } /** * @return \DateTime|null */ public function updatedAt() { return $this->updatedAt; } /** * @return User */ public function user(): User { return $this->user; } /* * Enable a role */ public function enableRole() { $this->isEnabled = TRUE; $this->updatedAt = new \DateTime(); } /* * Disable a role */ public function disableRole() { $this->isEnabled = FALSE; $this->updatedAt = new \DateTime(); } /** * @return bool */ public function equals(Role $role) { return $this->id() === $role->id(); } /** * Get base role * * @return string */ public static final function baseRole($role) { switch ($role) { case self::ROLE_ADMIN: return self::BASE_ROLE_ADMIN; case self::ROLE_USER: return self::BASE_ROLE_USER; } return 'UNKNOWN'; } /** * Get slugify role name * * @return string */ public static final function roleSlug($role) { switch ($role) { case self::BASE_ROLE_ADMIN: return 'admin'; case self::BASE_ROLE_USER: return 'user'; } return 'unknown'; } public function description() { $str = $this->type; return $str; } public function __toString() { $str = $this->type; return $str; }}