<?php
namespace App\Entity;
use Cocur\Slugify\Slugify;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Bridge\Doctrine\IdGenerator\UuidGenerator;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\Finder\Finder;
use Symfony\Component\HttpFoundation\File\File;
use Symfony\Component\Uid\UuidV6;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
/**
* @ORM\Entity(repositoryClass="App\Repository\ChannelRepository")
* @ORM\Table(uniqueConstraints={
* @ORM\UniqueConstraint(name="slug_idx", columns={"slug"}),
* @ORM\UniqueConstraint(name="key_idx", columns={"key"})
* })
* @ORM\HasLifecycleCallbacks()
* @UniqueEntity("slug", errorPath="name", message="This name is already in use")
* @UniqueEntity("key", errorPath="name", message="This key is already in use")
*/
class Channel
{
/**
* @ORM\Id()
* @ORM\Column(type="uuid", unique=true)
* @ORM\GeneratedValue(strategy="CUSTOM")
* @ORM\CustomIdGenerator(class=UuidGenerator::class)
* @var UuidV6
*/
private $id;
/**
* @ORM\Column(type="string", length=255)
* @Assert\NotBlank
*/
private $key;
/**
* @ORM\Column(type="string", length=255)
*/
private $slug;
/**
* @ORM\Column(type="string", length=255, nullable=true)
* @Assert\NotBlank
*/
private $name;
/**
* @ORM\Column(type="datetime")
*/
private $lastUploadAt;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\User", inversedBy="channels")
*/
private $user;
/**
* @var bool
* @ORM\Column(type="boolean")
*/
private $archive = false;
public function getUser(): ?User
{
return $this->user;
}
public function setUser(?User $user): self
{
$this->user = $user;
return $this;
}
public function __construct()
{
$this->lastUploadAt = new \DateTime('now');
}
public function getId(): ?UuidV6
{
return $this->id;
}
public function getKey(): ?string
{
return $this->key;
}
public function setKey(?string $key): void
{
$this->key = $key;
}
public function getSlug(): ?string
{
return $this->slug;
}
public function setSlug(?string $slug): void
{
$this->slug = $slug;
}
public function getName(): ?string
{
return $this->name;
}
public function setName(string $name): self
{
$this->name = $name;
$s = Slugify::create();
$this->slug = $s->slugify($name);
return $this;
}
public function getDataDirectory($absolute = false): string
{
$s = $this->id->toRfc4122();
return ($absolute ? (__DIR__.'/../../public') : '').'/data/'.$s[strlen($s)-2].'/'.$s[strlen($s)-1].'/';
}
public function getImDirectory($absolute = false): string
{
return $this->getDataDirectory($absolute).'im/';
}
public function ensureDirectory(): void
{
$filesystem = new Filesystem();
if (!@is_dir($this->getDataDirectory(true))) {
$filesystem->mkdir($this->getDataDirectory(true));
}
}
public function ensureImDirectory(): void
{
$filesystem = new Filesystem();
if (!@is_dir($this->getImDirectory(true))) {
$filesystem->mkdir($this->getImDirectory(true));
}
}
public function getLastUploadAt(): \DateTime
{
return $this->lastUploadAt;
}
public function setLastUploadAt(\DateTime $dt): void
{
$this->lastUploadAt = $dt;
}
public function getArchive(): ?bool
{
return $this->archive;
}
/**
* @ORM\PreRemove
*/
public function deleteAllFiles(): void
{
$filesystem = new Filesystem();
$filesystem->remove($this->getDataDirectory(true));
}
public function deleteOldFiles(): void
{
$days = 14;
$finder = new Finder();
$files = $finder->name("*.webp")->date("< $days days ago")->sortByModifiedTime()->in($this->getDataDirectory(true));
$filesystem = new Filesystem();
$filesystem->remove($files);
$finder = new Finder();
$files = $finder->name("*.jpg")->date("< $days days ago")->sortByModifiedTime()->in($this->getDataDirectory(true));
$filesystem->remove($files);
}
}