<?php
namespace 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()));
}
/**
* @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;
}
}