<?phpnamespace Whater\Domain\Notification\Model;use BornFree\TacticianDomainEvent\Recorder\ContainsRecordedEvents;use BornFree\TacticianDomainEvent\Recorder\EventRecorderCapabilities;use Ramsey\Uuid\Uuid;use Whater\Domain\Common\Exception\InvalidUUIDException;use Whater\Domain\Notification\Event\NotificationWasCreated;use Whater\Domain\User\Model\User;/** * * @package Whater\Domain\Notification\Model */class Notification implements ContainsRecordedEvents{ use EventRecorderCapabilities; /** * @var string */ private $uuid; /** * @var User */ private $user; /** * @var string */ private $title; /** * @var string */ private $message; /** * @var string */ private $link; /** * @var string */ private $checksum; /** * @var \DateTime */ private $createdAt; /** * @var \DateTime */ private $readAt; public function __construct( string $notificationId = null, User $user = null, string $message, string $title = null, string $link = null ) { try { $this->uuid = Uuid::fromString($notificationId ?: Uuid::uuid4())->toString(); } catch (\InvalidArgumentException $e) { throw new InvalidUUIDException(); } $this->user = $user; $this->message = $message; $this->title = $title; $this->link = $link; $this->createdAt = new \DateTime(); //Calculate checksum $notificationDate = clone $this->createdAt(); $notificationDate->setTimezone(new \DateTimeZone('UTC')); $hash = md5($notificationDate->format('dmYHis')); $hash = md5($hash . $this->title()); $hash = md5($hash . $this->user()); $this->checksum = $hash; $this->record(new NotificationWasCreated($this)); } public function readNotification(): Notification { if ($this->readAt() == null) { $this->readAt = new \DateTime(); } return $this; } public function unreadNotification(): Notification { $this->readAt = null; return $this; } /** * @return string */ public function id(): string { return $this->uuid; } /** * @return string */ public function message(): string { return $this->message; } /** * @return string|null */ public function title(): ?string { return $this->title; } /** * @return string|null */ public function link(): ?string { return $this->link; } /** * @return string|null */ public function checksum(): ?string { return $this->checksum; } /** * @return User */ public function user(): User { return $this->user; } /** * @return \DateTime */ public function createdAt(): \DateTime { return $this->createdAt; } /** * @return \DateTime|null */ public function readAt(): ?\DateTime { return $this->readAt; }}