* * 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 . */ namespace Chill\PersonBundle\Controller; use Chill\PersonBundle\Security\Authorization\PersonVoter; use Chill\PersonBundle\Entity\Person; use Chill\MainBundle\Security\Authorization\AuthorizationHelper; use Symfony\Component\Security\Core\Role\Role; use Chill\MainBundle\CRUD\Controller\ApiController; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Chill\MainBundle\Entity\Address; use Symfony\Component\Routing\Annotation\Route; use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter; class PersonApiController extends ApiController { private AuthorizationHelper $authorizationHelper; /** * @param AuthorizationHelper $authorizationHelper */ public function __construct(AuthorizationHelper $authorizationHelper) { $this->authorizationHelper = $authorizationHelper; } protected function createEntity(string $action, Request $request): object { $person = parent::createEntity($action, $request); // TODO temporary hack to allow creation of person with fake center $centers = $this->authorizationHelper->getReachableCenters($this->getUser(), new Role(PersonVoter::CREATE)); $person->setCenter($centers[0]); return $person; } public function personAddressApi($id, Request $request, string $_format): Response { return $this->addRemoveSomething('address', $id, $request, $_format, 'address', Address::class, [ 'groups' => [ 'read' ] ]); } /** * @Route("/api/1.0/person/address/suggest/by-person/{person_id}.{_format}", * name="chill_person_address_suggest_by_person", * requirements={ * "_format"="json" * } * ) * @ParamConverter("person", options={"id" = "person_id"}) */ public function suggestAddress(Person $person, Request $request, string $_format): Response { $this->denyAccessUnlessGranted(PersonVoter::SEE, $person); $addresses = []; // collect addresses from location in courses foreach ($person->getAccompanyingPeriodParticipations() as $participation) { if (null !== $participation->getAccompanyingPeriod()->getAddressLocation()) { $a = $participation->getAccompanyingPeriod()->getAddressLocation(); $addresses[$a->getId()] = $a; } if (null !== $personLocation = $participation ->getAccompanyingPeriod()->getPersonLocation()) { $a = $personLocation->getCurrentHouseholdAddress(); if (null !== $a) { $addresses[$a->getId()] = $a; } } } // remove the actual address $actual = $person->getCurrentHouseholdAddress(); if (null !== $actual) { $addresses = \array_filter($addresses, fn($a) => $a !== $actual); } return $this->json(\array_values($addresses), Response::HTTP_OK, [], [ 'groups' => [ 'read' ]]); } }