Untitled
unknown
php
4 years ago
15 kB
6
Indexable
<?php
namespace App\Entity;
use App\Entity\Tag\Category;
use App\Entity\Tag\Tag;
use App\Repository\EventRepository;
use CodeLabs\Listing\Searching\Attribute\Searchable;
use CodeLabs\Listing\Filtering\Attribute\Filterable;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\Common\Collections\Criteria;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Constraints\LessThanOrEqual;
/**
* @ORM\Entity(repositoryClass=EventRepository::class)
* @ORM\HasLifecycleCallbacks()
*/
class Event implements \JsonSerializable
{
const ALIAS = 'event';
public function __construct(
/**
* @ORM\Id
* @ORM\GeneratedValue(strategy="UUID")
* @ORM\Column(type="guid")
*/
private ?string $id = null,
/**
* @ORM\Column(type="string", length=255)
*/
#[Searchable]
private ?string $title = null,
/**
* @ORM\Column(type="string", length=255, unique=true, nullable=true)
*/
private ?string $slug = null,
/**
* @ORM\Column(type="text", nullable=true)
*/
#[Searchable]
private ?string $description = null,
/**
* @ORM\Column(type="decimal", precision="8", scale="2", nullable=true)
*/
#[Assert\GreaterThanOrEqual(0, message: 'price.GreaterThanOrEqual')]
private ?string $price = null,
/**
* @ORM\Column(type="string", length=255, nullable=true)
*/
private ?string $place = null,
/**
* @ORM\Column(type="integer", nullable=true)
*/
#[Assert\GreaterThanOrEqual(0, message: 'preferredAgeGroupFrom.GreaterThanOrEqual')]
private ?int $preferredAgeGroupFrom = null,
/**
* @ORM\Column(type="integer", nullable=true)
*/
#[Assert\GreaterThanOrEqual(propertyPath: 'preferredAgeGroupFrom', message: 'preferredAgeGroupTo.greater_than_or_equal_preferredAgeGroupFrom')]
#[Assert\LessThanOrEqual(150)]
private ?int $preferredAgeGroupTo = null,
/**
* @ORM\Column(type="boolean", options={"default" : 0}, nullable=true)
*/
private ?bool $guestsCanInviteFriends = null,
/**
* @ORM\Column(type="datetime")
*/
#[Filterable]
private ?\DateTime $startsAt = null,
/**
* @ORM\Column(type="datetime", nullable=true)
*/
#[Assert\GreaterThanOrEqual(propertyPath: 'startsAt', message: 'event.ends_at.greater_than_or_equal_starts_at')]
private ?\DateTime $endsAt = null,
/**
* @ORM\ManyToMany(targetEntity=Tag::class, inversedBy="events")
*/
private ?Collection $tags = null,
/**
* @ORM\OneToOne(targetEntity=Image::class, fetch="EAGER", cascade={"persist"}, orphanRemoval=true)
*/
private ?Image $coverImage = null,
/**
* @ORM\ManyToOne(targetEntity=User::class)
* @ORM\JoinColumn(name="host_id", referencedColumnName="id")
*/
private ?User $host = null,
/**
* @ORM\ManyToMany(targetEntity=User::class)
* @ORM\JoinTable(name="co_host_event")
*/
private ?Collection $coHosts = null,
/**
* @ORM\ManyToMany(targetEntity=Image::class, cascade={"persist"}, orphanRemoval=true)
* @ORM\JoinTable(name="event_gallery")
*/
private ?Collection $gallery = null,
/**
* @ORM\OneToOne(targetEntity=Location::class, cascade={"persist"})
*/
private ?Location $location = null,
/**
* @ORM\OneToMany(targetEntity=EventDistance::class, mappedBy="event", orphanRemoval=true)
*/
private ?Collection $distances = null,
/**
* @ORM\OneToMany(targetEntity=EventMember::class, mappedBy="event", cascade={"persist"}, orphanRemoval=true, fetch="EXTRA_LAZY")
*/
private ?Collection $eventMembers = null,
/**
* @ORM\OneToOne(targetEntity=EventUserStatistic::class, mappedBy="event")
*/
private ?EventUserStatistic $userStatistic = null,
/**
* @ORM\OneToMany(targetEntity=EventSlugHistory::class, mappedBy="event", cascade={"persist"}, orphanRemoval=true)
*/
private ?Collection $slugsHistory = null,
)
{
$this->tags = new ArrayCollection();
$this->coHosts = new ArrayCollection();
$this->gallery = new ArrayCollection();
$this->distances = new ArrayCollection();
$this->eventMembers = new ArrayCollection();
$this->slugsHistory = new ArrayCollection();
}
public function getId(): ?string
{
return $this->id;
}
public function getTitle(): ?string
{
return $this->title;
}
public function setTitle(string $title): void
{
$this->title = $title;
}
public function setSlug(?string $slug): void
{
$this->slug = $slug;
}
public function getSlug(): ?string
{
return $this->slug;
}
public function isSlugTheSame(string $slug): bool
{
return $this->slug===$slug;
}
public function getStartsAt(): ?\DateTime
{
return $this->startsAt;
}
public function getEndsAt(): ?\DateTime
{
return $this->endsAt;
}
public function isUpcoming(): bool
{
return $this->startsAt > new \DateTime();
}
public function isInProgress(): bool
{
$now = new \DateTime();
return $this->startsAt < $now && $this->endsAt > $now;
}
public function isFinished(): bool
{
return $this->endsAt < new \DateTime();
}
/**
* Whether user can join or be interested.
*/
public function canUserEnlist(): bool
{
return $this->endsAt > new \DateTime();
}
public function setStartsAt(\DateTime $startsAt): void
{
$this->startsAt = $startsAt;
}
public function setEndsAt(?\DateTime $endsAt): void
{
$this->endsAt = $endsAt;
}
public function setDefaultEndsAt(): void
{
if(is_null($this->startsAt)) {
return;
}
$this->endsAt = clone $this->startsAt;
$this->endsAt->add(new \DateInterval('PT2H'));
}
/**
* @return Collection|Tag[]
*/
public function getTags(): Collection
{
return $this->tags;
}
public function addTag(Tag $tag): void
{
if (!$this->tags->contains($tag)) {
$this->tags[] = $tag;
}
}
public function setTags(Collection $tags): void
{
$this->tags = $tags;
}
public function removeTag(Tag $tag): void
{
$this->tags->removeElement($tag);
}
public function getTagsIdsByCategoryIdHumanReadable(string $idHumanReadable): array
{
$tagsIds = $this->tags->map(function(Tag $tag) use($idHumanReadable) {
return $tag->getCategory()->getIdHumanReadable()===$idHumanReadable ? $tag->getId() : null;
})->toArray();
return array_values(array_filter($tagsIds));
}
private function getTagsByCategoryIdHumanReadable(string $categoryIdHumanReadable): ?Collection
{
return $this->tags->filter(function(Tag $tag) use($categoryIdHumanReadable) {
return $tag->getCategory()?->getIdHumanReadable() === $categoryIdHumanReadable;
});
}
public function getTagsValues(): ?Collection
{
return $this->getTagsByCategoryIdHumanReadable(Category::ID_HUMAN_READABLE_VALUES);
}
public function getTagsInterests(): ?Collection
{
return $this->getTagsByCategoryIdHumanReadable(Category::ID_HUMAN_READABLE_INTERESTS);
}
public function getTagsMyPersonality(): ?Collection
{
return $this->getTagsByCategoryIdHumanReadable(Category::ID_HUMAN_READABLE_MY_PERSONALITY);
}
public function getCoverImage(): ?Image
{
return $this->coverImage;
}
public function setCoverImage(?Image $coverImage): void
{
$this->coverImage = $coverImage;
}
public function setHost(?User $host): void
{
$this->host = $host;
}
public function getHost(): ?User
{
return $this->host;
}
public function getHostId(): ?string
{
return $this->host instanceof User ? $this->host->getId() : null;
}
public function getCoHosts(): ?Collection
{
return $this->coHosts;
}
public function getCoHostsIds(): array
{
return $this->coHosts->map(function(User $host) {
return $host->getId();
})->toArray();
}
public function addCoHost(User $user): void
{
if (!$this->coHosts->contains($user)) {
$this->coHosts[] = $user;
}
}
public function setCoHosts(?Collection $coHosts): void
{
$this->coHosts = $coHosts;
}
public function getDescription(): ?string
{
return $this->description;
}
public function getPrice(): ?string
{
return $this->price;
}
public function getPlace(): ?string
{
return $this->place;
}
public function getPreferredAgeGroupFrom(): ?int
{
return $this->preferredAgeGroupFrom;
}
public function getPreferredAgeGroupTo(): ?int
{
return $this->preferredAgeGroupTo;
}
public function getGuestsCanInviteFriends(): ?bool
{
return $this->guestsCanInviteFriends;
}
public function setDescription(?string $description): void
{
$this->description = $description;
}
public function setPrice(?string $price): void
{
$this->price = $price;
}
public function setPlace(?string $place): void
{
$this->place = $place;
}
public function setPreferredAgeGroupFrom(?int $preferredAgeGroupFrom): void
{
$this->preferredAgeGroupFrom = $preferredAgeGroupFrom;
}
public function setPreferredAgeGroupTo(?int $preferredAgeGroupTo): void
{
$this->preferredAgeGroupTo = $preferredAgeGroupTo;
}
public function setGuestsCanInviteFriends(?bool $guestsCanInviteFriends): void
{
$this->guestsCanInviteFriends = $guestsCanInviteFriends;
}
public function getGallery(): ?Collection
{
return $this->gallery;
}
public function addGalleryImage(Image $image): void
{
if (!$this->gallery->contains($image)) {
$this->gallery[] = $image;
}
}
public function removeGalleryImage(Image $image): void
{
$this->gallery->removeElement($image);
}
public function setGallery(?Collection $gallery): void
{
$this->gallery = $gallery;
}
public function getLocation(): ?Location
{
return $this->location;
}
public function setLocation(?Location $location): void
{
$this->location = $location;
}
public function clearDistances(): void
{
$this->distances->clear();
}
public function getDistances(): ?Collection
{
return $this->distances;
}
public function getDistanceByPlaceId(string $placeId): ?EventDistance
{
$criteria = Criteria::create()
->andWhere(Criteria::expr()->eq('place_id', $placeId))
;
$result = $this->distances->matching($criteria)->current();
return $result instanceof EventDistance ? $result : null;
}
public function getEventMembers(): ?Collection
{
return $this->eventMembers;
}
public function addEventMember(EventMember $eventMember): void
{
if ($this->eventMembers->contains($eventMember)) {
return;
}
$this->eventMembers->add($eventMember);
}
public function getEventMemberByUser(User $user): ?EventMember
{
return $this->eventMembers->filter(function (EventMember $eventMember) use ($user) {
return $eventMember->getUser()->getId() === $user->getId();
})->first() ?: null;
}
public function getJoinedEventMembers(): Collection
{
return $this->eventMembers->filter(function(EventMember $eventMember) { return $eventMember->isJoined(); });
}
public function getInterestedEventMembers(): Collection
{
return $this->eventMembers->filter(function(EventMember $eventMember) { return $eventMember->isInterested(); });
}
public function getJoinRequestEventMembers(): Collection
{
return $this->eventMembers->filter(function(EventMember $eventMember) { return $eventMember->isJoinRequest(); });
}
<<<<<<< HEAD
=======
>>>>>>> feature/HAN-64-event-sharing
public function getUserStatistic(): ?EventUserStatistic
{
return $this->userStatistic;
}
public function getSlugsHistory(): ?Collection
{
return $this->slugsHistory;
}
public function addSlugToHistory(string $slug): void
{
foreach($this->slugsHistory as $slugHistory) {
if($slugHistory->getSlug()===$slug) {
return;
}
}
$eventSlugHistory = new EventSlugHistory($this, $slug);
$this->slugsHistory->add($eventSlugHistory);
}
<<<<<<< HEAD
=======
>>>>>>> feature/HAN-64-event-sharing
public function jsonSerialize(): array
{
return [
'id' => $this->id,
'title' => $this->title,
'slug' => $this->slug,
'description' => $this->description,
'price' => $this->price,
'place' => $this->place,
'preferredAgeGroupFrom' => $this->preferredAgeGroupFrom,
'preferredAgeGroupTo' => $this->preferredAgeGroupTo,
'guestsCanInviteFriends' => $this->guestsCanInviteFriends,
'startsAt' => $this->startsAt?->format('Y-m-d H:i:s'),
'endsAt' => $this->endsAt?->format('Y-m-d H:i:s'),
'coverImage' => $this->coverImage,
'host' => $this->host,
'coHosts' => $this->getCoHosts()->toArray(),
'gallery' => $this->getGallery()->toArray(),
'location' => $this->location,
'tagsValues' => array_values($this->getTagsValues()->toArray()),
'tagsInterests' => array_values($this->getTagsInterests()->toArray()),
'tagsMyPersonality' => array_values($this->getTagsMyPersonality()->toArray()),
];
}
/**
* @ORM\PreFlush
*/
public function preFlush(): void
{
if(is_null($this->endsAt)) {
$this->setDefaultEndsAt();
}
}
}
Editor is loading...