diff --git a/config/services.yaml b/config/services.yaml index 5380799c4957b95b38db610d05683e27a1e4174b..40dcd80a2fe539adaf402e4178106299d0ca4d4e 100644 --- a/config/services.yaml +++ b/config/services.yaml @@ -36,14 +36,6 @@ services: $requireNumbers: '%env(APP_PASSWORD_REQUIRE_NUMBERS)%' $requireSpecialCharacter: '%env(APP_PASSWORD_REQUIRE_SPECIAL_CHARACTERS)%' - App\Domain\User\Controller\SecurityController: - arguments: - $sso_type: '%SSO_TYPE%' - $sso_key_field: '%SSO_KEY_FIELD%' - - App\Domain\User\Controller\ProfileController: - arguments: - $sso_type: '%SSO_TYPE%' # App\EventSubscriber\LogoutSubscriber: diff --git a/config/services/controller.yaml b/config/services/controller.yaml index 0d68cb2fed2f4e02bb07a4785d154357122cd305..da8c0df1486b43442c09a0afdd83d731153d4d3d 100644 --- a/config/services/controller.yaml +++ b/config/services/controller.yaml @@ -25,6 +25,17 @@ services: arguments: $logoFilesystem: '@gaufrette.collectivity_logo_filesystem' + + App\Domain\User\Controller\SecurityController: + arguments: + $sso_type: '%SSO_TYPE%' + $sso_key_field: '%SSO_KEY_FIELD%' + + App\Domain\User\Controller\ProfileController: + arguments: + $sso_type: '%SSO_TYPE%' + $logoFilesystem: '@gaufrette.collectivity_logo_filesystem' + App\Domain\AIPD\Controller\ModeleAnalyseController: arguments: $fichierFilesystem: '@gaufrette.aipd_critere_principe_fondamentaux_fichier_filesystem' diff --git a/src/Domain/User/Controller/ProfileController.php b/src/Domain/User/Controller/ProfileController.php index f2ceb7e3d4b8d382c532f342ba9f593c2e4d1574..bd5919c23379ddfc5b10043d7e60e359c4171ec8 100644 --- a/src/Domain/User/Controller/ProfileController.php +++ b/src/Domain/User/Controller/ProfileController.php @@ -29,14 +29,19 @@ use App\Application\Symfony\Security\UserProvider; use App\Domain\User\Form\Type\CollectivityType; use App\Domain\User\Form\Type\ReviewDataType; use App\Domain\User\Form\Type\UserType; +use App\Domain\User\Model\ReviewData; use App\Domain\User\Model\User; use App\Domain\User\Repository; use Doctrine\ORM\EntityManagerInterface; +use Gaufrette\FilesystemInterface; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; +use Symfony\Component\Form\Form; +use Symfony\Component\HttpFoundation\File\UploadedFile; use Symfony\Component\HttpFoundation\RequestStack; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException; use Symfony\Component\Security\Core\Security; +use Symfony\Component\String\Slugger\SluggerInterface; class ProfileController extends AbstractController { @@ -78,6 +83,13 @@ class ProfileController extends AbstractController private $security; private ?string $sso_type; + /** + * @var FilesystemInterface + */ + protected $logoFilesystem; + + protected SluggerInterface $slugger; + public function __construct( EntityManagerInterface $entityManager, ControllerHelper $helper, @@ -87,6 +99,8 @@ class ProfileController extends AbstractController Repository\User $userRepository, Security $security, ?string $sso_type, + FilesystemInterface $logoFilesystem, + SluggerInterface $slugger, ) { $this->entityManager = $entityManager; $this->helper = $helper; @@ -96,6 +110,8 @@ class ProfileController extends AbstractController $this->userRepository = $userRepository; $this->sso_type = $sso_type; $this->security = $security; + $this->logoFilesystem = $logoFilesystem; + $this->slugger = $slugger; } /** @@ -115,6 +131,40 @@ class ProfileController extends AbstractController ]); } + public function formPrePersistData($object, $form = null): void + { + /** @var Form $reviewDataForm */ + $reviewDataForm = $form->get('reviewData'); + if ($reviewDataForm) { + /** @var UploadedFile $logoFile */ + $logoFile = $reviewDataForm->get('logo')->getData(); + if ($logoFile) { + $originalFilename = pathinfo($logoFile->getClientOriginalName(), PATHINFO_FILENAME); + // this is needed to safely include the file name as part of the URL + $safeFilename = $this->slugger->slug($originalFilename); + $newFilename = $safeFilename . '-' . uniqid() . '.' . $logoFile->guessExtension(); + $this->logoFilesystem->write($newFilename, \fopen($logoFile->getRealPath(), 'r')); + + // updates the 'brochureFilename' property to store the PDF file name + // instead of its contents + /** @var ReviewData $reviewData */ + $reviewData = $object->getReviewData(); + $reviewData->setLogo('/uploads/collectivity/logos/' . $newFilename); + $object->setReviewData($reviewData); + } + + if ($reviewDataForm->has('deleteLogo')) { + $deleteLogo = $reviewDataForm->get('deleteLogo')->getData(); + if ($deleteLogo) { + /** @var ReviewData $reviewData */ + $reviewData = $object->getReviewData(); + $reviewData->setLogo(null); + $object->setReviewData($reviewData); + } + } + } + } + /** * Generate collectivity edit form for user. * @@ -144,6 +194,8 @@ class ProfileController extends AbstractController $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { + $this->formPrePersistData($object, $form); + $this->entityManager->persist($object); $this->collectivityRepository->update($object); $this->helper->addFlash('success', $this->helper->trans('user.organization.flashbag.success.my_organization_edit')); diff --git a/tests/Domain/User/Controller/ProfileControllerTest.php b/tests/Domain/User/Controller/ProfileControllerTest.php index 76f08290748ac828abb8a7c67a14ff6b64e0f917..77c73628e32e3670337c21bac4c359f75e9c2ef0 100644 --- a/tests/Domain/User/Controller/ProfileControllerTest.php +++ b/tests/Domain/User/Controller/ProfileControllerTest.php @@ -32,11 +32,13 @@ use App\Domain\User\Model; use App\Domain\User\Repository; use App\Tests\Utils\ReflectionTrait; use Doctrine\ORM\EntityManagerInterface; +use Gaufrette\FilesystemInterface; use PHPUnit\Framework\TestCase; use Prophecy\PhpUnit\ProphecyTrait; use Symfony\Component\HttpFoundation\RequestStack; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Security\Core\Security; +use Symfony\Component\String\Slugger\SluggerInterface; class ProfileControllerTest extends TestCase { @@ -101,7 +103,9 @@ class ProfileControllerTest extends TestCase $this->collectivityRepositoryProphecy->reveal(), $this->userRepositoryProphecy->reveal(), $this->securityProphecy->reveal(), - null + null, + $this->prophesize(FilesystemInterface::class)->reveal(), + $this->prophesize(SluggerInterface::class)->reveal(), ); }