<?php
namespace Roothirsch\DamBundle\Entity;
use Roothirsch\DamBundle\Repository\AssetRepository;
use Roothirsch\CoreBundle\Entity\Traits\TimetrackedTrait;
use Roothirsch\CoreBundle\Entity\User;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use ApiPlatform\Core\Annotation\ApiResource;
use Gedmo\Mapping\Annotation as Gedmo;
/**
* @ORM\Entity(repositoryClass=AssetRepository::class)
* @ORM\Table(name="dam_asset")
* @ApiResource(
* shortName="Dam/Asset",
* itemOperations={
* "toggle_favorite"={"method"="PUT", "path"="/dam/assets/{id}/toggle_favorite", "requirements"={"id"=".+"}},
* "get",
* "put",
* "delete"
* }
* )
*/
class Asset
{
use TimetrackedTrait;
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string", length=255)
* @Gedmo\Translatable
*/
private $title;
/**
* @ORM\Column(type="text", nullable=true)
*/
private $description;
/**
* @ORM\OneToMany(targetEntity=File::class, mappedBy="asset", orphanRemoval=true, cascade={"persist"})
*/
private $files;
/**
* @ORM\ManyToMany(targetEntity=Category::class, mappedBy="assets")
*/
private $categories;
/**
* @ORM\ManyToMany(targetEntity=User::class)
* @ORM\JoinTable(name="dam_asset_favorites")
*/
private $favorites;
public function __construct()
{
$this->files = new ArrayCollection();
$this->categories = new ArrayCollection();
$this->favorites = new ArrayCollection();
}
public function getId(): ?int
{
return $this->id;
}
public function getTitle(): ?string
{
return $this->title;
}
public function setTitle(string $title): self
{
$this->title = $title;
return $this;
}
public function getDescription(): ?string
{
return $this->description;
}
public function setDescription(?string $description): self
{
$this->description = $description;
return $this;
}
/**
* @return Collection|File[]
*/
public function getFiles(): Collection
{
return $this->files;
}
public function addFile(File $file): self
{
if (!$this->files->contains($file)) {
$this->files[] = $file;
$file->setAsset($this);
}
return $this;
}
public function removeFile(File $file): self
{
if ($this->files->removeElement($file)) {
// set the owning side to null (unless already changed)
if ($file->getAsset() === $this) {
$file->setAsset(null);
}
}
return $this;
}
public function getFirstFile()
{
return current($this->files);
}
/**
* @return Collection|Category[]
*/
public function getCategories(): Collection
{
return $this->categories;
}
public function addCategory(Category $category): self
{
if (!$this->categories->contains($category)) {
$this->categories[] = $category;
$category->addAsset($this);
}
return $this;
}
public function removeCategory(Category $category): self
{
if ($this->categories->removeElement($category)) {
$category->removeAsset($this);
}
return $this;
}
/**
* @return Collection|User[]
*/
public function getFavorites(): Collection
{
return $this->favorites;
}
public function addFavorite(User $user): self
{
if (!$this->favorites->contains($user)) {
$this->favorites->add($user);
}
return $this;
}
public function removeFavorite(User $user): self
{
$this->favorites->removeElement($user);
return $this;
}
public function hasFavorite(User $user)
{
return $this->favorites->contains($user);
}
public function toggleFavorite(User $user)
{
if ($this->hasFavorite($user)) {
$this->removeFavorite($user);
} else {
$this->addFavorite($user);
}
}
public function getBreadCrumbs() {
$breadcrumbs = [];
foreach($this->categories as $category) {
$breadcrumbs[] = $category->getBreadCrumbs();
}
return $breadcrumbs;
}
}