<?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\BooleanFilter;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\OrderFilter;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\SearchFilter;
use ApiPlatform\Core\Serializer\Filter\GroupFilter;
use ApiPlatform\Core\Serializer\Filter\PropertyFilter;
use App\Repository\QuestionRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as Gedmo;
use Symfony\Component\Serializer\Annotation\Groups;
/**
* @ORM\Entity(repositoryClass=QuestionRepository::class)
* @ApiResource(
* normalizationContext={
* "groups"={"question:read"}
* },
* denormalizationContext={
* "groups"={"question:write"}
* },
* collectionOperations={
* "get"={
* "security"="is_granted('ROLE_USER') or is_granted('ROLE_ADMIN')"
* },
* "post"={
* "security"="is_granted('ROLE_ADMIN')"
* }
* },
* itemOperations={
* "get"={
* "security"="is_granted('ROLE_USER') or is_granted('ROLE_ADMIN')"
* },
* "delete"={
* "security"="is_granted('ROLE_ADMIN')"
* },
* "patch"={
* "security"="is_granted('ROLE_ADMIN')"
* }
* },
* attributes={"order"={"rank": "ASC", "tvTag.id": "DESC", "id": "ASC"}}
* )
* @ApiFilter(SearchFilter::class, properties={"id": "exact", "name": "partial", "survey.type": "exact", "survey.id": "exact", "survey.active": "exact", "survey.name": "partial", "tvTag.id": "exact", "status": "exact"})
* @ApiFilter(OrderFilter::class, properties={"id", "name", "survey.id", "tvTag.id", "tvTag.name", "active", "rank", "survey.name"})
* @ApiFilter(GroupFilter::class, arguments={
* "parameterName": "groups",
* "overrideDefaultGroups": true
* })
* @ApiFilter(PropertyFilter::class,
* arguments={
* "parameterName"="fields",
* "overrideDefaultProperties"=true
* }
* )
*/
class Question
{
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
* @Groups({"question:read:id", "question:read", "survey:read", "survey_category:read", "question_list", "survey_vitality_front", "answer_recommended_objectives_edit", "teamplay_challenge:read"})
*/
private $id;
/**
* @ORM\Column(type="string", length=255)
* @Groups({"question:read:name", "question:read", "question:write", "survey:read", "survey_category:read", "question_list", "survey_vitality_front", "answer_recommended_objectives_edit", "teamplay_challenge:write", "teamplay_challenge:read"})
*/
private $name;
/**
* @ORM\Column(type="text", nullable=true)
* @Groups({"question:read:id", "question:description", "question:write", "survey:read", "question_list", "survey_vitality_front", "teamplay_challenge:write", "teamplay_challenge:read"})
*/
private $description;
/**
* @ORM\Column(type="datetime", nullable=true)
* @Gedmo\Timestampable(on="update")
*/
private $updatedAt;
/**
* @ORM\Column(type="datetime")
* @Gedmo\Timestampable(on="create")
*/
private $createdAt;
/**
* @ORM\ManyToOne(targetEntity=Survey::class, inversedBy="questions")
* @ORM\JoinColumn(nullable=false)
* @Groups({"question:read:survey", "question:read", "question:write"})
*/
private $survey;
/**
* @ORM\OneToMany(targetEntity=Answer::class, mappedBy="question", orphanRemoval=true, cascade={"persist", "refresh", "remove"})
* @Groups({"question:read", "question:read:answers", "survey:read", "survey_vitality_front", "teamplay_challenge:write", "teamplay_challenge:read"})
*/
private $answers;
/**
* @ORM\OneToMany(targetEntity=UserResponse::class, mappedBy="question", orphanRemoval=true)
*/
private $userResponses;
/**
* @ORM\ManyToOne(targetEntity=TvTag::class, inversedBy="questions")
* @Groups({"question:read:tvTag", "question:read", "question:write", "survey:read"})
*/
private $tvTag;
/**
* @ORM\Column(type="boolean", options={"default": "1"})
* @Groups({"question:read:active", "question:read", "question:write", "survey:read", "question_list", "survey_vitality_front", "teamplay_challenge:write", "teamplay_challenge:read"})
*/
private $active = true;
/**
* @ORM\Column(name="`rank`", type="integer")
* @Groups({"question:read:rank", "question:read", "question:write", "survey:read", "question_list", "teamplay_challenge:write", "teamplay_challenge:read"})
*/
private $rank;
/**
* @ORM\Column(type="boolean", options={"comment":"Rend la question obligatoire", "default": "1"})
* @Groups({"question:read:isRequired", "question:read", "question:write", "survey:read", "question_list", "survey_vitality_front", "teamplay_challenge:write", "teamplay_challenge:read"})
*/
private $isRequired = true;
/**
* @ORM\Column(type="boolean", options={"comment":"Question à choix multiples", "default": "0"})
* @Groups({"question:read:isMultiple", "question:read", "question:write", "survey:read", "question_list", "survey_vitality_front", "teamplay_challenge:write", "teamplay_challenge:read"})
*/
private $isMultiple = false;
/**
* @var ?int
* @Groups({"question:read:nbAsked", "question:read", "survey:read", "teamplay_challenge:read"})
*/
public $nbAsked = 0;
/**
* @var ?bool
* @Groups({"question:read:isAsked", "question:read", "survey:read", "teamplay_challenge:read"})
*/
public $isAsked = false;
public function __construct()
{
$this->answers = new ArrayCollection();
$this->userResponses = new ArrayCollection();
$this->active = true;
$this->rank = 999;
}
public function __clone()
{
$this->id = null;
$this->userResponses = new ArrayCollection();
$this->active = true;
$this->rank = 999;
$this->createdAt = new \DateTime();
$this->updatedAt = new \DateTime();
// Copy des Answers
$answers = new ArrayCollection();
foreach ($this->answers->toArray() as $answer) {
$newAnswer = clone $answer;
$newAnswer->setQuestion($this);
$answers->add($newAnswer);
}
$this->answers = $answers;
}
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 getDescription(): ?string
{
return $this->description;
}
public function setDescription(?string $description): self
{
$this->description = $description;
return $this;
}
public function getUpdatedAt(): ?\DateTimeInterface
{
return $this->updatedAt;
}
public function setUpdatedAt(?\DateTimeInterface $updatedAt): self
{
$this->updatedAt = $updatedAt;
return $this;
}
public function getCreatedAt(): ?\DateTimeInterface
{
return $this->createdAt;
}
public function setCreatedAt(\DateTimeInterface $createdAt): self
{
$this->createdAt = $createdAt;
return $this;
}
public function getSurvey(): ?Survey
{
return $this->survey;
}
public function setSurvey(?Survey $survey): self
{
$this->survey = $survey;
return $this;
}
/**
* @return Collection|Answer[]
*/
public function getAnswers(): Collection
{
return $this->answers;
}
public function addAnswer(Answer $answer): self
{
if (!$this->answers->contains($answer)) {
$this->answers[] = $answer;
$answer->setQuestion($this);
}
return $this;
}
public function removeAnswer(Answer $answer): self
{
if ($this->answers->removeElement($answer)) {
// set the owning side to null (unless already changed)
if ($answer->getQuestion() === $this) {
$answer->setQuestion(null);
}
}
return $this;
}
/**
* @return Collection|UserResponse[]
*/
public function getUserResponses(): Collection
{
return $this->userResponses;
}
public function addUserResponse(UserResponse $userResponse): self
{
if (!$this->userResponses->contains($userResponse)) {
$this->userResponses[] = $userResponse;
$userResponse->setQuestion($this);
}
return $this;
}
public function removeUserResponse(UserResponse $userResponse): self
{
if ($this->userResponses->removeElement($userResponse)) {
// set the owning side to null (unless already changed)
if ($userResponse->getQuestion() === $this) {
$userResponse->setQuestion(null);
}
}
return $this;
}
public function getTvTag(): ?TvTag
{
return $this->tvTag;
}
public function setTvTag(?TvTag $tvTag): self
{
$this->tvTag = $tvTag;
return $this;
}
public function getActive(): ?bool
{
return $this->active;
}
public function setActive(bool $active): self
{
$this->active = $active;
return $this;
}
public function getRank(): ?int
{
return $this->rank;
}
public function setRank(int $rank): self
{
$this->rank = $rank;
return $this;
}
public function getIsRequired(): ?bool
{
return $this->isRequired;
}
public function setIsRequired(bool $isRequired): self
{
$this->isRequired = $isRequired;
return $this;
}
public function getIsMultiple(): ?bool
{
return $this->isMultiple;
}
public function isMultiple(): ?bool
{
return $this->isMultiple;
}
public function setIsMultiple(bool $isMultiple): self
{
$this->isMultiple = $isMultiple;
return $this;
}
}