mirror of
https://gitlab.com/Chill-Projet/chill-bundles.git
synced 2025-06-07 18:44:08 +00:00
serializer on accompanying course
Two new routes: * `GET /{_locale}/person/api/1.0/accompanying-course/{parcours_id}/show.json`: get a json representation for a course * `POST /{_locale}/person/api/1.0/accompanying-course/{parcours_id}/participation.json`: add a particitipation to course. Usage: `curl -v --cookie "PHPSESSID=fed98aa23e40cb36e630f84155aea3bb;" -X POST --data '{ "id": 481 }' http://localhost:8001/fr/person/api/1.0/accompanying-course/270/participation.json` Will add the person with id "481" to the course.
This commit is contained in:
parent
3445335b2d
commit
66426f5102
@ -131,6 +131,7 @@ class ChillMainExtension extends Extension implements PrependExtensionInterface,
|
|||||||
$loader->load('services/templating.yaml');
|
$loader->load('services/templating.yaml');
|
||||||
$loader->load('services/timeline.yaml');
|
$loader->load('services/timeline.yaml');
|
||||||
$loader->load('services/search.yaml');
|
$loader->load('services/search.yaml');
|
||||||
|
$loader->load('services/serializer.yaml');
|
||||||
|
|
||||||
$this->configureCruds($container, $config['cruds'], $loader);
|
$this->configureCruds($container, $config['cruds'], $loader);
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,44 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* Copyright (C) 2014-2021, Champs Libres Cooperative SCRLFS, <http://www.champs-libres.coop>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Chill\MainBundle\Serializer\Normalizer;
|
||||||
|
|
||||||
|
use Chill\MainBundle\Entity\Center;
|
||||||
|
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
class CenterNormalizer implements NormalizerInterface
|
||||||
|
{
|
||||||
|
public function normalize($center, string $format = null, array $context = array())
|
||||||
|
{
|
||||||
|
/** @var Center $center */
|
||||||
|
return [
|
||||||
|
'id' => $center->getId(),
|
||||||
|
'name' => $center->getName()
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function supportsNormalization($data, string $format = null): bool
|
||||||
|
{
|
||||||
|
return $data instanceof Center;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,39 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* Copyright (C) 2014-2021, Champs Libres Cooperative SCRLFS, <http://www.champs-libres.coop>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Chill\MainBundle\Serializer\Normalizer;
|
||||||
|
|
||||||
|
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
|
||||||
|
|
||||||
|
class DateNormalizer implements NormalizerInterface
|
||||||
|
{
|
||||||
|
public function normalize($date, string $format = null, array $context = array())
|
||||||
|
{
|
||||||
|
/** @var \DateTimeInterface $date */
|
||||||
|
return [
|
||||||
|
'datetime' => $date->format(\DateTimeInterface::ISO8601),
|
||||||
|
'u' => $date->getTimestamp()
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function supportsNormalization($data, string $format = null): bool
|
||||||
|
{
|
||||||
|
return $data instanceof \DateTimeInterface;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,44 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* Copyright (C) 2014-2021, Champs Libres Cooperative SCRLFS, <http://www.champs-libres.coop>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Chill\MainBundle\Serializer\Normalizer;
|
||||||
|
|
||||||
|
use Chill\MainBundle\Entity\User;
|
||||||
|
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
class UserNormalizer implements NormalizerInterface
|
||||||
|
{
|
||||||
|
public function normalize($user, string $format = null, array $context = array())
|
||||||
|
{
|
||||||
|
/** @var User $user */
|
||||||
|
return [
|
||||||
|
'id' => $user->getId(),
|
||||||
|
'username' => $user->getUsername()
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function supportsNormalization($data, string $format = null): bool
|
||||||
|
{
|
||||||
|
return $data instanceof User;
|
||||||
|
}
|
||||||
|
}
|
13
src/Bundle/ChillMainBundle/config/services/serializer.yaml
Normal file
13
src/Bundle/ChillMainBundle/config/services/serializer.yaml
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
---
|
||||||
|
services:
|
||||||
|
Chill\MainBundle\Serializer\Normalizer\CenterNormalizer:
|
||||||
|
tags:
|
||||||
|
- { name: 'serializer.normalizer', priority: 64 }
|
||||||
|
|
||||||
|
Chill\MainBundle\Serializer\Normalizer\DateNormalizer:
|
||||||
|
tags:
|
||||||
|
- { name: 'serializer.normalizer', priority: 64 }
|
||||||
|
|
||||||
|
Chill\MainBundle\Serializer\Normalizer\UserNormalizer:
|
||||||
|
tags:
|
||||||
|
- { name: 'serializer.normalizer', priority: 64 }
|
@ -4,17 +4,21 @@ namespace Chill\PersonBundle\Controller;
|
|||||||
|
|
||||||
use Chill\PersonBundle\Entity\AccompanyingPeriod;
|
use Chill\PersonBundle\Entity\AccompanyingPeriod;
|
||||||
use Chill\PersonBundle\Entity\AccompanyingPeriodParticipation;
|
use Chill\PersonBundle\Entity\AccompanyingPeriodParticipation;
|
||||||
|
use Chill\PersonBundle\Privacy\AccompanyingPeriodPrivacyEvent;
|
||||||
use Chill\PersonBundle\Entity\Person;
|
use Chill\PersonBundle\Entity\Person;
|
||||||
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
|
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
|
||||||
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
|
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
|
||||||
use Symfony\Component\HttpFoundation\JsonResponse;
|
use Symfony\Component\HttpFoundation\JsonResponse;
|
||||||
use Symfony\Component\HttpFoundation\Response;
|
use Symfony\Component\HttpFoundation\Response;
|
||||||
|
use Symfony\Component\HttpFoundation\Exception\BadRequestException;
|
||||||
use Symfony\Component\Routing\Annotation\Route;
|
use Symfony\Component\Routing\Annotation\Route;
|
||||||
use Symfony\Component\Serializer\Encoder\JsonEncoder;
|
use Symfony\Component\Serializer\Encoder\JsonEncoder;
|
||||||
use Symfony\Component\Serializer\Normalizer\AbstractObjectNormalizer;
|
use Symfony\Component\Serializer\Normalizer\AbstractObjectNormalizer;
|
||||||
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
|
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
|
||||||
use Symfony\Component\Serializer\Serializer;
|
|
||||||
use Symfony\Component\Serializer\SerializerInterface;
|
use Symfony\Component\Serializer\SerializerInterface;
|
||||||
|
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
|
||||||
|
use Symfony\Component\HttpFoundation\Request;
|
||||||
|
use Symfony\Component\Validator\Validator\ValidatorInterface;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class AccompanyingCourseController
|
* Class AccompanyingCourseController
|
||||||
@ -23,6 +27,21 @@ use Symfony\Component\Serializer\SerializerInterface;
|
|||||||
*/
|
*/
|
||||||
class AccompanyingCourseController extends Controller
|
class AccompanyingCourseController extends Controller
|
||||||
{
|
{
|
||||||
|
protected SerializerInterface $serializer;
|
||||||
|
|
||||||
|
protected EventDispatcherInterface $dispatcher;
|
||||||
|
|
||||||
|
protected ValidatorInterface $validator;
|
||||||
|
|
||||||
|
public function __construct(
|
||||||
|
SerializerInterface $serializer,
|
||||||
|
EventDispatcherInterface $dispatcher,
|
||||||
|
ValidatorInterface $validator
|
||||||
|
) {
|
||||||
|
$this->serializer = $serializer;
|
||||||
|
$this->dispatcher = $dispatcher;
|
||||||
|
$this->validator = $validator;
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* Homepage of Accompanying Course section
|
* Homepage of Accompanying Course section
|
||||||
*
|
*
|
||||||
@ -68,45 +87,75 @@ class AccompanyingCourseController extends Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sérialise temporairement quelques données pour donner à manger au composant vuejs
|
* Get API Data for showing endpoint
|
||||||
|
*
|
||||||
* @Route(
|
* @Route(
|
||||||
* "/{_locale}/api/parcours/{accompanying_period_id}/show",
|
* "/{_locale}/person/api/1.0/accompanying-course/{accompanying_period_id}/show.{_format}",
|
||||||
* name="chill_person_accompanying_course_api_show")
|
* name="chill_person_accompanying_course_api_show"
|
||||||
|
* )
|
||||||
* @ParamConverter("accompanyingCourse", options={"id": "accompanying_period_id"})
|
* @ParamConverter("accompanyingCourse", options={"id": "accompanying_period_id"})
|
||||||
* @param SerializerInterface $serializer
|
|
||||||
*/
|
*/
|
||||||
public function showAPI(AccompanyingPeriod $accompanyingCourse): Response
|
public function showAPI(AccompanyingPeriod $accompanyingCourse, $_format): Response
|
||||||
{
|
{
|
||||||
$persons = [];
|
// TODO check ACL on AccompanyingPeriod
|
||||||
foreach ($accompanyingCourse->getParticipations() as $k => $participation ) {
|
|
||||||
/**
|
$this->dispatcher->dispatch(
|
||||||
* @var AccompanyingPeriodParticipation $participation
|
AccompanyingPeriodPrivacyEvent::ACCOMPANYING_PERIOD_PRIVACY_EVENT,
|
||||||
* @var Person $person
|
new AccompanyingPeriodPrivacyEvent($accompanyingCourse, [
|
||||||
*/
|
'action' => 'showApi'
|
||||||
$person = $participation->getPerson();
|
])
|
||||||
$persons[$k] = [
|
);
|
||||||
'id' => $person->getId(),
|
|
||||||
'firstname' => $person->getFirstName(),
|
switch ($_format) {
|
||||||
'lastname' => $person->getLastName(),
|
case 'json':
|
||||||
'email' => $person->getEmail(),
|
return $this->json($accompanyingCourse);
|
||||||
'phone' => $person->getPhonenumber(),
|
default:
|
||||||
'startdate' => ($participation->getStartDate()) ? $participation->getStartDate()->format('Y-m-d') : null,
|
throw new BadRequestException('Unsupported format');
|
||||||
'enddate' => ($participation->getEndDate()) ? $participation->getEndDate()->format('Y-m-d') : null
|
}
|
||||||
];
|
|
||||||
}
|
|
||||||
$data = [
|
|
||||||
'id' => $accompanyingCourse->getId(),
|
|
||||||
'remark' => $accompanyingCourse->getRemark(),
|
|
||||||
'closing_motive' => $accompanyingCourse->getClosingMotive() ? $accompanyingCourse->getClosingMotive()->getName()['fr'] : null,
|
|
||||||
'opening_date' => ($accompanyingCourse->getOpeningDate()) ? $accompanyingCourse->getOpeningDate()->format('Y-m-d') : null,
|
|
||||||
'closing_date' => ($accompanyingCourse->getClosingDate()) ? $accompanyingCourse->getClosingDate()->format('Y-m-d') : null,
|
|
||||||
'persons' => $persons
|
|
||||||
];
|
|
||||||
|
|
||||||
$serialized = \json_encode($data);
|
|
||||||
$response = new Response($serialized);
|
|
||||||
$response->headers->set('Content-Type', 'application/json');
|
|
||||||
return $response;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get API Data for showing endpoint
|
||||||
|
*
|
||||||
|
* @Route(
|
||||||
|
* "/{_locale}/person/api/1.0/accompanying-course/{accompanying_period_id}/participation.{_format}",
|
||||||
|
* name="chill_person_accompanying_course_api_add_participation",
|
||||||
|
* methods={"POST"},
|
||||||
|
* format="json",
|
||||||
|
* requirements={
|
||||||
|
* "_format": "json",
|
||||||
|
* }
|
||||||
|
* )
|
||||||
|
* @ParamConverter("accompanyingCourse", options={"id": "accompanying_period_id"})
|
||||||
|
*/
|
||||||
|
public function addParticipationAPI(Request $request, AccompanyingPeriod $accompanyingCourse, $_format): Response
|
||||||
|
{
|
||||||
|
switch ($_format) {
|
||||||
|
case 'json':
|
||||||
|
$person = $this->serializer->deserialize($request->getContent(), Person::class, $_format, [
|
||||||
|
|
||||||
|
]);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new BadRequestException('Unsupported format');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (NULL === $person) {
|
||||||
|
throw new BadRequestException('person id not found');
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO add acl
|
||||||
|
$accompanyingCourse->addPerson($person);
|
||||||
|
$errors = $this->validator->validate($accompanyingCourse);
|
||||||
|
|
||||||
|
if ($errors->count() > 0) {
|
||||||
|
// only format accepted
|
||||||
|
return $this->json($errors);
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->getDoctrine()->getManager()->flush();
|
||||||
|
|
||||||
|
return new JsonResponse();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,30 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2015-2021 Champs-Libres Coopérative <info@champs-libres.coop>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
namespace Chill\PersonBundle\Controller;
|
||||||
|
|
||||||
|
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
|
||||||
|
use Symfony\Component\HttpFoundation\JsonResponse;
|
||||||
|
|
||||||
|
|
||||||
|
class ApiPersonController extends Controller
|
||||||
|
{
|
||||||
|
public function viewAction($id, $_format)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -75,6 +75,7 @@ class ChillPersonExtension extends Extension implements PrependExtensionInterfac
|
|||||||
$loader->load('services/repository.yaml');
|
$loader->load('services/repository.yaml');
|
||||||
$loader->load('services/templating.yaml');
|
$loader->load('services/templating.yaml');
|
||||||
$loader->load('services/alt_names.yaml');
|
$loader->load('services/alt_names.yaml');
|
||||||
|
$loader->load('services/serializer.yaml');
|
||||||
|
|
||||||
// load service advanced search only if configure
|
// load service advanced search only if configure
|
||||||
if ($config['search']['search_by_phone'] != 'never') {
|
if ($config['search']['search_by_phone'] != 'never') {
|
||||||
|
@ -629,4 +629,16 @@ class AccompanyingPeriod
|
|||||||
{
|
{
|
||||||
$this->resources->removeElement($resource);
|
$this->resources->removeElement($resource);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a list of all persons which are participating to this course
|
||||||
|
*/
|
||||||
|
public function getPersons(): Collection
|
||||||
|
{
|
||||||
|
return $this->participations->map(
|
||||||
|
function(AccompanyingPeriodParticipation $participation) {
|
||||||
|
return $participation->getPerson();
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,52 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Chill\PersonBundle\Privacy;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Chill is a software for social workers
|
||||||
|
*
|
||||||
|
* Copyright (C) 2014-2015, Champs Libres Cooperative SCRLFS,
|
||||||
|
* <http://www.champs-libres.coop>, <info@champs-libres.coop>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
use Symfony\Component\EventDispatcher\Event;
|
||||||
|
use Chill\PersonBundle\Entity\Person;
|
||||||
|
use Chill\PersonBundle\Entity\AccompanyingPeriod;
|
||||||
|
|
||||||
|
class AccompanyingPeriodPrivacyEvent extends Event
|
||||||
|
{
|
||||||
|
public const ACCOMPANYING_PERIOD_PRIVACY_EVENT = 'chill_person.accompanying_period_privacy_event';
|
||||||
|
|
||||||
|
protected AccompanyingPeriod $period;
|
||||||
|
|
||||||
|
protected array $args;
|
||||||
|
|
||||||
|
public function __construct($period, $args = [])
|
||||||
|
{
|
||||||
|
$this->period = $period;
|
||||||
|
$this->args = $args;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getPeriod(): AccompanyingPeriod
|
||||||
|
{
|
||||||
|
return $this->period;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getArgs(): array
|
||||||
|
{
|
||||||
|
return $this->args;
|
||||||
|
}
|
||||||
|
}
|
@ -26,6 +26,7 @@ use Psr\Log\LoggerInterface;
|
|||||||
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
|
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
|
||||||
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
|
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
|
||||||
use Chill\PersonBundle\Entity\Person;
|
use Chill\PersonBundle\Entity\Person;
|
||||||
|
use Chill\PersonBundle\Privacy\AccompanyingPeriodPrivacyEvent;
|
||||||
|
|
||||||
class PrivacyEventSubscriber implements EventSubscriberInterface
|
class PrivacyEventSubscriber implements EventSubscriberInterface
|
||||||
{
|
{
|
||||||
@ -53,14 +54,33 @@ class PrivacyEventSubscriber implements EventSubscriberInterface
|
|||||||
|
|
||||||
public static function getSubscribedEvents()
|
public static function getSubscribedEvents()
|
||||||
{
|
{
|
||||||
return array(PrivacyEvent::PERSON_PRIVACY_EVENT => array(
|
return [
|
||||||
array('onPrivacyEvent')
|
PrivacyEvent::PERSON_PRIVACY_EVENT => [
|
||||||
));
|
['onPrivacyEvent']
|
||||||
|
],
|
||||||
|
AccompanyingPeriodPrivacyEvent::ACCOMPANYING_PERIOD_PRIVACY_EVENT => [
|
||||||
|
['onAccompanyingPeriodPrivacyEvent']
|
||||||
|
]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function onAccompanyingPeriodPrivacyEvent(AccompanyingPeriodPrivacyEvent $event)
|
||||||
|
{
|
||||||
|
$involved = $this->getInvolved();
|
||||||
|
$involved['period_id'] = $event->getPeriod()->getId();
|
||||||
|
$involved['persons'] = $event->getPeriod()->getPersons()
|
||||||
|
->map(function(Person $p) { return $p->getId(); })
|
||||||
|
->toArray();
|
||||||
|
|
||||||
|
$this->logger->notice(
|
||||||
|
"[Privacy Event] An accompanying period has been viewed",
|
||||||
|
array_merge($involved, $event->getArgs())
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function onPrivacyEvent(PrivacyEvent $event)
|
public function onPrivacyEvent(PrivacyEvent $event)
|
||||||
{
|
{
|
||||||
$persons = array();
|
$persons = [];
|
||||||
|
|
||||||
if ($event->hasPersons() === true) {
|
if ($event->hasPersons() === true) {
|
||||||
foreach ($event->getPersons() as $person) {
|
foreach ($event->getPersons() as $person) {
|
||||||
@ -68,11 +88,8 @@ class PrivacyEventSubscriber implements EventSubscriberInterface
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$involved = array(
|
$involved = $this->getInvolved();
|
||||||
'by_user' => $this->token->getToken()->getUser()->getUsername(),
|
$involved['person_id'] = $event->getPerson()->getId();
|
||||||
'by_user_id' => $this->token->getToken()->getUser()->getId(),
|
|
||||||
'person_id' => $event->getPerson()->getId(),
|
|
||||||
);
|
|
||||||
|
|
||||||
if ($event->hasPersons()) {
|
if ($event->hasPersons()) {
|
||||||
$involved['persons'] = \array_map(
|
$involved['persons'] = \array_map(
|
||||||
@ -86,4 +103,12 @@ class PrivacyEventSubscriber implements EventSubscriberInterface
|
|||||||
array_merge($involved, $event->getArgs())
|
array_merge($involved, $event->getArgs())
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected function getInvolved(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'by_user' => $this->token->getToken()->getUser()->getUsername(),
|
||||||
|
'by_user_id' => $this->token->getToken()->getUser()->getId(),
|
||||||
|
];
|
||||||
|
}
|
||||||
}
|
}
|
@ -0,0 +1,59 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* Copyright (C) 2014-2021, Champs Libres Cooperative SCRLFS, <http://www.champs-libres.coop>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
namespace Chill\PersonBundle\Serializer\Normalizer;
|
||||||
|
|
||||||
|
use Chill\PersonBundle\Entity\AccompanyingPeriod;
|
||||||
|
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
|
||||||
|
use Symfony\Component\Serializer\Normalizer\NormalizerAwareInterface;
|
||||||
|
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
|
||||||
|
|
||||||
|
|
||||||
|
class AccompanyingPeriodNormalizer implements NormalizerInterface, NormalizerAwareInterface {
|
||||||
|
|
||||||
|
protected ?NormalizerInterface $normalizer = null;
|
||||||
|
|
||||||
|
public function normalize($period, string $format = null, array $context = array())
|
||||||
|
{
|
||||||
|
/** @var AccompanyingPeriod $period */
|
||||||
|
return [
|
||||||
|
'id' => $period->getId(),
|
||||||
|
'openingDate' => $this->normalizer->normalize($period->getOpeningDate(), $format),
|
||||||
|
'closingDate' => $this->normalizer->normalize($period->getClosingDate(), $format),
|
||||||
|
'remark' => $period->getRemark(),
|
||||||
|
'participations' => $this->normalizer->normalize($period->getParticipations(), $format),
|
||||||
|
'closingMotive' => $this->normalizer->normalize($period->getClosingMotive(), $format),
|
||||||
|
'user' => $period->getUser() ? $this->normalize($period->getUser(), $format) : null,
|
||||||
|
'step' => $period->getStep(),
|
||||||
|
'origin' => $this->normalizer->normalize($period->getOrigin(), $format),
|
||||||
|
'intensity' => $period->getIntensity(),
|
||||||
|
'emergency' => $period->isEmergency(),
|
||||||
|
'confidential' => $period->isConfidential()
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function supportsNormalization($data, string $format = null): bool
|
||||||
|
{
|
||||||
|
return $data instanceof AccompanyingPeriod;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setNormalizer(NormalizerInterface $normalizer)
|
||||||
|
{
|
||||||
|
$this->normalizer = $normalizer;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,51 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* Copyright (C) 2014-2021, Champs Libres Cooperative SCRLFS, <http://www.champs-libres.coop>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
namespace Chill\PersonBundle\Serializer\Normalizer;
|
||||||
|
|
||||||
|
use Chill\PersonBundle\Entity\AccompanyingPeriodParticipation;
|
||||||
|
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
|
||||||
|
use Symfony\Component\Serializer\Normalizer\NormalizerAwareInterface;
|
||||||
|
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
|
||||||
|
|
||||||
|
|
||||||
|
class AccompanyingPeriodParticipationNormalizer implements NormalizerInterface, NormalizerAwareInterface {
|
||||||
|
|
||||||
|
protected ?NormalizerInterface $normalizer = null;
|
||||||
|
|
||||||
|
public function normalize($participation, string $format = null, array $context = array())
|
||||||
|
{
|
||||||
|
/** @var AccompanyingPeriodParticipation $participation */
|
||||||
|
return [
|
||||||
|
'id' => $participation->getId(),
|
||||||
|
'startDate' => $this->normalizer->normalize($participation->getStartDate(), $format),
|
||||||
|
'endDate' => $this->normalizer->normalize($participation->getEndDate(), $format),
|
||||||
|
'person' => $this->normalizer->normalize($participation->getPerson(), $format)
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function supportsNormalization($data, string $format = null): bool
|
||||||
|
{
|
||||||
|
return $data instanceof AccompanyingPeriodParticipation;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setNormalizer(NormalizerInterface $normalizer)
|
||||||
|
{
|
||||||
|
$this->normalizer = $normalizer;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,95 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* Copyright (C) 2014-2021, Champs Libres Cooperative SCRLFS, <http://www.champs-libres.coop>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
namespace Chill\PersonBundle\Serializer\Normalizer;
|
||||||
|
|
||||||
|
use Chill\PersonBundle\Entity\Person;
|
||||||
|
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
|
||||||
|
use Symfony\Component\Serializer\Normalizer\DenormalizerInterface;
|
||||||
|
use Symfony\Component\Serializer\Normalizer\NormalizerAwareInterface;
|
||||||
|
use Chill\PersonBundle\Repository\PersonRepository;
|
||||||
|
use Symfony\Component\Serializer\Exception\RuntimeException;
|
||||||
|
use Symfony\Component\Serializer\Exception\UnexpectedValueException;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Serialize a Person entity
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
class PersonNormalizer implements
|
||||||
|
NormalizerInterface,
|
||||||
|
NormalizerAwareInterface,
|
||||||
|
DenormalizerInterface
|
||||||
|
{
|
||||||
|
|
||||||
|
protected NormalizerInterface $normalizer;
|
||||||
|
|
||||||
|
protected PersonRepository $repository;
|
||||||
|
|
||||||
|
public const GET_PERSON = 'get_person';
|
||||||
|
|
||||||
|
public function __construct(PersonRepository $repository)
|
||||||
|
{
|
||||||
|
$this->repository = $repository;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function normalize($person, string $format = null, array $context = array())
|
||||||
|
{
|
||||||
|
/** @var Person $person */
|
||||||
|
return [
|
||||||
|
'id' => $person->getId(),
|
||||||
|
'firstName' => $person->getFirstName(),
|
||||||
|
'lastName' => $person->getLastName(),
|
||||||
|
'birthdate' => $person->getBirthdate(),
|
||||||
|
'center' => $this->normalizer->normalize($person->getCenter())
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function denormalize($data, string $type, string $format = null, array $context = []): Person
|
||||||
|
{
|
||||||
|
if ($context[self::GET_PERSON] ?? true) {
|
||||||
|
$id = $data['id'] ?? null;
|
||||||
|
if (NULL === $id) {
|
||||||
|
throw new RuntimeException("missing id into person object");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/** var Person $person */
|
||||||
|
$person = $this->repository->findOneById($id);
|
||||||
|
|
||||||
|
if (NULL === $person) {
|
||||||
|
return UnexpectedValueException("person id not found");
|
||||||
|
}
|
||||||
|
|
||||||
|
return $person;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function supportsNormalization($data, string $format = null): bool
|
||||||
|
{
|
||||||
|
return $data instanceof Person;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function supportsDenormalization($data, string $type, ?string $format = NULL): bool
|
||||||
|
{
|
||||||
|
return Person::class === $type;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setNormalizer(NormalizerInterface $normalizer)
|
||||||
|
{
|
||||||
|
$this->normalizer = $normalizer;
|
||||||
|
}
|
||||||
|
}
|
@ -40,4 +40,8 @@ services:
|
|||||||
tags: ['controller.service_arguments']
|
tags: ['controller.service_arguments']
|
||||||
|
|
||||||
Chill\PersonBundle\Controller\AccompanyingCourseController:
|
Chill\PersonBundle\Controller\AccompanyingCourseController:
|
||||||
|
arguments:
|
||||||
|
$serializer: '@Symfony\Component\Serializer\SerializerInterface'
|
||||||
|
$dispatcher: '@Symfony\Contracts\EventDispatcher\EventDispatcherInterface'
|
||||||
|
$validator: '@Symfony\Component\Validator\Validator\ValidatorInterface'
|
||||||
tags: ['controller.service_arguments']
|
tags: ['controller.service_arguments']
|
||||||
|
15
src/Bundle/ChillPersonBundle/config/services/serializer.yaml
Normal file
15
src/Bundle/ChillPersonBundle/config/services/serializer.yaml
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
---
|
||||||
|
services:
|
||||||
|
Chill\PersonBundle\Serializer\Normalizer\PersonNormalizer:
|
||||||
|
arguments:
|
||||||
|
$repository: '@Chill\PersonBundle\Repository\PersonRepository'
|
||||||
|
tags:
|
||||||
|
- { name: 'serializer.normalizer', priority: 64 }
|
||||||
|
|
||||||
|
Chill\PersonBundle\Serializer\Normalizer\AccompanyingPeriodNormalizer:
|
||||||
|
tags:
|
||||||
|
- { name: 'serializer.normalizer', priority: 64 }
|
||||||
|
|
||||||
|
Chill\PersonBundle\Serializer\Normalizer\AccompanyingPeriodParticipationNormalizer:
|
||||||
|
tags:
|
||||||
|
- { name: 'serializer.normalizer', priority: 64 }
|
Loading…
x
Reference in New Issue
Block a user