<?php
namespace Sq\Entity\Schema\ORM;
use Doctrine\ORM\Mapping as ORM;
use Sq\Entity\Schema\Column\UserInvitationRole;
use Sq\GraphQL\Utility\Utility;
use Sq\Service\Repository\ORM\UserInvitationRepository;
#[ORM\Entity(repositoryClass: UserInvitationRepository::class)]
#[ORM\Table(name: 'user_invitations')]
#[ORM\Index(name: 'fk__ui_org_id', columns: ['ui_org_id'])]
#[ORM\UniqueConstraint(name: 'uqx__ui_token', columns: ['ui_token'])]
class UserInvitation
{
/**
*
* @var int|null
*/
#[ORM\Id]
#[ORM\Column(name: 'ui_id', type: 'integer', nullable: false, options: ['unsigned' => true])]
#[ORM\GeneratedValue(strategy: 'AUTO')]
private $id;
/**
* @var \DateTimeInterface
*/
#[ORM\Column(name: 'ui_created_at', type: 'datetime', nullable: false)]
private $createdAt;
/**
*
* @var Organization
*/
#[ORM\ManyToOne(targetEntity: Organization::class, inversedBy: 'userInvitations')]
#[ORM\JoinColumn(name: 'ui_org_id', referencedColumnName: 'o_id', nullable: false)]
private $organization;
/**
* @var string
*/
#[ORM\Column(name: 'ui_token', type: 'string', length: 160, nullable: false)]
private $token;
/**
* @var string
*/
#[ORM\Column(name: 'ui_email', type: 'binary_aes_encrypted', nullable: false)]
private $email;
/**
* @var string
*/
#[ORM\Column(name: 'ui_role', type: 'string', columnDefinition: "ENUM('admin', 'editor')", nullable: false)]
private $role;
/**
* @var string
*/
#[ORM\Column(name: 'ui_workspace_ids', type: 'string', nullable: false)]
private $workspaceIds;
/**
*
* @var User|null
*/
#[ORM\ManyToOne(targetEntity: User::class)]
#[ORM\JoinColumn(name: 'ui_invited_by_uid', referencedColumnName: 'u_id', nullable: true)]
private $invitedBy;
public function __construct(
Organization $organization,
string $email,
array $workspaceIds,
string $role = UserInvitationRole::EDITOR,
?User $invitedBy = null
) {
$this->organization = $organization;
$this->email = $email;
$this->setWorkspaceIds($workspaceIds);
$this->invitedBy = $invitedBy;
$this->role = $role;
$this->token = bin2hex(random_bytes(80));
$this->createdAt = new \DateTimeImmutable;
}
public function getId(): ?int
{
return $this->id;
}
public function getCreatedAt(): \DateTimeInterface
{
return clone $this->createdAt;
}
public function getOrganization(): Organization
{
return $this->organization;
}
public function setOrganization(Organization $organization): self
{
$this->organization = $organization;
return $this;
}
public function getToken(): string
{
return $this->token;
}
public function getEmail(): string
{
return $this->email;
}
public function setEmail(string $email): self
{
$this->email = $email;
return $this;
}
public function getRole(): string
{
return $this->role;
}
public function setRole(string $role): self
{
$this->role = $role;
return $this;
}
public function getWorkspaceIds(): array
{
$workspaceIds = json_decode($this->workspaceIds, true);
if (json_last_error() !== JSON_ERROR_NONE)
{
return [];
}
return is_array($workspaceIds) ? $workspaceIds : [];
}
public function setWorkspaceIds(array $workspaceIds): void
{
$workspaceIds = Utility::filterListOfIDs(array_map(function ($workspaceId)
{
return $workspaceId instanceof Workspace
? $workspaceId->getId()
: $workspaceId;
}, $workspaceIds));
$this->workspaceIds = json_encode($workspaceIds);
}
public function getInvitedBy(): ?User
{
return $this->invitedBy;
}
}