<?php
namespace App\Entity;
use ApiPlatform\Core\Annotation\ApiFilter;
use ApiPlatform\Core\Annotation\ApiResource;
use ApiPlatform\Core\Annotation\ApiSubresource;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\OrderFilter;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\SearchFilter;
use ApiPlatform\Core\Serializer\Filter\PropertyFilter;
use ApiPlatform\Core\Serializer\Filter\GroupFilter;
use App\Repository\DayRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Serializer\Annotation\Groups;
/**
* @ORM\Entity(repositoryClass=DayRepository::class)
* @ApiResource(
* attributes={
* "order"={"rank": "ASC"}
* },
* normalizationContext={
* "groups"={"day:read"}
* },
* denormalizationContext={
* "groups"={"day:write"}
* },
* collectionOperations={
* "get"={"security"="is_granted('ROLE_USER')"},
* "post"={"security"="is_granted('ROLE_ADMIN')"}
* },
* itemOperations={
* "get"={"security"="is_granted('ROLE_USER')"},
* "delete"={"security"="is_granted('ROLE_ADMIN')"},
* "patch"={"security"="is_granted('ROLE_ADMIN')"},
* "activate_program"={
* "method"="GET",
* "controller"="App\Controller\Api\DayController::activate",
* "path"="/days/{id}/activate",
* "security"="is_granted('ROLE_ADMIN')",
* "openapi_context"={"summary"="Activates a day"},
* },
* "deactivate_program"={
* "method"="GET",
* "controller"="App\Controller\Api\DayController::deactivate",
* "path"="/days/{id}/deactivate",
* "security"="is_granted('ROLE_ADMIN')",
* "openapi_context"={"summary"="Deactivates a day"},
* }
* },
* subresourceOperations={
* "api_programs_day_get_subresource"= {
* "security"="has_role('ROLE_USER')",
* }
* }
* )
* @ApiFilter(OrderFilter::class, properties={"id", "rank", "active", "name"})
* @ApiFilter(SearchFilter::class, properties={
* "name": "partial", "active", "rank", "program.id", "status", "freeDay"
* })
* @ApiFilter(PropertyFilter::class,
* arguments={
* "parameterName"="fields",
* "overrideDefaultProperties"=true
* }
* )
* @ApiFilter(GroupFilter::class, arguments={
* "parameterName": "groups",
* "overrideDefaultGroups": true,
* "whitelist": {"program_single_list", "edit_day"}
* })
*/
class Day
{
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
* @Groups({"day:read", "program_single_list", "edit_day", "program:read"})
*/
private $id;
/**
* @ORM\Column(type="string", length=255)
* @Groups({"day:read", "day:write", "program:read"})
*/
private $name;
/**
* @ORM\Column(type="text")
* @Groups({"day:read", "day:write", "program_single_list", "edit_day", "program:read"})
*/
private $content;
/**
* @ORM\Column(name="`rank`", type="integer")
* @Groups({"day:read", "day:write", "program:read"})
*/
private $rank;
/**
* @ORM\Column(type="datetime")
* @Groups({"day:read", "program:read"})
*/
private $createdAt;
/**
* @ORM\OneToOne(targetEntity=Playlist::class, cascade={"persist", "refresh", "remove"})
* @Groups({"day:read", "program_single_list", "program:read"})
* @ApiSubresource(maxDepth=1)
*/
private $playlist;
/**
* @ORM\ManyToOne(targetEntity=Program::class, inversedBy="days")
* @ORM\JoinColumn(nullable=false)
* @Groups({"day:read", "edit_day"})
* @ApiSubresource(maxDepth=1)
*/
private $program;
/**
* Status are shared with Program
* @ORM\Column(type="string", length=255)
* @Groups({"day:read", "program:read"})
*/
private $status = Program::STATUS_NEW;
/**
* @ORM\Column(type="boolean", options={"default": "0"})
* @Groups({"day:read", "day:write", "program_single_list", "edit_day", "program:read"})
*/
private $freeDay = false;
/**
* @ORM\OneToMany(targetEntity=DayEvent::class, mappedBy="day", orphanRemoval=true)
*/
private $dayEvents;
/**
* Custom fields for ROLE_CLIENT
* @var bool Indicates if a day has been done by the tvUser
* @Groups({"day:read", "day:read:dayCompleted", "program:read"})
*/
public $dayCompleted = false;
/**
* Custom fields for ROLE_CLIENT
* @var int|null
* @Groups({"day:read", "day:read:videosCompletedCount", "program:read"})
*/
public $videosCompletedCount = null;
/**
* Custom fields ROLE_CLIENT
* @var int|null
* @Groups({"day:read", "day:read:activeVideosCount", "program:read"})
*/
public $videosCount = null;
/**
* Custom fields for ROLE_CLIENT
* @var Video|null
* @Groups({"day:read", "day:read:currentVideo", "program:read"})
*/
public $currentVideo = null;
public function __construct()
{
$this->createdAt = new \DateTime();
$this->playlist = new Playlist();
$this->dayEvents = new ArrayCollection();
}
public function __clone()
{
$this->id = null;
$this->status = Program::STATUS_NEW;
$this->playlist = clone $this->playlist;
$this->dayEvents = new ArrayCollection();
$this->createdAt = new \DateTime();
}
public function getId(): ?int
{
return $this->id;
}
public function setId(?int $id): self
{
$this->id = $id;
return $this;
}
public function getName(): ?string
{
return $this->name;
}
public function setName(string $name): self
{
$this->name = $name;
return $this;
}
public function getContent(): ?string
{
return $this->content;
}
public function setContent(string $content): self
{
$this->content = $content;
return $this;
}
public function getRank(): ?int
{
return $this->rank;
}
public function setRank(int $rank): self
{
$this->rank = $rank;
return $this;
}
public function getCreatedAt(): ?\DateTimeInterface
{
return $this->createdAt;
}
public function setCreatedAt(\DateTimeInterface $createdAt): self
{
$this->createdAt = $createdAt;
return $this;
}
public function getPlaylist(): ?Playlist
{
return $this->playlist;
}
public function setPlaylist(?Playlist $playlist): self
{
$this->playlist = $playlist;
return $this;
}
public function getProgram(): ?Program
{
return $this->program;
}
public function setProgram(?Program $program): self
{
$this->program = $program;
return $this;
}
public function getStatus(): ?string
{
return $this->status;
}
public function setStatus(string $status): self
{
$this->status = $status;
return $this;
}
/**
* @param Video $video
* @Groups({"day:write"})
*/
public function setVideoAdd(Video $video)
{
$this->playlist->addVideo($video);
}
/**
* @param Video $video
* @Groups({"day:write"})
*/
public function setVideoRemove(Video $video)
{
$this->playlist->removeVideo($video);
}
public function getFreeDay(): ?bool
{
return $this->freeDay;
}
public function setFreeDay(bool $freeDay): self
{
$this->freeDay = $freeDay;
return $this;
}
/**
* @return Collection|DayEvent[]
*/
public function getDayEvents(): Collection
{
return $this->dayEvents;
}
public function addDayEvent(DayEvent $dayEvent): self
{
if (!$this->dayEvents->contains($dayEvent)) {
$this->dayEvents[] = $dayEvent;
$dayEvent->setDay($this);
}
return $this;
}
public function removeDayEvent(DayEvent $dayEvent): self
{
if ($this->dayEvents->removeElement($dayEvent)) {
// set the owning side to null (unless already changed)
if ($dayEvent->getDay() === $this) {
$dayEvent->setDay(null);
}
}
return $this;
}
}