src/Domain/Entity/Trip.php line 116

Open in your IDE?
  1. <?php
  2. namespace App\Domain\Entity;
  3. use ApiPlatform\Metadata\ApiResource;
  4. use ApiPlatform\Metadata\Delete;
  5. use ApiPlatform\Metadata\Get;
  6. use ApiPlatform\Metadata\GetCollection;
  7. use ApiPlatform\Metadata\Patch;
  8. use ApiPlatform\Metadata\Post;
  9. use ApiPlatform\Metadata\Put;
  10. use App\Application\ApiResources\State\Provider\Trip\TripGetCollectionProvider;
  11. use App\Application\Controller\Api\Trip\DuplicateAction;
  12. use App\Application\Controller\Api\Trip\ExportAction;
  13. use App\Application\Controller\Api\Trip\GetPdfAction;
  14. use App\Application\Controller\Api\Trip\GetTripAction;
  15. use App\Application\Controller\Api\Trip\PostAction;
  16. use App\Application\Controller\Api\Trip\PutAction;
  17. use App\Application\Controller\Api\Trip\SearchAction;
  18. use App\Application\Controller\Api\Trip\ShareTripAction;
  19. use App\Application\Controller\Api\Trip\UserShareTripAction;
  20. use App\Application\Dto\Trip\ShareTripInput;
  21. use App\Application\Dto\Trip\TripSearchOutput;
  22. use App\Application\Dto\Trip\UserShareTripInput;
  23. use App\Domain\Entity\Behavior\Identifiable;
  24. use App\Domain\Entity\Comment\TripComment;
  25. use App\Domain\Entity\Enumeration\TripAttribute;
  26. use App\Domain\Entity\Translation\TripTranslation;
  27. use DateTime;
  28. use Doctrine\Common\Collections\ArrayCollection;
  29. use Doctrine\Common\Collections\Collection;
  30. use Gedmo\SoftDeleteable\Traits\SoftDeleteable;
  31. use Gedmo\Timestampable\Traits\Timestampable;
  32. use Locastic\ApiPlatformTranslationBundle\Model\AbstractTranslatable;
  33. use Locastic\ApiPlatformTranslationBundle\Model\TranslationInterface;
  34. /**
  35.  * Class Trip
  36.  *
  37.  * @package App\Domain\Entity
  38.  */
  39. #[ApiResource(
  40.     operations: [
  41.         new Delete(security"is_granted('ROLE_ADMIN') or object.author.id == user.id"),
  42.         new GetCollection(
  43.             uriTemplate'/trips/export',
  44.             controllerExportAction::class,
  45.         ),
  46.         new GetCollection(
  47.             normalizationContext: ['groups' => ['trip_list']],
  48.             filters: [
  49.                 'trip.query_filter',
  50.                 'trip.order_filter',
  51.                 'trip.search_filter',
  52.                 'trip.range_filter',
  53.                 'soft_delete_filter',
  54.             ],
  55.             providerTripGetCollectionProvider::class,
  56.         ),
  57.         new GetCollection(
  58.             uriTemplate'/trips/limited_infos',
  59.             normalizationContext: ['groups' => ['trip_limited_infos']],
  60.             filters: [
  61.                 'trip.query_filter',
  62.                 'trip.order_filter',
  63.                 'trip.search_filter',
  64.                 'trip.range_filter',
  65.                 'soft_delete_filter',
  66.             ],
  67.         ),
  68.         new GetCollection(
  69.             uriTemplate'/trips/elastic',
  70.             controllerSearchAction::class,
  71.             outputTripSearchOutput::class,
  72.             name'elastic_trips',
  73.         ),
  74.         new GetCollection(
  75.             uriTemplate'/trips/list',
  76.             security"is_granted('ROLE_ADMIN') or object.author.id == user.id",
  77.             normalizationContext: ['groups' => ['trip_board_list']],
  78.             filters: [
  79.                 'trip.query_filter',
  80.                 'trip.order_filter',
  81.                 'trip.search_filter',
  82.                 'trip.range_filter',
  83.                 'soft_delete_filter',
  84.             ],
  85.         ),
  86.         new Get(uriTemplate'/trips/{uuid}'controllerGetTripAction::class),
  87.         new Get(uriTemplate'/trips/{uuid}/pdf'controllerGetPdfAction::class),
  88.         new Get(uriTemplate'/trips/{uuid}/duplicate'controllerDuplicateAction::class),
  89.         new Put(
  90.             uriTemplate'/trips/{uuid}/share',
  91.             controllerUserShareTripAction::class,
  92.             security"is_granted('ROLE_USER')",
  93.             inputUserShareTripInput::class,
  94.         ),
  95.         new Post(
  96.             uriTemplate'/trips/share',
  97.             controllerShareTripAction::class,
  98.             security"is_granted('ROLE_USER')",
  99.             inputShareTripInput::class
  100.         ),
  101.         new Post(controllerPostAction::class, security"is_granted('ROLE_USER')"),
  102.         new Put(
  103.             controllerPutAction::class,
  104.             security"is_granted('ROLE_ADMIN') or object.author.id == user.id"
  105.         ),
  106.         new Patch(
  107.             security"is_granted('ROLE_ADMIN') or object.author.id == user.id"
  108.         )
  109.     ],
  110.     normalizationContext: ['groups' => ['trip_read']],
  111.     denormalizationContext: ['groups' => ['trip_write']]
  112. )]
  113. class Trip extends AbstractTranslatable
  114. {
  115.     use Identifiable;
  116.     use Timestampable;
  117.     use SoftDeleteable;
  118.     public Collection $attributes;
  119.     public Collection $categories;
  120.     public Collection $clonedTrips;
  121.     public Collection $comments;
  122.     public Collection $countries;
  123.     /**
  124.      * @var Collection<TripMapPoint>
  125.      */
  126.     public Collection $directionWaypoints;
  127.     public function __construct(
  128.         public float $totalDistance,
  129.         public int $totalDuration,
  130.         public int $stepsCount,
  131.         public bool $avoidHighways false,
  132.         public bool $avoidTolls false,
  133.         public bool $topTrip false,
  134.         public bool $favorite false,
  135.         public bool $shared false,
  136.         public ?string $description null,
  137.         public ?TripMapPoint $directionStart null,
  138.         public ?Media $photo null,
  139.         public ?Media $banner null,
  140.         public ?TripMapPoint $directionEnd null,
  141.         public ?DateTime $startDate null,
  142.         public ?DateTime $endDate null,
  143.         public ?Person $author null,
  144.         public ?string $authorName null,
  145.         public ?Trip $clonedFrom null,
  146.         public float $averageNotation 0,
  147.         public ?string $remoteId null,
  148.         public ?string $recoRemoteId null,
  149.         public ?DateTime $zhistUpdate null,
  150.         public array $polylines = [],
  151.         /** for dto only */
  152.         public ?string $nextTrip null,
  153.         public ?string $previousTrip null,
  154.     ) {
  155.         parent::__construct();
  156.         $this->attributes = new ArrayCollection();
  157.         $this->directionWaypoints = new ArrayCollection();
  158.         $this->clonedTrips = new ArrayCollection();
  159.         $this->comments = new ArrayCollection();
  160.         $this->countries = new ArrayCollection();
  161.         $this->categories = new ArrayCollection();
  162.     }
  163.     public function __clone()
  164.     {
  165.         $this->id null;
  166.         $this->remoteId null;
  167.         $this->recoRemoteId null;
  168.         $this->uuid null;
  169.         $this->createdAt null;
  170.         $this->updatedAt null;
  171.         $this->topTrip false;
  172.         $this->favorite false;
  173.         $this->shared false;
  174.         $this->comments = new ArrayCollection();
  175.         if ($this->directionStart) {
  176.             $this->directionStart = clone $this->directionStart;
  177.         }
  178.         if ($this->directionEnd) {
  179.             $this->directionEnd = clone $this->directionEnd;
  180.         }
  181.         $waypoints $this->directionWaypoints->toArray();
  182.         $this->directionWaypoints = new ArrayCollection();
  183.         foreach ($waypoints as $waypoint) {
  184.             $this->addDirectionWaypoint(clone $waypoint);
  185.         }
  186.         $attributes $this->attributes->toArray();
  187.         $this->attributes = new ArrayCollection();
  188.         foreach ($attributes as $attribute) {
  189.             $this->addTripAttribute(clone $attribute);
  190.         }
  191.         $translations $this->translations->toArray();
  192.         $this->translations = new ArrayCollection();
  193.         foreach ($translations as $translation) {
  194.             $this->addTranslation(clone $translation);
  195.         }
  196.         return $this;
  197.     }
  198.     public function hasDirectionWaypoint(TripMapPoint $mapPoint): bool
  199.     {
  200.         return $this->directionWaypoints->contains($mapPoint);
  201.     }
  202.     public function addDirectionWaypoint(TripMapPoint $mapPoint): void
  203.     {
  204.         if ($this->directionWaypoints->contains($mapPoint)) {
  205.             return;
  206.         }
  207.         $this->directionWaypoints->add($mapPoint);
  208.     }
  209.     public function addTripAttribute(TripAttribute $tripAttribute): void
  210.     {
  211.         if (!$this->attributes->contains($tripAttribute)) {
  212.             $this->attributes->add($tripAttribute);
  213.         }
  214.     }
  215.     public function getClonedFromId(): int null
  216.     {
  217.         return $this->clonedFrom?->id;
  218.     }
  219.     public function removeDirectionWaypoint(TripMapPoint $mapPoint): void
  220.     {
  221.         if ($this->directionWaypoints->contains($mapPoint)) {
  222.             $this->directionWaypoints->removeElement($mapPoint);
  223.         }
  224.     }
  225.     public function removeTripAttribute(TripAttribute $tripAttribute): void
  226.     {
  227.         if ($this->attributes->contains($tripAttribute)) {
  228.             $this->attributes->removeElement($tripAttribute);
  229.         }
  230.     }
  231.     public function getName(?string $locale null): ?string
  232.     {
  233.         return $this->getTranslationType($locale)->getName();
  234.     }
  235.     public function getTranslationType(?string $locale null): TripTranslation
  236.     {
  237.         return $this->getTranslation($locale);
  238.     }
  239.     public function setName(?string $name): void
  240.     {
  241.         $this->getTranslationType()->setName($name);
  242.     }
  243.     public function createTranslation(): TranslationInterface
  244.     {
  245.         return new TripTranslation();
  246.     }
  247.     public function getClonedCount(): int
  248.     {
  249.         return $this->clonedTrips->filter(fn($trip) => $trip->deletedAt === null)->count();
  250.     }
  251.     public function getClonedTrips(): Collection
  252.     {
  253.         return $this->clonedTrips;
  254.     }
  255.     public function setClonedTrips(Collection $clonedTrips): void
  256.     {
  257.         $this->clonedTrips $clonedTrips;
  258.     }
  259.     public function addClonedTrip(Trip $trip): void
  260.     {
  261.         if ($this->clonedTrips->contains($trip)) {
  262.             return;
  263.         }
  264.         $this->clonedTrips->add($trip);
  265.     }
  266.     public function removeClonedTrip(Trip $trip): void
  267.     {
  268.         if (!$this->clonedTrips->contains($trip)) {
  269.             return;
  270.         }
  271.         $this->clonedTrips->removeElement($trip);
  272.     }
  273.     /**
  274.      * @return Collection
  275.      */
  276.     public function getCountries(): Collection
  277.     {
  278.         return $this->countries;
  279.     }
  280.     /**
  281.      * @param Collection $countries
  282.      */
  283.     public function setCountries(Collection $countries): void
  284.     {
  285.         $this->countries $countries;
  286.     }
  287.     /**
  288.      * @param TripCountry $country
  289.      */
  290.     public function addCountry(TripCountry $country): void
  291.     {
  292.         if ($this->countries->contains($country)) {
  293.             return;
  294.         }
  295.         $this->countries->add($country);
  296.     }
  297.     /**
  298.      * @param TripCountry $country
  299.      */
  300.     public function removeCountry(TripCountry $country): void
  301.     {
  302.         if (!$this->countries->contains($country)) {
  303.             return;
  304.         }
  305.         $this->countries->removeElement($country);
  306.     }
  307.     /**
  308.      * @return Collection
  309.      */
  310.     public function getCategories(): Collection
  311.     {
  312.         return $this->categories;
  313.     }
  314.     /**
  315.      * @param Collection $categories
  316.      */
  317.     public function setCategories(Collection $categories): void
  318.     {
  319.         $this->categories $categories;
  320.     }
  321.     /**
  322.      * @param TripCategory $category
  323.      */
  324.     public function addCategory(TripCategory $category): void
  325.     {
  326.         if ($this->categories->contains($category)) {
  327.             return;
  328.         }
  329.         $this->categories->add($category);
  330.     }
  331.     /**
  332.      * @param TripCategory $category
  333.      */
  334.     public function removeCategory(TripCategory $category): void
  335.     {
  336.         if (!$this->categories->contains($category)) {
  337.             return;
  338.         }
  339.         $this->categories->removeElement($category);
  340.     }
  341.     /**
  342.      * @return Collection
  343.      */
  344.     public function getComments(): Collection
  345.     {
  346.         return $this->comments->filter(static fn(TripComment $c) => !$c->isDeleted());
  347.     }
  348.     /**
  349.      * @param Collection $comments
  350.      */
  351.     public function setComments(Collection $comments): void
  352.     {
  353.         $this->comments $comments;
  354.     }
  355.     /**
  356.      * @param TripComment $comment
  357.      */
  358.     public function addComment(TripComment $comment): void
  359.     {
  360.         if ($this->comments->contains($comment)) {
  361.             return;
  362.         }
  363.         $this->comments->add($comment);
  364.     }
  365.     /**
  366.      * @param TripComment $comment
  367.      */
  368.     public function removeComment(TripComment $comment): void
  369.     {
  370.         if (!$this->comments->contains($comment)) {
  371.             return;
  372.         }
  373.         $this->comments->removeElement($comment);
  374.     }
  375.     public function getAuthorName(): ?string
  376.     {
  377.         if ($this->authorName) {
  378.             return $this->authorName;
  379.         }
  380.         return $this->author?->getFullname();
  381.     }
  382.     public function getDurationString(): string
  383.     {
  384.         if ($this->totalDuration <= 0) {
  385.             return '0h 0min';
  386.         }
  387.         $timeInMinutes floor($this->totalDuration 60);
  388.         $hours floor($timeInMinutes 60);
  389.         $minutes $timeInMinutes 60;
  390.         return "{$hours}{$minutes}min";
  391.     }
  392.     public function isElasticSearchPublishable(): bool
  393.     {
  394.         return $this->deletedAt === null;
  395.     }
  396. }