<?php
namespace App\Controller\Website\Auth;
use Doctrine\ORM\EntityManagerInterface;
use App\Controller\Website\Auth\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Sulu\Bundle\SecurityBundle\Entity\User;
use Sulu\Component\Webspace\Manager\WebspaceManagerInterface;
use App\Manager\UserManager;
use Exception;
use GuzzleHttp\Client;
class RegisterController extends AbstractController
{
protected $entityManager;
protected $webspaceManager;
protected $userManager;
protected $pathToCountriesCSV;
public function __construct(EntityManagerInterface $entityManager, WebspaceManagerInterface $webspaceManager, UserManager $userManager)
{
$this->entityManager = $entityManager;
$this->webspaceManager = $webspaceManager;
$this->userManager = $userManager;
}
private function getCountriesFromCSV()
{
$data = [];
if (($handle = fopen($this->pathToCountriesCSV, 'r')) !== false) {
while (($row = fgetcsv($handle)) !== false) {
$data[] = [
'name' => $row[0],
'id' => $row[1],
];
}
fclose($handle);
}
usort($data, function ($a, $b) {
return strcoll($a['name'], $b['name']);
});
return $data;
}
public function findCountryById(string $id): ?string
{
if (($handle = fopen($this->pathToCountriesCSV, 'r')) !== false) {
while (($row = fgetcsv($handle)) !== false) {
if ($row[1] === $id) {
fclose($handle);
return $row[0];
}
}
fclose($handle);
}
return null;
}
/**
* @Route("/register", name="app_register_index", methods={"GET","HEAD"})
*/
public function index(Request $request): Response
{
$this->pathToCountriesCSV = $this->getParameter('kernel.project_dir') . '/src/Controller/Website/Auth/crm_countries.csv';
$error = match ($request->query->get('error')) {
'crm' => 'You have not passed validation through recaptcha.',
'user' => 'User not created. Please try again.',
default => null,
};
$capcha_site_key = $_ENV['APP_ENV'] === 'dev' ? $_ENV['CAPTCHA_SITE_KEY_DEV'] : $_ENV['CAPTCHA_SITE_KEY_PROD'];
return $this->render('auth/register.html.twig', [
'countries' => $this->getCountriesFromCSV(),
'capcha_site_key' => $capcha_site_key,
'error' => $error,
]);
}
// /**
// * @Route("/register-success", name="app_register_success_index", methods={"GET","HEAD"})
// */
// public function registerSuccessPage(Request $request): Response
// {
// $modernSiteUrl = $_ENV['APP_BASE_URL'];
//
// return $this->render('auth/register-success.html.twig', [
// 'modernSiteUrl' => $modernSiteUrl,
// ]);
// }
/**
* @Route("/register", name="app_register_post", methods={"POST"})
*/
public function register(Request $request): Response
{
$this->pathToCountriesCSV = $this->getParameter('kernel.project_dir') . '/src/Controller/Website/Auth/crm_countries.csv';
$formData = $request->request->all();
try {
$this->registerUserProccess($formData);
} catch (Exception $e) {
$this->redirect('/register?error=user');
}
try {
$this->sendToCrm($formData);
} catch (Exception $e) {
$this->redirect('/register?error=crm');
}
$modernSiteUrl = $_ENV['APP_BASE_URL'];
return $this->render('auth/register-success.html.twig', [
'modernSiteUrl' => $modernSiteUrl,
]);
}
private function registerUserProccess(array $formData)
{
$roleName = 'website_user';
$webspaceKey = 'modernexpo';
$user = new User();
$user = $this->setUserPasswordAndSalt($user, $formData);
if (null !== $formData['full_name']) {
$user->setUsername($formData['full_name']);
}
if (null !== $formData['email']) {
$user->setEmail($formData['email']);
}
$userLocale = $user->getLocale();
if (null === $userLocale) {
$user->setLocale('en');
}
$user->setEnabled(true);
// Create User
$user = $this->userManager->createUser($user, $webspaceKey, $roleName);
}
private function sendToCrm(array $formData): void
{
$url = $_ENV['APP_ENV'] === 'dev' ? $_ENV['CRM_DEV_URL'] : $_ENV['CRM_PROD_URL'];
$recaptchaToken = $formData['g-recaptcha-response'] ?? '';
if (!empty($formData['country_id']) && empty($formData['country_name'])) {
$formData['country_name'] = $this->findCountryById($formData['country_id']);
}
$body = [
'name' => 'Request Access to the media bank',
'mainForm' => [
'id' => '827489bd-35b9-4e02-9770-131caf29b246',
],
'submitForm' => [
'id' => '827489bd-35b9-4e02-9770-131caf29b246',
],
'formData' => [
'full_name' => $formData['full_name'] ?? '',
'company_name' => $formData['company_name'] ?? '',
'email' => $formData['email'] ?? '',
// 'password' => $formData['_password'] ?? '',
'country' => [
'id' => $formData['country_id'] ?? '728d079f-f712-4add-984c-e280cc0ae2d2',
'name' => $formData['country_name'] ?? 'Ukraine',
],
'phone' => $formData['phone'] ?? '',
],
];
$headers = [
'Content-Type' => 'application/json',
'X-Recaptcha-Token' => $recaptchaToken,
];
try {
$client = new Client();
$response = $client->post($url, [
'headers' => $headers,
'json' => $body,
]);
} catch (\Throwable $e) {
$errorMessage = sprintf('API request failed with message: %s, code: %d', $e->getMessage(), $e->getCode());
if ($_ENV['APP_ENV'] === 'dev') {
dump('Request Body: ', $body, 'Headers: ', $headers);
dump('Error: ', $e);
die();
}
error_log($errorMessage);
throw new \Exception($errorMessage, $e->getCode(), $e);
}
}
}