<?php
namespace App\Entity;
use ApiPlatform\Core\Annotation\ApiFilter;
use ApiPlatform\Core\Annotation\ApiProperty;
use ApiPlatform\Core\Annotation\ApiResource;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\OrderFilter;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\SearchFilter;
use ApiPlatform\Core\Serializer\Filter\PropertyFilter;
use App\Controller\ClearMemberDataController;
use DateTime;
use Doctrine\ORM\Mapping as ORM;
use Gedmo\Timestampable\Traits\TimestampableEntity;
use Symfony\Component\Serializer\Annotation\Groups;
/**
* @ORM\Entity(repositoryClass="App\Repository\PinpointCampaignUserRepository")
* @ORM\HasLifecycleCallbacks()
*/
#[ApiResource(
attributes: ['security' => "is_granted('ROLE_USER')"],
normalizationContext: ['groups' => ['pinpointCampaignUser:read']],
denormalizationContext: ['groups' => ['pinpointCampaignUser:write']],
collectionOperations: [
'get',
'post' => ['security' => "is_granted('ROLE_ADMIN')"],
],
itemOperations: [
'get',
'clear_memberdata' => [
'method' => 'GET',
'path' => '/pinpoint_campaign_users/{id}/clear',
'controller' => ClearMemberDataController::class,
'normalization_context' => ['groups' => ['pinpointCampaignUser:read']],
],
],
)]
#[ApiFilter(PropertyFilter::class)]
#[ApiFilter(SearchFilter::class, properties: ['id', 'pinpointCampaign' => 'exact', 'user.company' => 'exact', 'user.enable' => 'exact', 'user.email' => 'partial'])]
#[ApiFilter(OrderFilter::class, properties: ['user.id', 'user.uniqueId', 'user.firstName', 'user.email', 'user.enable', 'pinpointCampaign.campaignName'], arguments: ['orderParameterName' => 'order'])]
class PinpointCampaignUser
{
use TimestampableEntity;
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
* @Groups({"pinpointCampaignUser:read"})
*/
#[ApiProperty(identifier: true)]
private $id;
/**
* @var DateTime
*
* @ORM\Column(type="datetime", nullable=true)
* @Groups({"pinpointCampaignUser:read","pinpointCampaign:list"})
*/
private $completedAt;
/**
* @var string
*
* @ORM\Column(type="string", length=50)
* @Groups({"pinpointCampaignUser:read","pinpointCampaign:list"})
*/
private $type;
/**
* @var string
*
* @ORM\Column(type="string", length=30)
* @Groups({"pinpointCampaignUser:read","pinpointCampaign:list"})
*/
private $selectedLanguage;
/**
* @var DateTime
*
* @ORM\Column(type="datetime", nullable=true)
* @Groups({"pinpointCampaignUser:read","pinpointCampaign:list"})
*/
private $openedAt;
/**
* @ORM\ManyToOne(targetEntity=User::class, inversedBy="pinpointCampaignUsers")
* @ORM\JoinColumn(nullable=false)
* @Groups({"pinpointCampaignUser:read","pinpointCampaign:list"})
*/
private $user;
/**
* @ORM\ManyToOne(targetEntity=PinpointCampaign::class, inversedBy="pinpointCampaignUsers")
* @ORM\JoinColumn(nullable=false)
* @Groups({"pinpointCampaignUser:read","pinpointCampaign:list"})
*/
private $pinpointCampaign;
/**
* Company constructor.
*/
public function __construct()
{
$this->createdAt = new \DateTime();
$this->completedAt = null;
$this->updatedAt = null;
$this->openedAt = null;
}
public function getId(): ?int
{
return $this->id;
}
public function getCreatedAt(): DateTime
{
return $this->createdAt;
}
public function setCreatedAt(DateTime $createdAt): self
{
$this->createdAt = $createdAt;
return $this;
}
public function getCompletedAt(): ?DateTime
{
return $this->completedAt;
}
public function setCompletedAt(?DateTime $completedAt): self
{
$this->completedAt = $completedAt;
return $this;
}
public function getType(): ?string
{
return $this->type;
}
public function setType(?string $type): self
{
$this->type = $type;
return $this;
}
public function getSelectedLanguage(): ?string
{
return $this->selectedLanguage;
}
public function setSelectedLanguage(?string $selectedLanguage): self
{
$this->selectedLanguage = $selectedLanguage;
return $this;
}
public function getUpdatedAt(): ?DateTime
{
return $this->updatedAt;
}
public function setUpdatedAt(?DateTime $updatedAt): self
{
$this->updatedAt = $updatedAt;
return $this;
}
public function getOpenedAt(): ?DateTime
{
return $this->openedAt;
}
public function setOpenedAt(?DateTime $openedAt): self
{
$this->openedAt = $openedAt;
return $this;
}
public function getUser(): ?User
{
return $this->user;
}
public function setUser(?User $user): self
{
$this->user = $user;
return $this;
}
#[Groups('pinpointCampaignUser:read')]
public function getSurveyUrl(): string
{
return $_ENV['APP_PROTOCOL'] . '://' . $_ENV['APP_DOMAIN'] . '/survey-campaign/campaign/' . $this->pinpointCampaign->getId() . '?user=' . $this->user->getId() . '';
}
public function getPinpointCampaign(): ?PinpointCampaign
{
return $this->pinpointCampaign;
}
public function setPinpointCampaign(?PinpointCampaign $pinpointCampaign): self
{
$this->pinpointCampaign = $pinpointCampaign;
return $this;
}
#[Groups('pinpointCampaignUser:read')]
public function getTotalQues(): int
{
return $this->pinpointCampaign->getTotalSurveyQuestion();
}
#[Groups('pinpointCampaignUser:read')]
public function getTotalContriQues(): int
{
return $this->user->getTotalContributionQuestion($this->pinpointCampaign);
}
#[Groups('pinpointCampaignUser:read')]
public function getUserPinpointCampaignStatus(): string
{
return $this->user->getContributionStatus();
}
#[Groups('pinpointCampaignUser:read')]
public function getUserPinpointCampaignSubmittedAt()
{
return $this->user->getContributionCreatedAt();
}
}