src/Component/Epics/Domain/Model/Epic.php
<?php
declare(strict_types = 1);
namespace LarsNieuwenhuizen\ClubhouseConnector\Component\Epics\Domain\Model;
use DateTime;
use DateTimeZone;
use LarsNieuwenhuizen\ClubhouseConnector\Component\ComponentResponseBody;
use LarsNieuwenhuizen\ClubhouseConnector\Component\CreateableComponent;
use LarsNieuwenhuizen\ClubhouseConnector\Component\UpdateableComponent;
use LarsNieuwenhuizen\ClubhouseConnector\Connector;
final class Epic implements ComponentResponseBody, CreateableComponent, UpdateableComponent
{
private string $appUrl;
private bool $archived = false;
private bool $completed;
private ?DateTime $completedAt = null;
private ?DateTime $completedAtOverride = null;
private DateTime $createdAt;
private ?DateTime $deadline = null;
private string $description = '';
private string $entityType;
private ?int $epicStateId = null;
private string $externalId = '';
private array $externalTickets = [];
private array $followerIds = [];
private array $groupMentionIds = [];
private int $id;
private array $labels = [];
private array $memberMentionIds = [];
private array $mentionIds = [];
private ?int $milestoneId = null;
private string $name;
private array $ownerIds = [];
private ?DateTime $plannedStartDate = null;
private ?int $position;
private array $projectIds = [];
private ?string $requestedById = null;
private bool $started;
private ?DateTime $startedAt = null;
private ?DateTime $startedAtOverride = null;
private string $state = 'to do';
private array $stats = [];
private ?DateTime $updatedAt = null;
private ?int $beforeEpic = null;
private ?int $afterEpic = null;
private DateTimeZone $defaultDateTimeZone;
public function __construct()
{
$this->defaultDateTimeZone = new DateTimeZone('Europe/Amsterdam');
}
public static function createFromResponseData(array $values): Epic
{
$object = new static();
$object->appUrl = $values['app_url'];
$object->archived = $values['archived'];
$object->completed = $values['completed'];
if (isset($values['completed_at']) && $values['completed_at'] !== null) {
$object->completedAt = DateTime::createFromFormat(
Connector::DATE_TIME_FORMAT,
$values['completed_at'],
$object->defaultDateTimeZone
);
}
if (isset($values['completed_at_override']) && $values['completed_at_override'] !== null) {
$object->completedAtOverride = DateTime::createFromFormat(
Connector::DATE_TIME_FORMAT,
$values['completed_at_override'],
$object->defaultDateTimeZone
);
}
$object->createdAt = DateTime::createFromFormat(
Connector::DATE_TIME_FORMAT,
$values['created_at'],
$object->defaultDateTimeZone
);
if (isset($values['deadline']) && $values['deadline'] !== null) {
$object->deadline = DateTime::createFromFormat(
Connector::DATE_TIME_FORMAT,
$values['deadline'],
$object->defaultDateTimeZone
);
}
$object->description = $values['description'] ?? '';
$object->entityType = $values['entity_type'] ?? '';
$object->epicStateId = $values['epic_state_id'] ?? null;
$object->externalId = $values['external_id'] ?? '';
$object->externalTickets = $values['external_tickets'] ?? [];
$object->followerIds = $values['follower_ids'] ?? [];
$object->groupMentionIds = $values['group_mention_ids'] ?? [];
$object->id = $values['id'];
$object->labels = $values['labels'] ?? [];
$object->memberMentionIds = $values['member_mention_ids'] ?? [];
$object->mentionIds = $values['mention_ids'] ?? [];
$object->milestoneId = $values['milestone_id'] ?? null;
$object->name = $values['name'];
$object->ownerIds = $values['owner_ids'] ?? [];
if (isset($values['planned_start_date']) && $values['planned_start_date'] !== null) {
$object->plannedStartDate = DateTime::createFromFormat(
Connector::DATE_TIME_FORMAT,
$values['planned_start_date'],
$object->defaultDateTimeZone
);
}
$object->position = $values['position'] ?? null;
$object->projectIds = $values['project_ids'] ?? [];
$object->requestedById = $values['requested_by_id'];
$object->started = $values['started'];
if (isset($values['started_at']) && $values['started_at'] !== null) {
$object->startedAt = DateTime::createFromFormat(
Connector::DATE_TIME_FORMAT,
$values['started_at'],
$object->defaultDateTimeZone
);
}
if (isset($values['started_at_override']) && $values['started_at_override'] !== null) {
$object->startedAtOverride = DateTime::createFromFormat(
Connector::DATE_TIME_FORMAT,
$values['started_at_override'],
$object->defaultDateTimeZone
);
}
$object->state = $values['state'];
$object->stats = $values['stats'] ?? [];
if (isset($values['updated_at']) && $values['updated_at'] !== null) {
$object->updatedAt = DateTime::createFromFormat(
Connector::DATE_TIME_FORMAT,
$values['updated_at'],
$object->defaultDateTimeZone
);;
}
return $object;
}
public function toArrayForCreation(): array
{
$data = [
'name' => $this->getName(),
'deadline' => null,
'description' => $this->getDescription(),
'external_id' => $this->getExternalId(),
'follower_ids' => $this->getFollowerIds(),
'labels' => $this->getLabels(),
'milestone_id' => $this->getMilestoneId(),
'owner_ids' => $this->getOwnerIds(),
'planned_start_date' => null
];
if ($this->getRequestedById() !== null) {
$data['requested_by_id'] = $this->getRequestedById();
}
if ($this->getEpicStateId() !== null) {
$data['epic_state_id'] = $this->getEpicStateId();
}
if ($this->getCompletedAtOverride() !== null) {
$data['completed_at_override'] = $this->getCompletedAtOverride()->format(Connector::DATE_TIME_FORMAT);
}
if ($this->getDeadline() !== null) {
$data['deadline'] = $this->getDeadline()->format(Connector::DATE_TIME_FORMAT);
}
if ($this->getPlannedStartDate() !== null) {
$data['planned_start_date'] = $this->getPlannedStartDate()->format(Connector::DATE_TIME_FORMAT);
}
if ($this->getStartedAtOverride() !== null) {
$data['started_at_override'] = $this->getStartedAtOverride()->format(Connector::DATE_TIME_FORMAT);
}
if ($this->getUpdatedAt() !== null) {
$data['updated_at'] = $this->getUpdatedAt()->format(Connector::DATE_TIME_FORMAT);
}
if ($this->getState() !== null) {
$data['state'] = $this->getState();
}
return $data;
}
public function toArrayForUpdate(): array
{
$data = [
'name' => $this->getName(),
'archived' => $this->getArchived(),
'completed_at_override' => null,
'deadline' => null,
'description' => $this->getDescription(),
'follower_ids' => $this->getFollowerIds(),
'labels' => $this->getLabels(),
'milestone_id' => $this->getMilestoneId(),
'owner_ids' => $this->getOwnerIds(),
'planned_start_date' => null,
'started_at_override' => null
];
if ($this->getAfterEpic() !== null) {
$data['after_id'] = $this->getAfterEpic();
}
if ($this->getEpicStateId() !== null) {
$data['epic_state_id'] = $this->getEpicStateId();
}
if ($this->getBeforeEpic() !== null) {
$data['before_id'] = $this->getBeforeEpic();
}
if ($this->getRequestedById() !== null) {
$data['requested_by_id'] = $this->getRequestedById();
}
if ($this->getState() !== null) {
$data['state'] = $this->getState();
}
if ($this->getCompletedAtOverride() instanceof DateTime) {
$data['completed_at_override'] = $this->getCompletedAtOverride()->format(Connector::DATE_TIME_FORMAT);
}
if ($this->getDeadline() instanceof DateTime) {
$data['deadline'] = $this->getDeadline()->format(Connector::DATE_TIME_FORMAT);
}
if ($this->getPlannedStartDate() instanceof DateTime) {
$data['planned_start_date'] = $this->getPlannedStartDate()->format(Connector::DATE_TIME_FORMAT);
}
if ($this->getStartedAtOverride() instanceof DateTime) {
$data['started_at_override'] = $this->getStartedAtOverride()->format(Connector::DATE_TIME_FORMAT);
}
return $data;
}
public function getBeforeEpic(): ?int
{
return $this->beforeEpic;
}
/**
* @param int $beforeEpic
* @return Epic
*/
public function setBeforeEpic(int $beforeEpic): Epic
{
$this->beforeEpic = $beforeEpic;
return $this;
}
public function getAfterEpic(): ?int
{
return $this->afterEpic;
}
public function setAfterEpic(int $afterEpic): Epic
{
$this->afterEpic = $afterEpic;
return $this;
}
public function getDefaultDateTimeZone()
{
return $this->defaultDateTimeZone;
}
public function setDefaultDateTimeZone(DateTimeZone $defaultDateTimeZone): Epic
{
$this->defaultDateTimeZone = $defaultDateTimeZone;
return $this;
}
public function getAppUrl(): string
{
return $this->appUrl;
}
public function getArchived(): bool
{
return $this->archived;
}
public function getCompleted(): bool
{
return $this->completed;
}
public function getCompletedAt(): ?DateTime
{
return $this->completedAt;
}
public function getCompletedAtOverride(): ?DateTime
{
return $this->completedAtOverride;
}
public function getCreatedAt(): DateTime
{
return $this->createdAt;
}
public function getDeadline(): ?DateTime
{
return $this->deadline;
}
public function getDescription(): string
{
return $this->description;
}
public function getEntityType(): string
{
return $this->entityType;
}
public function getEpicStateId(): ?int
{
return $this->epicStateId;
}
public function getExternalId(): string
{
return $this->externalId;
}
public function getExternalTickets(): array
{
return $this->externalTickets;
}
public function getFollowerIds(): array
{
return $this->followerIds;
}
public function getGroupMentionIds(): array
{
return $this->groupMentionIds;
}
public function getId(): int
{
return $this->id;
}
public function getLabels(): array
{
return $this->labels;
}
public function getMemberMentionIds(): array
{
return $this->memberMentionIds;
}
public function getMentionIds(): array
{
return $this->mentionIds;
}
public function getMilestoneId(): ?int
{
return $this->milestoneId ?? null;
}
public function getName(): string
{
return $this->name;
}
public function getOwnerIds(): array
{
return $this->ownerIds;
}
public function getPlannedStartDate(): ?DateTime
{
return $this->plannedStartDate;
}
public function getPosition(): ?int
{
return $this->position;
}
public function getProjectIds(): array
{
return $this->projectIds;
}
public function getRequestedById(): ?string
{
return $this->requestedById;
}
public function getStarted(): bool
{
return $this->started;
}
public function getStartedAt(): ?DateTime
{
return $this->startedAt;
}
public function getStartedAtOverride(): ?DateTime
{
return $this->startedAtOverride;
}
public function getState(): string
{
return $this->state;
}
public function getStats(): array
{
return $this->stats;
}
public function getUpdatedAt(): ?DateTime
{
return $this->updatedAt;
}
public function setUpdatedAt(DateTime $updatedAt): Epic
{
$this->updatedAt = $updatedAt;
return $this;
}
public function setCompletedAtOverride(?DateTime $completedAtOverride): Epic
{
$this->completedAtOverride = $completedAtOverride;
return $this;
}
public function setCreatedAt(DateTime $createdAt): Epic
{
$this->createdAt = $createdAt;
return $this;
}
public function setDeadline(?DateTime $deadline): Epic
{
$this->deadline = $deadline;
return $this;
}
public function setDescription(string $description): Epic
{
$this->description = $description;
return $this;
}
public function setEpicStateId(?int $epicStateId): Epic
{
$this->epicStateId = $epicStateId;
return $this;
}
public function setExternalId(?string $externalId): Epic
{
$this->externalId = $externalId;
return $this;
}
public function setFollowerIds(array $followerIds): Epic
{
$this->followerIds = $followerIds;
return $this;
}
public function setLabels(array $labels): Epic
{
$this->labels = $labels;
return $this;
}
public function setMilestoneId(?int $milestoneId): Epic
{
$this->milestoneId = $milestoneId;
return $this;
}
public function setName(string $name): Epic
{
$this->name = $name;
return $this;
}
public function setOwnerIds(array $ownerIds): Epic
{
$this->ownerIds = $ownerIds;
return $this;
}
public function setPlannedStartDate(?DateTime $plannedStartDate): Epic
{
$this->plannedStartDate = $plannedStartDate;
return $this;
}
public function setRequestedById(string $requestedById): Epic
{
$this->requestedById = $requestedById;
return $this;
}
public function setStartedAtOverride(?DateTime $startedAtOverride): Epic
{
$this->startedAtOverride = $startedAtOverride;
return $this;
}
}