<?php
declare(strict_types=0);
/*
* WellCommerce Foundation
*
* This file is part of the WellCommerce package.
*
* (c) Adam Piotrowski <adam@wellcommerce.org>, Adrian Potepa <adrian@wellcommerce.org>
*
* For the full copyright and license information,
* please view the LICENSE file that was distributed with this source code.
*/
namespace WellCommerce\Bundle\AppBundle\Controller\Admin;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Security;
use WellCommerce\Bundle\AppBundle\DataGrid\UserDataGrid;
use WellCommerce\Bundle\AppBundle\DataSet\Admin\UserDataSet;
use WellCommerce\Bundle\AppBundle\Entity\User;
use WellCommerce\Bundle\AppBundle\Form\Admin\UserFormBuilder;
use WellCommerce\Bundle\AppBundle\Form\Admin\UserLoginFormBuilder;
use WellCommerce\Bundle\AppBundle\Form\Admin\UserResetPasswordFormBuilder;
use WellCommerce\Bundle\AppBundle\Manager\UserManager;
use WellCommerce\Bundle\AppBundle\Service\Shop\Storage\ShopStorage;
use WellCommerce\Bundle\CoreBundle\Controller\Admin\AbstractAdminController;
use WellCommerce\Bundle\CoreBundle\Helper\Mailer\MailerHelper;
/**
* Class UserController
*
* @author Adam Piotrowski <adam@wellcommerce.org>
*
* @Route("/user", name="admin.user.", options={"expose"="true"})
*/
class UserController extends AbstractAdminController
{
public function __construct(UserManager $manager)
{
parent::__construct($manager);
}
/**
* @Route("/index", name="index")
* @IsGranted("ROLE_ADMIN")
*/
public function indexAction(UserDataGrid $dataGrid): Response
{
return $this->index($dataGrid);
}
/**
* @Route("/grid", name="grid")
* @IsGranted("ROLE_ADMIN")
*/
public function gridAction(Request $request, UserDataSet $dataSet): Response
{
return $this->grid($request, $dataSet);
}
/**
* @Route("/add", name="add")
* @IsGranted("ROLE_ADMIN")
*/
public function addAction(UserFormBuilder $formBuilder): Response
{
return $this->save($formBuilder);
}
/**
* @Route("/edit/{id}", name="edit")
* @IsGranted("ROLE_ADMIN")
*/
public function editAction(UserFormBuilder $formBuilder, User $entity): Response
{
return $this->save($formBuilder, $entity);
}
/**
* @Route("/login", name="login")
*/
public function loginAction(UserLoginFormBuilder $formBuilder, Request $request): Response
{
$form = $formBuilder->createForm(null, [
'name' => 'login',
'ajax_enabled' => false,
'class' => 'login-form',
]);
return $this->displayTemplate('login', [
'error' => $this->getSecurityErrors($request),
'form' => $form,
]);
}
/**
* @Route("/ping", name="ping")
* @IsGranted("ROLE_ADMIN")
*/
public function ping(): JsonResponse
{
return $this->json(['success' => true]);
}
/**
* @Route("/reset", name="reset_password")
*/
public function resetPasswordAction(UserResetPasswordFormBuilder $formBuilder, ShopStorage $storage, MailerHelper $mailer): Response
{
$form = $formBuilder->createForm(null, [
'name' => 'reset_password',
'ajax_enabled' => false,
'class' => 'login-form',
]);
if ($form->handleRequest()->isSubmitted()) {
$formValues = $form->getValue();
$username = $formValues['username'];
$user = $this->manager->getRepository()->findOneBy(['username' => $username]);
if (!$user instanceof User) {
$this->getFlashHelper()->addError(sprintf('User with e-mail "%s" was not found.', $username));
return $this->redirectToAction('reset_password');
}
$password = $this->getSecurityHelper()->generateRandomPassword();
$user->setPassword($password);
$this->manager->updateResource($user);
$mailer->sendEmail([
'recipient' => $user->getEmail(),
'subject' => $this->getTranslatorHelper()->trans('user.email.title.reset_password'),
'template' => 'WellCommerceAppBundle:Admin/Email:reset_password.html.twig',
'parameters' => [
'user' => $user,
'password' => $password,
],
'configuration' => $storage->getCurrentShop()->getMailerConfiguration(),
]);
$this->getFlashHelper()->addSuccess('user.flash.success.reset_password');
return $this->redirectToAction('login');
}
return $this->displayTemplate('reset_password', [
'form' => $form,
]);
}
/**
* @Route("/login_check", name="login_check")
*/
public function loginCheckAction()
{
}
/**
* @Route("/logout", name="logout")
*/
public function logoutAction()
{
}
/**
* @Route("/delete/{id}", name="delete")
* @IsGranted("ROLE_ADMIN")
*/
public function deleteAction(User $user): Response
{
$this->denyAccessUnlessGranted($this->manager->getAlias() . '.delete');
if ($user === $this->getSecurityHelper()->getAuthenticatedAdmin()) {
return $this->jsonResponse([
'error' => 'You cannot delete your own admin account.',
]);
}
$this->manager->removeResource($user);
return $this->jsonResponse(['success' => true]);
}
/**
* @Route("/403", name="access_denied")
*/
public function accessDeniedAction(): Response
{
return $this->displayTemplate('access_denied');
}
private function getSecurityErrors(Request $request)
{
$session = $request->getSession();
$error = '';
if ($request->attributes->has(Security::AUTHENTICATION_ERROR)) {
$error = $request->attributes->get(Security::AUTHENTICATION_ERROR);
} elseif (null !== $session && $session->has(Security::AUTHENTICATION_ERROR)) {
$error = $session->get(Security::AUTHENTICATION_ERROR);
$session->remove(Security::AUTHENTICATION_ERROR);
}
return $error;
}
}