<?php
namespace App\Application\Controller;
use App\Admin\Document\Client;
use App\Admin\Document\UserAccount;
use App\Application\Cart\Cart;
use AvenueAdminBundle\Util\FileUtil;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use \Symfony\Component\Routing\Annotation\Route;
class AuthController extends AbstractController
{
/**
* @Route("/register", name="register")
*/
public function register(Request $request): Response
{
if ($this->hasIdentity()) {
return $this->redirectToRoute('profile');
}
$message = '';
if ($request->isMethod('POST')) {
$this->detectCaptchaBot($request);
$email = strtolower(trim($request->request->get('email')));
if (!$email) {
throw new \Exception('no email');
}
$name = trim($request->request->get('name'));
if (!$name) {
throw new \Exception('no name');
}
$phone = $this->trimPhone($request->request->get('phone'));
if (!$this->getDocumentRepository(UserAccount::class)->findOneBy(['email' => $email])) {
$user = new UserAccount();
$this->getDocumentManager()->persist($user);
$user->setName($name);
$user->setPhone($phone);
$user->setEmail($email);
$user->updateFullName();
$this->getDocumentManager()->flush();
$text = $this->renderView(
'application/mail/confirm.html.twig', [
'user' => $user,
]
);
try {
$this->getMail()->send($email, 'Подтверждение регистрации на cosca.ru', $text);
$message = 'На почту отправлена ссылка для подтверждения регистрации';
} catch (\Exception $e) {
}
} else {
$message = 'Эта почта уже занята';
}
}
return $this->render('application/auth/register.html.twig', [
'message' => $message,
]);
}
/**
* @Route("/register/confirm", name="register-confirm")
*/
public function confirm(Request $request): Response
{
if ($this->hasIdentity()) {
return $this->redirectToRoute('profile');
}
$id = strtolower(trim($request->get('id')));
/**
* @var UserAccount $user
*/
$user = $this->getDocumentRepository(UserAccount::class)->find($id);
if (!$user) {
throw new \Exception('no user');
}
if ($user->getActive()) {
throw new \Exception('user active');
}
$user->setActive(true);
/**
* @var Client $client
*/
$client = new Client();
$this->getDocumentManager()->persist($client);
$client->pending();
$client->setName($user->getFullName());
$counterparty = $client->addRetailCounterparty();
$this->getDocumentManager()->persist($counterparty);
$user->setClient($client);
$newPassword = $this->generatePassword();
$passwordAsHash = $this->getPasswordHash($newPassword);
$user->setPassword($passwordAsHash);
$this->getDocumentManager()->flush();
$text = $this->renderView(
'application/mail/register.html.twig', [
'user' => $user,
'newPassword' => $newPassword
]
);
try {
$this->getMail()->send($user->getEmail(), 'Вы зарегистрированы', $text);
} catch (\Exception $e) {
}
return $this->redirectToRoute('login', ['confirm' => 1]);
}
/**
* @Route("/login", name="login")
*/
public function login(Request $request, Cart $cart): Response
{
if ($this->hasIdentity()) {
return $this->redirectToRoute('home');
}
$errorMessage = '';
if ($request->isMethod('POST')) {
$email = $request->request->get('email');
$password = $request->request->get('password');
if ($this->authenticate($email, $password)) {
$redirect = $request->get('redirect');
if (!$redirect) {
$redirect = 'home';
$user = $this->getLoggedInUser();
$client = $user->getClient();
if ($client->getSeller() && !$cart->getCounterparty()) {
foreach ($client->getActiveCounterparties() as $counterparty) {
$cart->setCounterparty($counterparty, $user->getCartItemsByCounterparty($counterparty->getId()));
break;
}
}
}
return $this->redirectToRoute($redirect);
} else {
$errorMessage = 'Неверные идентификационные данные';
}
} else {
if ($request->get('confirm')) {
$errorMessage = 'Почта подтверждена. Пароль отправлен на указаннную почту.';
}
}
return $this->render(
'application/auth/login.html.twig', [
'message' => $errorMessage
]
);
}
/**
* @Route("/reset-ajax", name="reset-ajax")
*/
public function resetAjax(Request $request)
{
return new JsonResponse($this->resetPassword($request));
}
private function resetPassword(Request $request)
{
$email = null;
$errorMessage = null;
if ($request->isMethod('POST')) {
$email = $request->request->get('email');
/**
* @var UserAccount $user
*/
$user = $this->findIdentity($email);
if ($user && $user->getActive()) {
$newPassword = $this->generatePassword();
$passwordAsHash = $this->getPasswordHash($newPassword);
$user->setPassword($passwordAsHash);
$this->getDocumentManager()->flush();
$text = $this->renderView(
'application/mail/reset.html.twig', [
'user' => $user,
'newPassword' => $newPassword
]
);
try {
$this->getMail()->send($email, 'Восстановление пароля', $text);
$errorMessage = 'Новый пароль отправлен на почту ' . $email;
} catch (\Exception $e) {
$errorMessage = 'Мы не смогли отправить письмо с паролем<!--' . (string)$e . '-->';
}
} else {
$errorMessage = 'Такой пользователь не найден';
}
}
return [
'message' => $errorMessage,
'email' => $email
];
}
/**
* @Route("/logout", name="logout")
* @param Request $request
* @return \Symfony\Component\HttpFoundation\Response
*/
public function logout(Request $request)
{
$this->clearIdentity();
return $this->redirectToRoute('home');
}
}