<?php
namespace App\Controller;
use App\Entity\SiteBannedIps;
use App\Entity\CrmEnquiries;
use App\Entity\UserCrms;
use App\Entity\User;
use App\Entity\UserProfiles;
use App\Repository\CountriesRepository;
use App\Form\ManageCompaniesForm;
use App\Form\UserBillingForm;
use App\Form\UserForm;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use App\Form\Filters\ManageCompaniesFilter;
use App\Form\Filters\CrmRecycleBinFilter;
use App\Form\Filters\ManageUsersFilter;
use App\Repository\CompaniesRepository;
use App\Service\ServiceStorage;
use App\Service\ServiceEnquiry;
use App\Repository\TrashItemsRepository;
use App\Repository\EnquiriesRepository;
use App\Repository\UserSubscriptionsRepository;
use App\Repository\UserRepository;
use App\Form\Filters\UserSubscriptionsFilter;
#[Route('/manage/users')]
class ManageUsersController extends AbstractController
{
#[Route('/', defaults: ['page' => '1'], methods: ['GET'], name: 'manage_users_index')]
#[Route('/page/{page<[1-9]\d*>}', methods: ['GET'], name: 'manage_users_index_paginated')]
#[Cache(smaxage: 10)]
public function userIndex(Request $request,int $page,EntityManagerInterface $entityManager,UserRepository $usersRepository): Response
{
$params = $request->query->all();
$filter = [];
$filterForm = $this->createForm(ManageUsersFilter::class);
if(isset($params['name'])) {
$filterForm['name']->setData($params['name']);
$filter['name'] = $params['name'];
}
if(isset($params['email'])) {
$filterForm['email']->setData($params['email']);
$filter['email'] = $params['email'];
}
if(isset($params['phone'])) {
$filterForm['phone']->setData($params['phone']);
$filter['phone'] = $params['phone'];
}
if(isset($params['role'])) {
$filterForm['role']->setData($params['role']);
$filter['role'] = $params['role'];
}
$data = $usersRepository->adminPaginatorFetchAll($page, $filter);
return $this->render('manage-users/index.html.twig', [
'paginator' => $data,
'filter' => $filter,
'form' => $filterForm->createView(),
]);
}
#[Route('/edit-user/{id}', name: 'edit_user', methods: ['GET', 'POST'])]
public function editUser($id,Request $request, EntityManagerInterface $entityManager, UserRepository $usersRepository, User $user){
$form = $this->createForm(UserForm::class, $user);
$form->handleRequest($request);
if($request->getMethod() == 'POST' ){
$email = $form->get('email')->getData();
$first_name = $form->get('first_name')->getData();
$last_name = $form->get('last_name')->getData();
$emailExist = $usersRepository->loadUserByEmailIdentifier($email,$id);
if($emailExist) {
return $this->renderForm('manage-users/edit-user.html.twig', [
'form' => $form,
'user'=> $user,
'errors' => "This email address already exist"
]);
}
else{
if ($form->isSubmitted() && $form->isValid()) {
$userProfile = $entityManager->getRepository(\App\Entity\UserProfiles::class)->find($id);
if($first_name || $last_name){
$userProfile->setFirstName($first_name);
$userProfile->setLastName($last_name);
$user->setName($first_name);
$entityManager->persist($userProfile);
}
$entityManager->persist($user);
$entityManager->flush();
$this->addFlash('success', 'Update successfully.');
return $this->redirectToRoute('manage_users_index', [], Response::HTTP_SEE_OTHER);
}
}
}
return $this->renderForm('manage-users/edit-user.html.twig', [
'form' => $form,
'user'=>$user,
'errors' => ""
]);
}
#[Route('/edit-user-billing-detail/{id}', name: 'edit_user_billing_detail', methods: ['GET', 'POST'])]
public function editUserBiilingDetails(Request $request, EntityManagerInterface $entityManager, UserRepository $usersRepository, UserProfiles $userProfiles, CountriesRepository $countriesRepository){
$form = $this->createForm(UserBillingForm::class, $userProfiles);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$entityManager->persist($userProfiles);
$entityManager->flush();
$this->addFlash('success', 'Update successfully.');
return $this->redirectToRoute('manage_users_index', [], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('manage-users/edit-user-billing-detail.html.twig', [
'form' => $form,
'user_profiles'=>$userProfiles,
]);
}
#[Route('/delete-user/{id}', name: 'delete_user', methods: ['POST','GET'])]
public function deleteUser(Request $request, EntityManagerInterface $entityManager, User $user): Response
{
if ($this->isCsrfTokenValid('delete'.$user->getUserId(), $request->request->get('_token'))) {
if($request->isMethod('POST')){
$user->setIsDeleted(1);
$entityManager->persist($user);
$entityManager->flush();
$this->addFlash('error', 'Delete successfully.');
if($request->request->get('redirect_page')){
return $this->redirectToRoute('manage_users_index_paginated', ['page'=> $request->request->get('redirect_page')], Response::HTTP_SEE_OTHER);
}
return $this->redirectToRoute('manage_users_index', [], Response::HTTP_SEE_OTHER);
}
}
return $this->renderForm('manage-users/_delete_form.html.twig', [
'user' => $user,
'redirect_page' => $request->query->get('redirect_page')
]);
}
#[Route('/view/{id}', name: 'manage_users_view', methods: ['GET'])]
public function userview($id,EntityManagerInterface $entityManager,User $user): Response
{
$query = $entityManager->getRepository(\App\Entity\UserCrmRelationships::class)->createQueryBuilder('cm')
->andWhere('cm.userId = :userId')
->setParameter('userId', $id);
$companies = $query->getQuery()->getResult();
$loginHistories = $entityManager->getRepository(\App\Entity\UserOauths::class)->createQueryBuilder('cm')
->andWhere('cm.userId = :userId')
->setParameter('userId', $id)
->setMaxResults(10)
->orderBy('cm.createdAt','DESC')
->getQuery()->getResult();
$totalCount = $entityManager->getRepository(\App\Entity\UserOauths::class)->createQueryBuilder('cm')
->select('COUNT(cm.oauthId)')
->andWhere('cm.userId = :userId')
->setParameter('userId', $id)
->getQuery()
->getSingleScalarResult();
if($loginHistories){
foreach($loginHistories as $histories){
$histories->setAccessToken('');
}
}
return $this->render('manage-users/view.html.twig', [
'user' => $user,
'companies' => $companies,
'loginHistories' => $loginHistories,
'totalCount' => $totalCount,
]);
}
#[Route('/disable-user/{id}', name: 'disable_user', methods: ['POST','GET'])]
public function disableUser(Request $request, EntityManagerInterface $entityManager, User $user): Response
{
if ($this->isCsrfTokenValid('disable'.$user->getUserId(), $request->request->get('_token'))) {
if($request->isMethod('POST')){
$user->setIsActive(0);
$entityManager->persist($user);
$entityManager->flush();
$this->addFlash('error', 'Disable successfully.');
if($request->request->get('redirect_page')){
return $this->redirectToRoute('manage_users_index_paginated', ['page'=> $request->request->get('redirect_page')], Response::HTTP_SEE_OTHER);
}
return $this->redirectToRoute('manage_users_index', [], Response::HTTP_SEE_OTHER);
}
}
return $this->renderForm('manage-users/_disable.html.twig', [
'user' => $user,
'redirect_page' => $request->query->get('redirect_page')
]);
}
#[Route('/enable-user/{id}', name: 'enable_user', methods: ['POST','GET'])]
public function enableUser(Request $request, EntityManagerInterface $entityManager, User $user): Response
{
if ($this->isCsrfTokenValid('enable'.$user->getUserId(), $request->request->get('_token'))) {
if($request->isMethod('POST')){
$user->setIsActive(1);
$entityManager->persist($user);
$entityManager->flush();
$this->addFlash('success', 'Enable successfully.');
if($request->request->get('redirect_page')){
return $this->redirectToRoute('manage_users_index_paginated', ['page'=> $request->request->get('redirect_page')], Response::HTTP_SEE_OTHER);
}
return $this->redirectToRoute('manage_users_index', [], Response::HTTP_SEE_OTHER);
}
}
return $this->renderForm('manage-users/_enable.html.twig', [
'user' => $user,
'redirect_page' => $request->query->get('redirect_page')
]);
}
#[Route('/delete-login/{id}', name: 'delete_login_devices', methods: ['POST','GET'])]
public function deleteLogin($id, Request $request, EntityManagerInterface $entityManager, User $user): Response
{
if ($this->isCsrfTokenValid('delete_login_devices'.$user->getUserId(), $request->request->get('_token'))) {
if($request->isMethod('POST')){
$userOauths = $entityManager->getRepository(\App\Entity\UserOauths::class)->createQueryBuilder('cm')
->andWhere('cm.userId = :userId')
->setParameter('userId', $id)
->getQuery()->getResult();
if($userOauths){
foreach($userOauths as $oathIds){
$entityManager->remove($oathIds);
$entityManager->flush();
}
}
$this->addFlash('error', 'Logout form all devices successfully.');
return $this->redirectToRoute('manage_users_view', ['id'=> $id], Response::HTTP_SEE_OTHER);
}
}
return $this->renderForm('manage-users/delete_login_devices.html.twig', [
'user' => $user,
'redirect_page' => $request->query->get('redirect_page')
]);
}
#[Route('/user/logout-device/{id}/{uid}', name: 'logout_device', methods: ['POST','GET'])]
public function logoutDevice($id, $uid, Request $request, EntityManagerInterface $entityManager): Response
{
if ($this->isCsrfTokenValid('logout_device'.$id, $request->request->get('_token'))) {
if($request->isMethod('POST')){
$userOauths = $entityManager->getRepository(\App\Entity\UserOauths::class)->find($id);
if($userOauths){
$entityManager->remove($userOauths);
$entityManager->flush();
}
$this->addFlash('error', 'Logout form this device successfully.');
return $this->redirectToRoute('manage_users_view', ['id'=> $uid], Response::HTTP_SEE_OTHER);
}
}
return $this->renderForm('manage-users/logout_device.html.twig', [
'uid' => $uid,
'dId' => $id,
'redirect_page' => $request->query->get('redirect_page')
]);
}
}