src/Controller/Api/AuthController.php line 198

Open in your IDE?
  1. <?php
  2.  namespace App\Controller\Api;
  3. use App\Entity\Customer;
  4. use App\Entity\CustomerDevice;
  5. use App\Helper\UploadedBase64File;
  6.  use App\Services\Api\CustomerManager;
  7.  use Doctrine\ORM\EntityManagerInterface;
  8.  use Lexik\Bundle\JWTAuthenticationBundle\Services\JWTTokenManagerInterface;
  9.  use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  10.  use Symfony\Component\HttpFoundation\File\UploadedFile;
  11.  use Symfony\Component\HttpFoundation\JsonResponse;
  12.  use Symfony\Component\HttpFoundation\Request;
  13.  use Symfony\Component\HttpFoundation\Response;
  14. use Symfony\Component\Mailer\MailerInterface;
  15. use Symfony\Component\Routing\Annotation\Route;
  16.  use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
  17.  use Symfony\Component\Security\Core\User\UserInterface;
  18. use Symfony\Component\Security\Csrf\TokenGenerator\TokenGeneratorInterface;
  19. use Stripe\Event;
  20. use Stripe\Exception\SignatureVerificationException;
  21. use Stripe\Webhook;
  22. use Psr\Log\LoggerInterface;
  23. use App\Helper\StripeHelper;
  24. \Stripe\Stripe::setApiKey($_ENV['STRIPE_SECRET_KEY_TEST']);
  25.  class AuthController extends ApiController
  26.  {
  27.    /** @var CustomerManager $customerManager */
  28.    protected $customerManager;
  29.    /**
  30.     * @param CustomerManager $customerManager
  31.     */
  32.    public function __construct(EntityManagerInterface $em,
  33.                                ParameterBagInterface $parameterBag,
  34.                                CustomerManager $customerManager)
  35.    {
  36.      parent::__construct($em,$parameterBag);
  37.      $this->customerManager $customerManager;
  38.    }
  39.    /**
  40.     * @param Request $request
  41.     * @param UserPasswordEncoderInterface $encoder
  42.     * @return JsonResponse
  43.     *
  44.     * @Route("/register", name="api_register", methods={"POST"})
  45.     */
  46.    public function register(Request $requestUserPasswordEncoderInterface $encoder)
  47.    {
  48.      $request $this->transformJsonBody($request);
  49.      $data = [
  50.        "name"=>$request->get('name'),
  51.        "email"=>$request->get('email'),
  52.        "plainPassword"=>$request->get('password'),
  53.        "country"=>json_decode($request->get('country'),true),
  54.        "teamName"=>$request->get('teamName'),
  55.        "teamCategory"=>$request->get('teamCategory'''),
  56.        "season"=>$request->get('season'),
  57.        "surname"=>$request->get('surname'),
  58.        "typeSoccer"=>$request->get('typeSoccer'),
  59.      ];
  60.      $teamLogo $request->get('teamLogo');
  61.      if(!empty($teamLogo))
  62.        $data["teamLogo"] = new UploadedBase64File($teamLogo$request->get('teamLogoFilename'));
  63.      $trainerLogo $request->get('trainerLogo');
  64.      if(!empty($trainerLogo))
  65.        $data["trainerLogo"] = new UploadedBase64File($trainerLogo$request->get('trainerLogoFilename'));
  66.      $response $this->customerManager->register($data$request);
  67.      $this->setStatusCode($response["code"]);
  68.      return $this->response($response);
  69.    }
  70.    /**
  71.     * @param Request $request
  72.     * @return JsonResponse
  73.     *
  74.     * @Route("/auth/facebook", name="api_auth_facebook", methods={"POST"})
  75.     */
  76.    public function authFacebook(Request $request)
  77.    {
  78.      $request $this->transformJsonBody($request);
  79.      $data = [
  80.        "email"=>$request->get('email'),
  81.        "name"=>$request->get('name'),
  82.        "token"=>$request->get('token'),
  83.      ];
  84.      $response $this->customerManager->authFacebook($data$request);
  85.      if($response)
  86.        return $response;
  87.      $this->setStatusCode(404);
  88.      return $this->response([
  89.        "code" => 404,
  90.        "message" => "Error al obtener usuario"
  91.      ]);
  92.    }
  93.    /**
  94.     * @param Request $request
  95.     * @return JsonResponse
  96.     *
  97.     * @Route("/auth/google", name="api_auth_google", methods={"POST"})
  98.     */
  99.    public function authGoogle(Request $request)
  100.    {
  101.      $request $this->transformJsonBody($request);
  102.      $data = [
  103.        "email"=>$request->get('email'),
  104.        "name"=>$request->get('name'),
  105.        "token"=>$request->get('token'),
  106.      ];
  107.      $response $this->customerManager->authGoogle($data$request);
  108.      if($response)
  109.        return $response;
  110.      $this->setStatusCode(404);
  111.      return $this->response([
  112.        "code" => 404,
  113.        "message" => "Error al obtener usuario"
  114.      ]);
  115.    }
  116.     /**
  117.      * @Route("/reset-password", name="reset_password_request", methods={"POST"})
  118.      */
  119.     public function request(Request $requestMailerInterface $mailer)
  120.     {
  121.         $request $this->transformJsonBody($request);
  122.         $data = [
  123.           "email" => $request->get('email'),
  124.         ];
  125.   
  126.         $response $this->customerManager->request_reset_password($data$mailer);
  127.   
  128.         $this->setStatusCode($response["code"]);
  129.         return $this->response($response);
  130.     }
  131.     /**
  132.      * @Route("/reset-password/validate/{token}", name="validate_password_reset", methods={"POST"})
  133.      */
  134.     public function validate_otp($tokenRequest $request)
  135.     {
  136.         $request $this->transformJsonBody($request);
  137.         $data = [
  138.           "email" => $request->get('email'),
  139.           "verificationCode" => $token,
  140.         ];
  141.   
  142.         $response $this->customerManager->validate_otp_reset_password($data);
  143.   
  144.         $this->setStatusCode($response["code"]);
  145.         return $this->response($response);
  146.     }
  147.     /**
  148.      * @Route("/reset-password/{hash_token}", name="reset_password_reset", methods={"POST"})
  149.      */
  150.     public function reset($hash_tokenRequest $requestMailerInterface $mailer)
  151.     {
  152.         $request $this->transformJsonBody($request);
  153.         $data = [
  154.           "email" => $request->get('email'),
  155.           "verificationHashCode" => $hash_token,
  156.           "password" => $request->get('password'),
  157.           "repeat_password" => $request->get('repeat_password'),
  158.         ];
  159.   
  160.         $response $this->customerManager->reset_password($data$mailer);
  161.   
  162.         $this->setStatusCode($response["code"]);
  163.         return $this->response($response);
  164.     }
  165.    /**
  166.      * @param Request $request
  167.      * @return JsonResponse
  168.      *
  169.      * @Route("/auth/login_external", name="api_login_external", methods={"POST"})
  170.      */
  171.     public function loginExternal(Request $request)
  172.     {
  173.       $request $this->transformJsonBody($request);
  174.       $data['email'] = $request->get('email');
  175.       $data['password'] = $request->get('password','');
  176.       $data['device_id'] = $request->get('device_id');
  177.       $data['isFingerPrinter'] = $request->get('isFingerPrinter') ?: 0;
  178.       $data['fingerprint'] = $request->get('fingerprint','');
  179.       $data['is_web_app'] = $request->get('is_web_app') ?: false;
  180.       $response $this->customerManager->loginExternal($data);
  181.       if(is_array($response)){
  182.         $this->setStatusCode($response["code"]);
  183.         return $this->response($response);
  184.       }
  185.       return $response;
  186.     }
  187.     /**
  188.      * @Route("/auth/platform_check", name="platform_check")
  189.      */
  190.     public function platformCheck(Request $request): JsonResponse
  191.     {
  192.         $userAgent $request->headers->get('User-Agent');
  193.         
  194.         if (stripos($userAgent'android') !== false) {
  195.             $platform 'Android';
  196.         } elseif (stripos($userAgent'iphone') !== false || stripos($userAgent'ipad') !== false) {
  197.             $platform 'iOS';
  198.         } else {
  199.             $platform 'Web';
  200.         }
  201.         
  202.         return new JsonResponse(['platform' => $platform]);
  203.     }
  204.     
  205.   /**
  206.    * @param Request $request
  207.    * @return JsonResponse
  208.    *
  209.    * @Route("auth/remove_account_user", name="api_remove_account_auth", methods={"POST"})
  210.    */
  211.   public function removeAccountDefinitely(Request $request)
  212.   {
  213.     $email $request->get('email');
  214.     $customerRemove $this->em->getRepository(Customer::class)->findOneBy([
  215.       'email' => $email,
  216.       'roles' => [Customer::ROLE_CUSTOMER],
  217.     ]);
  218.     $separator explode('@'$email);
  219.     $emailDeleted $separator[0] . '_deleted_'.time().'@' $separator[1];
  220.     $customerRemove->setEmail($emailDeleted);
  221.     $customerRemove->setIsDeleted(1);
  222.     $this->em->persist($customerRemove);
  223.     $customer_device $this->em->getRepository(CustomerDevice::class)->findBy([
  224.       'customerId' => $customerRemove->getId(),
  225.       'status' => true,
  226.     ]);
  227.     foreach ($customer_device as $key => $customerDevice) {
  228.       $customerDevice->setStatus(false);
  229.       $this->em->persist($customerDevice);
  230.     }
  231.     $this->em->flush();
  232.     return $this->response([
  233.       "msgType" => "success",
  234.       "message" => "remove user success",
  235.       "code" => 200
  236.     ]);
  237.   }
  238.    /**
  239.      * @Route("/auth/webhook/stripe", name="stripe_webhook", methods={"POST"})
  240.      */
  241.     public function handleWebhook(Request $request,LoggerInterface $logger): Response
  242.     {
  243.         $payload $request->getContent();
  244.         $signature $request->headers->get('stripe-signature');
  245.         $secret 'whsec_KEM2T2UKlJyGoCrlpjeBck6cXKJtFD4f';
  246.         $event null;
  247.         try {
  248.           $event =  Webhook::constructEvent($payload$signature'whsec_KEM2T2UKlJyGoCrlpjeBck6cXKJtFD4f');
  249.         } catch (SignatureVerificationException $e) {
  250.             return new Response('Invalid webhook signature'400);
  251.         }
  252.         $logger->info('[MESSAGE].', ['data' => $event]);
  253.         $logger->info('[TYPE].', ['data' => $event->type]);
  254.         // Handle the event
  255.         switch ($event->type) {
  256.           case 'invoice.payment_succeeded':
  257.             $paymentIntent $event->data->object// contains a \Stripe\PaymentIntent
  258.             $logger->info('[PAYMENT].', ['data' => $paymentIntent]);
  259.             
  260.             $metadata $event->data->object->subscription_details->metadata;
  261.             $subId $event->data->object->subscription;
  262.             $userId $metadata['user_id'];
  263.             $product_id $event->data->object->lines->data[0]->description;
  264.             $customer $this->em->getRepository(Customer::class)->findOneBy([
  265.               'id' => $userId
  266.             ]);
  267.             $stripe = new StripeHelper();
  268.             if($customer !== null){
  269.               $data = [
  270.                 'purchase' => $subId,
  271.                 'platform' => 'Web',
  272.                 'product_id'=> $product_id
  273.               ];
  274.               $response $this->customerManager->updatePurchaseByCustomer($customer,$data);
  275.               $logger->info('[PURCHASE_SUCCESS].', ['res' => $response]);
  276.             }
  277.             // Extract user_id from metadata
  278.             $logger->info('[USER_ID].', ['userId' => $userId]);
  279.             $logger->info('[SUBSCRIPTION KEY].', ['sub_key' => $userId]);
  280.           case 'payment_intent.succeeded':
  281.           case 'payment_method.attached':
  282.             $paymentIntent $event->data->object// contains a \Stripe\PaymentIntent
  283.             $logger->info('[PAYMENT].', ['data' => $paymentIntent]);
  284.             // Then define and call a method to handle the successful payment intent.
  285.             // handlePaymentIntentSucceeded($paymentIntent);
  286.             break;
  287.           default:
  288.             // Unexpected event type
  289.             $logger->info('[UNDEFINED EVENT].', ['data' => $event]);
  290.         }
  291.         return new Response('Webhook event handled');
  292.     }
  293.      /**
  294.      * @Route("/auth/stripe/success", name="app_stripe_payment_success")
  295.      */
  296.     public function stripeSuccess(): RedirectResponse
  297.     {
  298.         // Redirect to the desired URL
  299.         $DOMAIN $_ENV['DOMAIN'];
  300.         $PATH'/settings/membership';
  301.         $url $DOMAIN $PATH;
  302.         return $this->redirect($url); // Replace with your URL
  303.     }
  304.  }