<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use App\Forms\Admin\AdminUserForm;
use App\Helpers\UsersHelper;
use App\Helpers\EmailHelper;
use Symfony\Component\Validator\Constraints\File;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\File\Exception\FileException;
use Symfony\Component\HttpFoundation\JsonResponse;
use App\Entity\Users;
use Symfony\Component\String\Slugger\SluggerInterface;
use Knp\Component\Pager\PaginatorInterface;
use App\Managements\SettingsManagement;
use Symfony\Contracts\Translation\TranslatorInterface;
use App\Managements\PayersManagement;
class AdminUsersController extends AbstractController
{
public function __construct(
SluggerInterface $slugger,
TranslatorInterface $translator,
// $activeMenuParent = 'admin_users',
PayersManagement $payersManagement
) {
$this->slugger = $slugger;
$this->incompletePayers = $payersManagement->loadIncomplete();
$this->translator = $translator;
$this->activeMenuParent = 'admin_users';
}
/**
* @Route("/admin/uzytkownicy", name="admin_users")
*/
public function index(
SettingsManagement $settingsManagement,
PaginatorInterface $paginator,
UsersHelper $usersHelper,
Request $request
){
if(in_array($this->activeMenuParent, $_SESSION['accessModules'])){
$title = $this->translator->trans('Users');
$searchForm = $this->usersFilterForm();
$searchForm->handleRequest($request);
if ($searchForm->isSubmitted() && $searchForm->isValid()) {
$users = $this->getDoctrine()->getRepository(Users::class)->getUsers($searchForm->getData());
} else {
$users = $this->getDoctrine()->getRepository(Users::class)->findAll();
}
$users = $usersHelper->prepareForListing($users);
$users = $paginator->paginate($users, $request->query->getInt('page', 1), $settingsManagement->value('itemsPerDashboardPage'));
return $this->render('Admin/Users/list.html.twig', [
'accessModules' => $_SESSION['accessModules'],
'incompletePayers' => $this->incompletePayers,
'title' => $title,
'activeMenuParent' => $this->activeMenuParent,
'searchForm' => $searchForm->createView(),
'users' => $users
]);
}else{
return $this->redirectToRoute($_SESSION['accessModules'][0]);
}
}
/**
* @Route("/admin/uzytkownicy/edytuj/{id}", name="admin_edit_user")
*/
public function edit(
$id,
Request $request
) {
if(in_array($this->activeMenuParent, $_SESSION['accessModules'])){
$title = 'Edycja użytkownika';
$user = $this->getDoctrine()->getRepository(Users::class)->find($id);
$form = $this->createForm(AdminUserForm::class, $user);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$item = $form->getData();
$item->setCreatedDate($item->getCreatedDate());
if(strlen($item->getPassword()) > 20){
$item->setPassword($item->getPassword());
}else{
$item->setPassword(password_hash($item->getPassword(), PASSWORD_BCRYPT, array("cost" => 15)));
}
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($item);
$entityManager->flush();
$this->addFlash('success', $this->translator->trans('Successed updated'));
return $this->redirectToRoute('admin_users');
}
return $this->render('Admin/Users/details.html.twig', [
'accessModules' => $_SESSION['accessModules'],
'incompletePayers' => $this->incompletePayers,
'title' => $title,
'activeMenuParent' => $this->activeMenuParent,
'form' => $form->createView(),
'user' => $user
]);
}else{
return $this->redirectToRoute($_SESSION['accessModules'][0]);
}
}
/**
* @Route("/admin/uzytkownicy/dodaj", name="admin_add_user")
*/
public function add(
Request $request
) {
$title = 'Dodaj użytkownika';
$user = new Users();
$form = $this->createForm(AdminUserForm::class, $user);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$user = $form->getData();
$user->setCreatedDate(new \DateTime());
$user->setType('worker');
$user->setActive(1);
$user->setPassword(password_hash($user->getPassword(), PASSWORD_BCRYPT, array("cost" => 15)));
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($user);
$entityManager->flush();
$this->addFlash('success', $this->translator->trans('Success updated'));
return $this->redirectToRoute('admin_users');
}
return $this->render('Admin/Users/details.html.twig', [
'accessModules' => $_SESSION['accessModules'],
'incompletePayers' => $this->incompletePayers,
'title' => $title,
'activeMenuParent' => $this->activeMenuParent,
'form' => $form->createView(),
'user' => $user
]);
}
/**
* @Route("/remind-password", name="admin_remind_password")
*/
public function remindPassword(
Request $request,
EmailHelper $emailHelper
) {
$title = 'Dodawanie użytkownika';
$form = $this->remindPasswordForm();
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$email = $form->getData()['email'];
$user = $this->getDoctrine()->getRepository(Users::class)->findOneBy(array('email' => $email));
$newpass = $this->randomPassword(8);
$user->setPassword(password_hash($newpass, PASSWORD_BCRYPT, array("cost" => 15)));
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($user);
$entityManager->flush();
$formData = array(
'newpass' => $newpass,
'clientEmail' => $email,
'subject' => 'Resetowanie hasła | Freeline',
'fromEmail' => 'Biuro | Freeline Agencja Interaktywna <biuro@freeline.pl>',
'bcc' => 'biuro@freeline.pl'
);
$template = "resetpass";
try {
$emailHelper->sendNewPassword($formData, $template);
return $this->redirectToRoute('admin');
} catch (FileException $e) {
}
}
return $this->render('Admin/remindPassword.html.twig', [
'title' => $title,
"form" => $form->createView()
]);
}
function usersFilterForm($fields = null)
{
$Form = $this->createFormBuilder();
$Form = $Form->add('name', TextType::class, ['required' => false, 'label' => 'Name', 'attr' => ['class' => 'form-control']]);
if (!is_null($fields)) {
foreach ($fields as $key => $value) {
if ($key == 'select') {
$choices = [];
$choices['Wybierz'] = 0;
foreach ($value[1] as $choice) {
$choices[$choice->getName()] = $choice->getId();
}
$Form = $Form->add($value[0], ChoiceType::class, [
'label' => ucwords($value[0]),
'choices' => $choices,
'attr' => ['class' => 'form-control']
]);
}
}
}
$Form = $Form->add('save', SubmitType::class, ['label' => 'Search', 'attr' => ['class' => 'btn btn-theme pull-right']]);
$Form = $Form->getForm();
return $Form;
}
function remindPasswordForm($fields = null)
{
$Form = $this->createFormBuilder();
$Form = $Form->add('email', TextType::class, ['required' => false, 'label' => 'E-mail', 'attr' => ['placeholder' => 'E-mail', 'class' => 'form-control']]);
$Form = $Form->add('save', SubmitType::class, ['label' => 'Remind password', 'attr' => ['class' => 'btn btn-theme btn-block']]);
$Form = $Form->getForm();
return $Form;
}
function randomPassword(
$length,
$keyspace = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
) {
$str = '';
$max = mb_strlen($keyspace, '8bit') - 1;
if ($max < 1) {
throw new Exception('$keyspace must be at least two characters long');
}
for ($i = 0; $i < $length; ++$i) {
$str .= $keyspace[random_int(0, $max)];
}
return $str;
}
}