Deprecated : Constant E_STRICT is deprecated in /home/pastorz/old-espace-client/vendor/symfony/error-handler/ErrorHandler.php on line 58
Deprecated : Constant E_STRICT is deprecated in /home/pastorz/old-espace-client/vendor/symfony/error-handler/ErrorHandler.php on line 76
Symfony Profiler
<?php
namespace App\Controller\Account ;
use App\Entity\Address ;
use App\Entity\Region ;
use App\Entity\User ;
use App\Form\AddressFormType ;
use App\Form\DeleteConfirmationFormType ;
use App\Form\ShippingAddressFormType ;
use App\Service\GoogleAPIService ;
use App\Service\SessionService ;
use App\Service\ShipmentService ;
use Doctrine\ORM\EntityManagerInterface ;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController ;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface ;
use Symfony\Component\HttpFoundation\JsonResponse ;
use Symfony\Component\HttpFoundation\Request ;
use Symfony\Component\HttpFoundation\Response ;
use Symfony\Component\Routing\Annotation\Route ;
use Symfony\Contracts\Translation\TranslatorInterface ;
use Throwable ;
class AddressController extends AbstractController
{
private EntityManagerInterface $em ;
/**
* @param EntityManagerInterface $em
*/
public function __construct ( EntityManagerInterface $em , private TranslatorInterface $translator , private ParameterBagInterface $parameterBag )
{
$this -> em = $em ;
}
#[Route ( '/mon-compte/mes-adresses' , name : 'app_account_addresses' )]
public function addresses (): Response
{
/** @var User $user */
if (! $user = $this -> getUser ()) {
return $this -> redirectToRoute ( 'app_login' );
}
return $this -> render ( 'account/address/index.html.twig' , array(
'addresses' => $user -> getAddresses ()
));
}
#[Route ( '/mon-compte/mes-adresses/{address}/edition' , name : 'app_account_addresses_edit' )]
public function addressEdit ( Request $request , Address $address , SessionService $sessionService ): Response
{
if (!$this -> getUser ()) {
return $this -> redirectToRoute ( 'app_login' );
}
if (!$this -> getUser ()-> getAddresses ()-> contains ( $address )) {
throw $this -> createAccessDeniedException ();
}
$addressForm = $this -> createForm ( AddressFormType ::class, $address , array(
'user' => $this -> getUser ()
));
$addressForm -> handleRequest ( $request );
if ($addressForm -> isSubmitted () && $addressForm -> isValid ()) {
if ($addressForm -> get ( 'defaultBilling' )-> getData ()) {
$this -> getUser ()-> setBillingAddress ( $address );
}
if ($addressForm -> get ( 'defaultDelivery' )-> getData ()) {
$this -> getUser ()-> setDeliveryAddress ( $address );
}
$this -> em -> persist ( $this -> getUser ());
$this -> em -> persist ( $address );
$this -> em -> flush ();
$sessionService -> clearShippingAddresses ();
$this -> addFlash ( 'success' , $this -> translator -> trans ( 'app.success.address.modified' ));
return $this -> redirectToRoute ( 'app_account_addresses' );
}
return $this -> render ( 'account/address/edit.html.twig' , array(
'address' => $address ,
'form' => $addressForm -> createView ()
));
}
#[Route ( '/mon-compte/mes-adresses/nouvelle-adresse' , name : 'app_account_addresses_add' )]
public function addressAdd ( Request $request , SessionService $sessionService ): Response
{
if (!$this -> getUser ()) {
return $this -> redirectToRoute ( 'app_login' );
}
$addressForm = $this -> createForm ( AddressFormType ::class, new Address (), array(
'user' => $this -> getUser ()
));
$addressForm -> handleRequest ( $request );
if ($addressForm -> isSubmitted () && $addressForm -> isValid ()) {
/** @var Address $address */
$address = $addressForm -> getData ();
$address -> setUser ( $this -> getUser ());
if ($addressForm -> get ( 'defaultBilling' )-> getData ()) {
$this -> getUser ()-> setBillingAddress ( $address );
}
if ($addressForm -> get ( 'defaultDelivery' )-> getData ()) {
$this -> getUser ()-> setDeliveryAddress ( $address );
}
$this -> em -> persist ( $this -> getUser ());
$this -> em -> persist ( $addressForm -> getData ());
$this -> em -> flush ();
$sessionService -> clearShippingAddresses ();
$this -> addFlash ( 'success' , $this -> translator -> trans ( 'app.success.address.new' ));
return $this -> redirectToRoute ( 'app_account_addresses' );
}
return $this -> render ( 'account/address/edit.html.twig' , array(
'address' => null ,
'form' => $addressForm -> createView ()
));
}
#[Route ( '/account/address/{address}/delete' , name : 'app_account_addresses_delete' )]
public function addressDelete ( Request $request , Address $address ): Response
{
if (!$this -> getUser ()) {
return $this -> redirectToRoute ( 'app_login' );
}
if (!$this -> getUser ()-> getAddresses ()-> contains ( $address )) {
throw $this -> createAccessDeniedException ();
}
$this -> em -> remove ( $address );
$this -> em -> flush ();
$this -> addFlash ( 'success' , $this -> translator -> trans ( 'app.success.address.deleted' ));
$route = $request -> headers -> get ( 'referer' );
return $this -> redirect ( $route );
}
#[Route ( '/account/address/form/{address}' , name : 'app_account_addresses_form' , options : [ 'expose' => true ])]
public function getAddressForm ( Request $request , EntityManagerInterface $em , ShipmentService $shipmentService , Address $address = null ): Response
{
/** @var User $user */
if (! $user = $this -> getUser ()) {
return $this -> redirectToRoute ( 'app_login' );
}
if ($address && ! $user -> getAddresses ()-> contains ( $address )) {
return $this -> redirectToRoute ( 'app_account_addresses' );
}
if (!$address ) {
$address = new Address ();
$address -> setUser ( $this -> getUser ());
}
$form = $this -> createForm ( AddressFormType ::class, $address , array(
'user' => $this -> getUser (),
'onlyDeliveryEnable' => true ,
'attr' => array(
'data-restrict-regions' => true ,
'data-submit-target' => $this -> generateUrl ( 'app_account_addresses_form' , array( 'address' => $address ?-> getId ()))
)
));
$form -> handleRequest ( $request );
if ($form -> isSubmitted () && $form -> isValid ()) {
if ($form -> get ( 'defaultBilling' )-> getData ()) {
$this -> getUser ()-> setBillingAddress ( $address );
}
if ($form -> get ( 'defaultDelivery' )-> getData ()) {
$this -> getUser ()-> setDeliveryAddress ( $address );
}
$em -> persist ( $form -> getData ());
$em -> flush ();
$shippingForm = $this -> createForm ( ShippingAddressFormType ::class);
$response = array(
'html' => array(
'delivery' => $this -> renderView ( 'account/shipping/addresses.html.twig' , array(
'formElement' => $shippingForm -> get ( 'deliveryAddress' )-> createView (),
'userDefaultAddress' => $this -> getUser ()-> getDeliveryAddress ()
)),
'billing' => $this -> renderView ( 'account/shipping/addresses.html.twig' , array(
'formElement' => $shippingForm -> get ( 'billingAddress' )-> createView (),
'userDefaultAddress' => $this -> getUser ()-> getBillingAddress ()
))
),
'redirect' => false
);
$deliveryAddresses = $user -> getAddresses ()-> filter (fn( Address $address ) => $shipmentService -> canDeliver ( $address ));
if ($deliveryAddresses -> isEmpty ()) {
$response [ 'redirect' ] = true ;
$response [ 'redirect_target' ] = $this -> generateUrl ( 'app_account_delivery_notes_shipping_excluded' );
}
return new JsonResponse ( $response );
}
if ($form -> isSubmitted () && ! $form -> isValid ()) {
$code = Response :: HTTP_BAD_REQUEST ;
$address -> setCountry ( null );
$address -> setRegion ( null );
} else $code = Response :: HTTP_OK ;
return new JsonResponse (array(
'title' => $this -> translator -> trans ( 'app.addresses.' . ( $address -> getId () ? 'edit' : 'add' ) . '.pageTitle' ),
'html' => $this -> renderView ( 'account/address/form.html.twig' , array(
'form' => $form -> createView (),
))
), $code );
}
#[Route ( '/account/address/form/{address}/delete' , name : 'app_account_addresses_delete_form' , options : [ 'expose' => true ])]
public function getAddressDeleteForm ( Request $request , EntityManagerInterface $em , Address $address = null ): Response
{
/** @var User $user */
if (! $user = $this -> getUser ()) {
return $this -> redirectToRoute ( 'app_login' );
}
if ($address && ! $user -> getAddresses ()-> contains ( $address )) {
return $this -> redirectToRoute ( 'app_account_addresses' );
}
if (!$address ) {
$address = new Address ();
$address -> setUser ( $this -> getUser ());
}
$form = $this -> createForm ( DeleteConfirmationFormType ::class, null , array(
'attr' => array(
'data-submit-target' => $this -> generateUrl ( 'app_account_addresses_delete_form' , array( 'address' => $address ?-> getId ()))
)
));
$form -> handleRequest ( $request );
if ($form -> isSubmitted () && $form -> isValid ()) {
$em -> remove ( $address );
$em -> flush ();
$shippingForm = $this -> createForm ( ShippingAddressFormType ::class);
return new JsonResponse (array(
'html' => array(
'delivery' => $this -> renderView ( 'account/shipping/addresses.html.twig' , array(
'formElement' => $shippingForm -> get ( 'deliveryAddress' )-> createView (),
'userDefaultAddress' => $this -> getUser ()-> getDeliveryAddress ()
)),
'billing' => $this -> renderView ( 'account/shipping/addresses.html.twig' , array(
'formElement' => $shippingForm -> get ( 'billingAddress' )-> createView (),
'userDefaultAddress' => $this -> getUser ()-> getBillingAddress ()
))
)
));
}
return new JsonResponse (array(
'title' => $this -> translator -> trans ( 'app.modals.deleteAddress.title' ),
'html' => $this -> renderView ( 'account/modal/delete-address-confirmation.html.twig' , array(
'form' => $form -> createView ()
))
));
}
#[Route ( '/api/account/address/autocomplete/search' , name : 'app_autocomplete_address' , options : [ 'expose' => true ], locale : 'fr' )]
public function autocompleteAddress ( Request $request , GoogleAPIService $googleAPIService ): Response
{
if (!$request -> get ( 'input' ) || strlen ( $request -> get ( 'input' )) < 3 ) return new JsonResponse ([
'message' => 'La recherche doit faire minimum 3 caractères'
], 400 );
try {
return new JsonResponse ( json_decode ( $googleAPIService ->
autocomplete ( $request -> get ( 'input' ), $request -> get ( 'sessionToken' ), $this -> getUser ()?-> getPreferredLocale ())), 200 );
} catch (Throwable ) {
return new JsonResponse ([
'message' => 'Erreur lors de la requête à Google'
], 400 );
}
}
#[Route ( 'api/region/search' , name : 'app_search_region' , options : [ 'expose' => true ], locale : 'fr' )]
public function searchRegion ( Request $request ): Response
{
$locale = $this -> getUser ()?-> getPreferredLocale () ?? $this -> parameterBag -> get ( 'app.default_locale' );
$input = $request -> get ( 'input' );
if($input ){
if (strlen ( $input ) < 2 ) return new JsonResponse ([
'message' => 'La recherche doit faire minimum 2 caractères'
], 400 );
}
try {
$countryCodes = $request -> get ( 'countries' );
if (!$countryCodes ) $countryCodes = null ;
$items = array_map (fn( Region $r ) => [
'name' => $r -> getName (),
'code' => $r -> getCode (),
'country' => $r -> getCountry ()-> getCode (),
'id' => $r -> getId (),
'text' => $r -> getName () . ' (' . $r -> getCountry ()-> getLocalizedName ( locale : $locale ) . ')'
], $this -> em -> getRepository ( Region ::class)-> search ( $input , $countryCodes ));
return new JsonResponse ([ 'items' => $items ], 200 );
} catch (Throwable ) {
return new JsonResponse ([
'message' => 'Erreur lors de la requête à la base de données'
], 400 );
}
}
#[Route ( '/api/account/address/autocomplete/detail' , name : 'app_autocomplete_place_detail' , options : [ 'expose' => true ], locale : 'fr' )]
public function autocompletePlaceDetail ( Request $request , GoogleAPIService $googleAPIService ): Response
{
if (!$request -> get ( 'place_id' )) return new JsonResponse ([
'message' => 'L\'id de l\'adresse doit être renseigné'
], 400 );
$defaultErrorResponse = new JsonResponse ([
'message' => 'Erreur lors de la requête à Google'
], 400 );
try {
$response = json_decode ( $googleAPIService -> placeDetail ( $request -> get ( 'place_id' ), $request -> get ( 'sessionToken' ), $this -> getUser ()?-> getPreferredLocale ()));
} catch (Throwable ) {
return $defaultErrorResponse ;
}
if ($response -> status !== "OK" ) return $defaultErrorResponse ;
return new JsonResponse ( $response , 200 );
}
}