From 0a92ad905b363847e0d5e8a5da10646293a98dc4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Wed, 26 Jan 2022 23:49:24 +0100 Subject: [PATCH] variables for docgen --- .../ChillActivityBundle/Entity/Activity.php | 36 +++++++- .../Entity/ActivityPresence.php | 4 + .../Entity/ActivityType.php | 5 +- .../ChillMainBundle/Entity/Location.php | 2 +- .../CommentEmbeddableDocGenNormalizer.php | 88 +++++++++++++++++++ .../Entity/Person/PersonResource.php | 4 +- .../AccompanyingPeriodDocGenNormalizer.php | 3 + .../Normalizer/SocialActionNormalizer.php | 3 + ...AccompanyingPeriodDocGenNormalizerTest.php | 2 + 9 files changed, 140 insertions(+), 7 deletions(-) create mode 100644 src/Bundle/ChillMainBundle/Serializer/Normalizer/CommentEmbeddableDocGenNormalizer.php diff --git a/src/Bundle/ChillActivityBundle/Entity/Activity.php b/src/Bundle/ChillActivityBundle/Entity/Activity.php index 75c2aeaf6..2bb40d432 100644 --- a/src/Bundle/ChillActivityBundle/Entity/Activity.php +++ b/src/Bundle/ChillActivityBundle/Entity/Activity.php @@ -61,7 +61,7 @@ class Activity implements AccompanyingPeriodLinkedWithSocialIssuesEntityInterfac /** * @ORM\ManyToOne(targetEntity="Chill\PersonBundle\Entity\AccompanyingPeriod") - * @Groups({"read", "docgen:read"}) + * @Groups({"read"}) */ private ?AccompanyingPeriod $accompanyingPeriod = null; @@ -75,16 +75,19 @@ class Activity implements AccompanyingPeriodLinkedWithSocialIssuesEntityInterfac /** * @ORM\ManyToOne(targetEntity="Chill\ActivityBundle\Entity\ActivityPresence") + * @Groups({"docgen:read"}) */ private ?ActivityPresence $attendee = null; /** * @ORM\Embedded(class="Chill\MainBundle\Entity\Embeddable\CommentEmbeddable", columnPrefix="comment_") + * @Groups({"docgen:read"}) */ private CommentEmbeddable $comment; /** * @ORM\Column(type="datetime") + * @Groups({"docgen:read"}) */ private DateTime $date; @@ -100,6 +103,7 @@ class Activity implements AccompanyingPeriodLinkedWithSocialIssuesEntityInterfac /** * @ORM\Column(type="boolean", options={"default": false}) + * @Groups({"docgen:read"}) */ private bool $emergency = false; @@ -130,16 +134,19 @@ class Activity implements AccompanyingPeriodLinkedWithSocialIssuesEntityInterfac /** * @ORM\ManyToMany(targetEntity="Chill\ActivityBundle\Entity\ActivityReason") + * @Groups({"docgen:read"}) */ private Collection $reasons; /** * @ORM\ManyToOne(targetEntity="Chill\MainBundle\Entity\Scope") + * @Groups({"docgen:read"}) */ private ?Scope $scope = null; /** * @ORM\Column(type="string", options={"default": ""}) + * @Groups({"docgen:read"}) */ private string $sentReceived = ''; @@ -170,12 +177,13 @@ class Activity implements AccompanyingPeriodLinkedWithSocialIssuesEntityInterfac /** * @ORM\ManyToOne(targetEntity="Chill\MainBundle\Entity\User") + * @Groups({"docgen:read"}) */ private User $user; /** * @ORM\ManyToMany(targetEntity="Chill\MainBundle\Entity\User") - * @Groups({"read"}) + * @Groups({"read", "docgen:read"}) */ private ?Collection $users = null; @@ -302,6 +310,18 @@ class Activity implements AccompanyingPeriodLinkedWithSocialIssuesEntityInterfac return $this->documents; } + /** + * @Groups({"docgen:read"}) + */ + public function getDurationMinute(): int + { + if (null === $this->durationTime) { + return 0; + } + + return (int) round(($this->durationTime->getTimestamp() + $this->durationTime->getOffset()) / 60.0, 0); + } + public function getDurationTime(): ?DateTime { return $this->durationTime; @@ -402,6 +422,18 @@ class Activity implements AccompanyingPeriodLinkedWithSocialIssuesEntityInterfac return $this->travelTime; } + /** + * @Groups({"docgen:read"}) + */ + public function getTravelTimeMinute(): int + { + if (null === $this->travelTime) { + return 0; + } + + return (int) round(($this->travelTime->getTimestamp() + $this->travelTime->getOffset()) / 60.0, 0); + } + /** * @deprecated */ diff --git a/src/Bundle/ChillActivityBundle/Entity/ActivityPresence.php b/src/Bundle/ChillActivityBundle/Entity/ActivityPresence.php index 725b1eb8e..89f616dc2 100644 --- a/src/Bundle/ChillActivityBundle/Entity/ActivityPresence.php +++ b/src/Bundle/ChillActivityBundle/Entity/ActivityPresence.php @@ -12,6 +12,7 @@ declare(strict_types=1); namespace Chill\ActivityBundle\Entity; use Doctrine\ORM\Mapping as ORM; +use Symfony\Component\Serializer\Annotation as Serializer; /** * Class ActivityPresence. @@ -31,11 +32,14 @@ class ActivityPresence * @ORM\Id * @ORM\Column(name="id", type="integer") * @ORM\GeneratedValue(strategy="AUTO") + * @Serializer\Groups({"docgen:read"}) */ private ?int $id; /** * @ORM\Column(type="json") + * @Serializer\Groups({"docgen:read"}) + * @Serializer\Context({"is-translatable": true}, groups={"docgen:read"}) */ private array $name = []; diff --git a/src/Bundle/ChillActivityBundle/Entity/ActivityType.php b/src/Bundle/ChillActivityBundle/Entity/ActivityType.php index 5ad692bf4..c7448e07d 100644 --- a/src/Bundle/ChillActivityBundle/Entity/ActivityType.php +++ b/src/Bundle/ChillActivityBundle/Entity/ActivityType.php @@ -13,6 +13,7 @@ namespace Chill\ActivityBundle\Entity; use Doctrine\ORM\Mapping as ORM; use InvalidArgumentException; +use Symfony\Component\Serializer\Annotation as Serializer; use Symfony\Component\Serializer\Annotation\Groups; use Symfony\Component\Validator\Constraints as Assert; @@ -118,6 +119,7 @@ class ActivityType * @ORM\Id * @ORM\Column(name="id", type="integer") * @ORM\GeneratedValue(strategy="AUTO") + * @Groups({"docgen:read"}) */ private ?int $id; @@ -133,7 +135,8 @@ class ActivityType /** * @ORM\Column(type="json") - * @Groups({"read"}) + * @Groups({"read", "docgen:read"}) + * @Serializer\Context({"is-translatable": true}, groups={"docgen:read"}) */ private array $name = []; diff --git a/src/Bundle/ChillMainBundle/Entity/Location.php b/src/Bundle/ChillMainBundle/Entity/Location.php index 8496374d8..bff3ff37b 100644 --- a/src/Bundle/ChillMainBundle/Entity/Location.php +++ b/src/Bundle/ChillMainBundle/Entity/Location.php @@ -64,7 +64,7 @@ class Location implements TrackCreationInterface, TrackUpdateInterface /** * @ORM\Column(type="string", length=255, nullable=true) - * @Serializer\Groups({"read", "write"}) + * @Serializer\Groups({"read", "write", "docgen:read"}) */ private ?string $email = null; diff --git a/src/Bundle/ChillMainBundle/Serializer/Normalizer/CommentEmbeddableDocGenNormalizer.php b/src/Bundle/ChillMainBundle/Serializer/Normalizer/CommentEmbeddableDocGenNormalizer.php new file mode 100644 index 000000000..e5a37c430 --- /dev/null +++ b/src/Bundle/ChillMainBundle/Serializer/Normalizer/CommentEmbeddableDocGenNormalizer.php @@ -0,0 +1,88 @@ +userRepository = $userRepository; + } + + /** + * @param CommentEmbeddable $object + * + * @throws ExceptionInterface + */ + public function normalize($object, ?string $format = null, array $context = []): array + { + if (null === $object) { + return [ + 'comment' => '', + 'isNull' => true, + 'date' => $this->normalizer->normalize(null, $format, array_merge($context, [ + 'docgen:expects' => DateTime::class, + ])), + 'user' => $this->normalizer->normalize(null, $format, array_merge($context, [ + 'docgen:expects' => User::class, + ])), + ]; + } + + $user = $this->userRepository->find($object->getUserId()); + + return [ + 'comment' => (string) $object->getComment(), + 'isNull' => false, + 'date' => $this->normalizer->normalize($object->getDate(), $format, array_merge($context, [ + 'docgen:expects' => DateTime::class, + ])), + 'user' => $this->normalizer->normalize($user, $format, array_merge($context, [ + 'docgen:expects' => User::class, + ])), + ]; + } + + public function supportsNormalization($data, ?string $format = null, array $context = []): bool + { + if ('docgen' !== $format) { + return false; + } + + if ($data instanceof CommentEmbeddable) { + return true; + } + + if ( + null === $data + && array_key_exists('docgen:expects', $context) + && CommentEmbeddable::class === $context['docgen:expects']) { + return true; + } + + return false; + } +} diff --git a/src/Bundle/ChillPersonBundle/Entity/Person/PersonResource.php b/src/Bundle/ChillPersonBundle/Entity/Person/PersonResource.php index bc792ef95..cdd928598 100644 --- a/src/Bundle/ChillPersonBundle/Entity/Person/PersonResource.php +++ b/src/Bundle/ChillPersonBundle/Entity/Person/PersonResource.php @@ -16,11 +16,8 @@ use Chill\MainBundle\Doctrine\Model\TrackCreationTrait; use Chill\MainBundle\Doctrine\Model\TrackUpdateInterface; use Chill\MainBundle\Doctrine\Model\TrackUpdateTrait; use Chill\MainBundle\Entity\Embeddable\CommentEmbeddable; -use Chill\MainBundle\Entity\User; use Chill\PersonBundle\Entity\Person; use Chill\ThirdPartyBundle\Entity\ThirdParty; -use DateTime; -use DateTimeInterface; use Doctrine\ORM\Mapping as ORM; use Symfony\Component\Serializer\Annotation\DiscriminatorMap; use Symfony\Component\Serializer\Annotation\Groups; @@ -38,6 +35,7 @@ class PersonResource implements TrackCreationInterface, TrackUpdateInterface { use TrackCreationTrait; use TrackUpdateTrait; + /** * @ORM\Embedded(class="Chill\MainBundle\Entity\Embeddable\CommentEmbeddable", columnPrefix="comment_") * @Groups({"read"}) diff --git a/src/Bundle/ChillPersonBundle/Serializer/Normalizer/AccompanyingPeriodDocGenNormalizer.php b/src/Bundle/ChillPersonBundle/Serializer/Normalizer/AccompanyingPeriodDocGenNormalizer.php index ceaba6ed8..fab2a022d 100644 --- a/src/Bundle/ChillPersonBundle/Serializer/Normalizer/AccompanyingPeriodDocGenNormalizer.php +++ b/src/Bundle/ChillPersonBundle/Serializer/Normalizer/AccompanyingPeriodDocGenNormalizer.php @@ -114,6 +114,7 @@ class AccompanyingPeriodDocGenNormalizer implements ContextAwareNormalizerInterf $userContext = array_merge($context, ['docgen:expects' => User::class, 'groups' => 'docgen:read']); $participationContext = array_merge($context, ['docgen:expects' => AccompanyingPeriodParticipation::class, 'groups' => 'docgen:read']); $administrativeLocationContext = array_merge($context, ['docgen:expects' => Location::class, 'groups' => 'docgen:read']); + $workContext = array_merge($context, ['docgen:expects' => AccompanyingPeriod\AccompanyingPeriodWork::class, 'groups' => 'docgen:read']); return [ 'id' => $period->getId(), @@ -160,6 +161,7 @@ class AccompanyingPeriodDocGenNormalizer implements ContextAwareNormalizerInterf 'locationPerson' => $this->normalizer->normalize($period->getPersonLocation(), $format, array_merge($context, ['docgen:expects' => Person::class])), 'location' => $this->normalizer->normalize($period->getLocation(), $format, $addressContext), 'administrativeLocation' => $this->normalizer->normalize($period->getAdministrativeLocation(), $format, $administrativeLocationContext), + 'works' => $this->normalizer->normalize($period->getWorks(), $format, $workContext), ]; } @@ -178,6 +180,7 @@ class AccompanyingPeriodDocGenNormalizer implements ContextAwareNormalizerInterf 'hasLocation' => false, 'hasLocationPerson' => false, 'hasAdministrativeLocation' => false, + 'works' => [], ] ); } diff --git a/src/Bundle/ChillPersonBundle/Serializer/Normalizer/SocialActionNormalizer.php b/src/Bundle/ChillPersonBundle/Serializer/Normalizer/SocialActionNormalizer.php index e971c793a..e210e1c4f 100644 --- a/src/Bundle/ChillPersonBundle/Serializer/Normalizer/SocialActionNormalizer.php +++ b/src/Bundle/ChillPersonBundle/Serializer/Normalizer/SocialActionNormalizer.php @@ -49,8 +49,11 @@ class SocialActionNormalizer implements NormalizerAwareInterface, NormalizerInte return [ 'id' => $socialAction->getId(), + 'type' => 'social_work_social_action', 'text' => $this->render->renderString($socialAction, []), 'title' => $socialAction->getTitle(), + 'parent' => $this->normalizer->normalize($socialAction->getParent(), $format, $context), + 'issue' => $this->normalizer->normalize($socialAction->getIssue(), $format, $context), ]; default: diff --git a/src/Bundle/ChillPersonBundle/Tests/Serializer/Normalizer/AccompanyingPeriodDocGenNormalizerTest.php b/src/Bundle/ChillPersonBundle/Tests/Serializer/Normalizer/AccompanyingPeriodDocGenNormalizerTest.php index c99e2ddc4..58ca55262 100644 --- a/src/Bundle/ChillPersonBundle/Tests/Serializer/Normalizer/AccompanyingPeriodDocGenNormalizerTest.php +++ b/src/Bundle/ChillPersonBundle/Tests/Serializer/Normalizer/AccompanyingPeriodDocGenNormalizerTest.php @@ -100,6 +100,7 @@ final class AccompanyingPeriodDocGenNormalizerTest extends KernelTestCase 'hasLocationPerson' => false, 'location' => '@ignored', 'locationPerson' => '@ignored', + 'works' => [], ]; $this->assertIsArray($data); @@ -160,6 +161,7 @@ final class AccompanyingPeriodDocGenNormalizerTest extends KernelTestCase 'hasLocationPerson' => false, 'location' => '@ignored', 'locationPerson' => '@ignored', + 'works' => [], ]; $this->assertIsArray($data);