<?php
namespace Whater\Domain\Blog\Model;
use BornFree\TacticianDomainEvent\Recorder\ContainsRecordedEvents;
use BornFree\TacticianDomainEvent\Recorder\EventRecorderCapabilities;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Ramsey\Uuid\Uuid;
use Assert\Assertion;
use Whater\Domain\Common\Exception\InvalidUUIDException;
/**
* Class Article
*
* @package Whater\Domain\Blog\Model
*/
class ArticleCategory implements ContainsRecordedEvents
{
use EventRecorderCapabilities;
/**
* @var string
*/
private $uuid;
/**
* @var Collection
*/
private $articles;
/**
* @var Collection
*/
private $translations;
/**
* @var string
*/
private $defaultLocale;
/**
* @var null|\DateTime
*/
private $createdAt;
/**
* @var null|\DateTime
*/
private $updatedAt;
public function __construct(
string $articleCategoryId = null,
string $title,
string $slug,
string $locale = Article::DEFAULT_LOCALE
) {
try {
$this->uuid = Uuid::fromString($articleCategoryId ?: Uuid::uuid4())->toString();
} catch (\InvalidArgumentException $e) {
throw new InvalidUUIDException();
}
$articleCategoryTranslation = new ArticleCategoryTranslation(
null,
$this,
$locale,
$title,
$slug
);
$this->translations = new ArrayCollection();
$this->translations->add($articleCategoryTranslation);
$this->defaultLocale = $locale;
$this->articles = new ArrayCollection();
$this->createdAt = new \DateTime();
$this->updatedAt = $this->createdAt();
}
/**
* @return string
*/
public function id(): string
{
return $this->uuid;
}
/**
* @return Collection
*/
public function articles(): Collection
{
return $this->articles;
}
/**
* @return string
*/
public function slug(): string
{
return $this->getTranslation()->slug();
}
/**
* @return string
*/
public function title(): string
{
return $this->getTranslation()->title();
}
/**
* @return \DateTime
*/
public function createdAt(): \DateTime
{
return $this->createdAt;
}
/**
* @return \DateTime
*/
public function updatedAt(): \DateTime
{
return $this->updatedAt;
}
/**
* @param string|null $locale
* @return ArticleCategoryTranslation
*/
public function getTranslation(?string $locale = null): ArticleCategoryTranslation
{
$articleCategoryTranslation = null;
$locale = $locale ?: $this->defaultLocale();
foreach ($this->translations as $translation) {
if ($translation->locale() == $locale) {
$articleCategoryTranslation = $translation;
break;
}
}
if (is_null($articleCategoryTranslation)) {
$articleCategoryTranslation = new ArticleCategoryTranslation(
null,
$this,
$locale,
$this->getTranslation(Article::DEFAULT_LOCALE)->title(),
$this->getTranslation(Article::DEFAULT_LOCALE)->slug()
);
$this->translations->add($articleCategoryTranslation);
}
return $articleCategoryTranslation;
}
public function updateTranslation(
string $locale,
string $title,
string $slug
) {
$articleCategoryTranslation = $this->getTranslation($locale);
if (is_null($articleCategoryTranslation)) {
$articleCategoryTranslation = new ArticleCategoryTranslation(
null,
$this,
$locale,
$title,
$slug
);
$this->translations->add($articleCategoryTranslation);
} else {
$articleCategoryTranslation->updateArticleCategoryTranslation(
$title,
$slug
);
}
$this->updatedAt = new \DateTime();
return $this;
}
/**
* @return string
*/
public function defaultLocale(): string
{
return $this->defaultLocale;
}
}