<?php declare(strict_types=1);
namespace App\Entity\TimeNormalization;
use ApiPlatform\Core\Annotation\{ApiFilter, ApiResource};
use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\DateFilter;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\OrderFilter;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\SearchFilter;
use App\Entity\User;
use App\Interfaces\UuidKeyInterface;
use App\Repository\TimeNormalization\DayRepository;
use App\Traits\UuidEntityTrait;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Symfony\Component\Serializer\Annotation\Groups;
use Symfony\Component\Validator\Constraints as Assert;
#[ApiResource(
collectionOperations: ['get'],
itemOperations: [
'get',
'patch' => ['security' => "is_granted('DAY_HOURS_EDIT', object)"],
]
)]
#[ApiFilter(SearchFilter::class, properties: [
'user.slug' => 'exact',
])]
#[ApiFilter(DateFilter::class, properties: ['date'])]
#[ApiFilter(OrderFilter::class, properties: [
'date' => 'ASC',
])]
#[ORM\Entity(repositoryClass: DayRepository::class)]
#[ORM\Table(name: 'time_norm_day')]
#[UniqueEntity(fields: ['user', 'date'])]
class Day implements UuidKeyInterface
{
use UuidEntityTrait;
public const READ_GROUP = 'Day:read';
public const WRITE_GROUP = 'Day:write';
#[Assert\NotBlank]
#[Groups([self::READ_GROUP])]
#[ORM\ManyToOne(targetEntity: User::class, inversedBy: 'days', cascade: ['persist'])]
private ?User $user = null;
#[Assert\NotBlank]
#[Groups([self::READ_GROUP])]
#[ORM\Column(type: 'date', nullable: false)]
private ?\DateTimeInterface $date = null;
#[Assert\Range(min: 0, max: 8)]
#[Groups([self::READ_GROUP, self::WRITE_GROUP])]
#[ORM\Column(type: 'integer', nullable: false)]
private ?int $hours = null;
public function __construct(User $user, \DateTimeInterface $date, int $hours)
{
$this->user = $user;
$this->date = $date;
$this->hours = $hours;
}
public function setUser(?User $user): self
{
$this->user = $user;
return $this;
}
public function getUser(): ?User
{
return $this->user;
}
public function getDate(): ?\DateTimeInterface
{
return $this->date;
}
public function setDate(\DateTimeInterface $date): self
{
$this->date = $date;
return $this;
}
public function getHours(): ?int
{
return $this->hours;
}
public function setHours(int $hours): self
{
$this->hours = $hours;
return $this;
}
}