<?php
namespace App\Entity\Redaktor;
use App\Entity\EntityId;
use App\Entity\ObjectFileHandlingInterface;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\Finder\Finder;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Webmozart\Assert\Assert;
#[ORM\Entity]
#[ORM\Table(name: 'redaktor')]
class Redaktor implements ObjectFileHandlingInterface
{
public const int MAX_LENGTH_VORNAME = 64;
public const int MAX_LENGTH_NACHNAME = 64;
public const int MAX_LENGTH_KURZZEICHEN = 8;
public const int MAX_LENGTH_FUNKTION = 32;
public const int MAX_LENGTH_EMAIL = 64;
public const int MAX_WIDTH_PORTRAIT_IMAGE = 1024;
#[ORM\Column(name: 'vorname', type: 'string', length: 64, nullable: true)]
private ?string $vorname = null;
#[ORM\Column(name: 'nachname', type: 'string', length: 64, nullable: true)]
private ?string $nachname = null;
#[ORM\Column(name: 'kurzzeichen', type: 'string', length: 8, nullable: true)]
private ?string $kurzzeichen = null;
#[ORM\Column(name: 'funktion', type: 'string', length: 32, nullable: true)]
private ?string $funktion = null;
#[ORM\Column(name: 'email', type: 'string', length: 64, nullable: true)]
private ?string $email = null;
#[ORM\Column(name: 'sort', type: 'integer', nullable: true)]
private int $sort = 100000;
#[ORM\Column(name: 'is_visible_on_frontend', type: 'boolean', nullable: true)]
private bool $isVisibleOnFrontend;
#[ORM\Column(name: 'portrait_image', type: 'json', nullable: true)]
private array $portraitImage = [];
public function __construct(
#[ORM\Id]
#[ORM\Column(name: "id", type: "entityId")]
#[ORM\GeneratedValue(strategy: "NONE")]
private EntityId $id,
string $vorname,
string $nachname,
bool $isVisibleOnFrontend
)
{
$this->setVorname($vorname);
$this->setNachname($nachname);
$this->setIsVisibleOnFrontend($isVisibleOnFrontend); // letzte position
}
public function change(array $options): void
{
$resolver = new OptionsResolver();
$resolver->setRequired(['nachname', 'vorname', 'is_visible_on_frontend', 'portrait_image', 'kurzzeichen', 'funktion', 'email']);
$resolver->setAllowedTypes('portrait_image', RedaktorPortraitImage::class);
$options = $resolver->resolve($options);
$this->setNachname($options['nachname']);
$this->setVorname($options['vorname']);
$this->setIsVisibleOnFrontend($options['is_visible_on_frontend']);
$this->setPortraitImage($options['portrait_image']);
$this->setKurzzeichen($options['kurzzeichen']);
$this->setFunktion($options['funktion']);
$this->setEmail($options['email']);
}
public function id(): EntityId
{
return $this->id;
}
public function vorname(): ?string
{
return $this->vorname;
}
private function setVorname(?string $vorname): void
{
Assert::minLength($vorname, 1);
Assert::maxLength($vorname, self::MAX_LENGTH_VORNAME);
$this->vorname = $vorname;
}
private function setIsVisibleOnFrontend(bool $isVisibleOnFrontend): void
{
Assert::boolean($isVisibleOnFrontend);
$this->isVisibleOnFrontend = $isVisibleOnFrontend;
}
private function setPortraitImage(RedaktorPortraitImage $image): void
{
$this->portraitImage['filename'] = $image->getFilename();
$this->portraitImage['alt'] = $image->getAlt();
$this->portraitImage['caption'] = $image->getCaption();
}
public function portraitImage(): RedaktorPortraitImage
{
if ($this->portraitImage && array_key_exists('filename', $this->portraitImage)) {
$fileName = $this->portraitImage['filename'];
$alt = array_key_exists('alt', $this->portraitImage) ? $this->portraitImage['alt'] : '';
$caption = array_key_exists('caption', $this->portraitImage) ? $this->portraitImage['caption'] : '';
return RedaktorPortraitImage::create($fileName, $alt, $caption, $this->baseObjectServerDirPath(), $this->baseObjectWebDirPath());
}
return RedaktorPortraitImage::createNonExistImage();
}
public function nachname(): ?string
{
return $this->nachname;
}
private function setNachname(?string $nachname): void
{
Assert::minLength($nachname, 1);
Assert::maxLength($nachname, self::MAX_LENGTH_NACHNAME);
$this->nachname = $nachname;
}
public function kurzzeichen(): ?string
{
return $this->kurzzeichen;
}
private function setKurzzeichen(?string $kurzzeichen): void
{
Assert::maxLength($kurzzeichen, self::MAX_LENGTH_KURZZEICHEN);
$this->kurzzeichen = $kurzzeichen;
}
public function funktion(): ?string
{
return $this->funktion;
}
private function setFunktion(?string $funktion): void
{
Assert::maxLength($funktion, self::MAX_LENGTH_FUNKTION);
$this->funktion = $funktion;
}
public function email(): ?string
{
return $this->email;
}
private function setEmail(?string $email): void
{
Assert::maxLength($email, self::MAX_LENGTH_EMAIL);
$this->email = $email;
}
public function sort(): int
{
return $this->sort;
}
public function isVisibleOnFrontend(): bool
{
return $this->isVisibleOnFrontend;
}
public function fullName(): string
{
return $this->vorname.' '.$this->nachname;
}
#[\Override]
public function baseObjectServerDirPath(): string
{
return __DIR__.'/../../../var/data/public/redaktor/'.$this->id;
}
#[\Override]
public function baseObjectWebDirPath(): string
{
return '/data/redaktor/'.$this->id;
}
#[\Override]
public function removeUnusedFiles(): void
{
$serverPath = $this->baseObjectServerDirPath();
// Auflistung aller effektiv benötigter Filenamen dieses Objects, damit diese erhalten bleiben
$usedFiles_ = [];
if ($this->portraitImage()->getFilename()) {
$usedFiles_[] = $this->portraitImage()->getFilename();
}
// Ende
// Lösche alle Files aus dem Objektverzeichnis, welche nicht im Objekt vorhanden sind
$fs = new Filesystem();
if ($fs->exists($serverPath)) {
$finder = new Finder();
$finder->files()->in($serverPath);
foreach ($finder as $file) {
if (!in_array($file->getFilename(), $usedFiles_)) {
$fs->remove($file->getRealPath());
}
}
}
// Ende
}
}