<?php
namespace App\Controller;
use App\Entity\Security\ServiceSession;
use App\Entity\SMS;
use App\Entity\User\User;
use App\Repository\User\UserRepository;
use App\Services\Helpers\MattermostHelper;
use App\Services\Security\ServiceSessionService;
use Doctrine\ORM\EntityManagerInterface;
use Lexik\Bundle\JWTAuthenticationBundle\Services\JWTTokenManagerInterface;
use Psr\Log\LoggerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Notifier\Bridge\Slack\Block\SlackActionsBlock;
use Symfony\Component\Notifier\Bridge\Slack\Block\SlackDividerBlock;
use Symfony\Component\Notifier\Bridge\Slack\Block\SlackImageBlockElement;
use Symfony\Component\Notifier\Bridge\Slack\Block\SlackSectionBlock;
use Symfony\Component\Notifier\Bridge\Slack\SlackOptions;
use Symfony\Component\Notifier\ChatterInterface;
use Symfony\Component\Notifier\Exception\TransportExceptionInterface;
use Symfony\Component\Notifier\Message\ChatMessage;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
class SecurityController extends AbstractController
{
public function __construct(
public ChatterInterface $chatter1,
public EntityManagerInterface $em,
public UserRepository $userRepository,
public ServiceSessionService $sessionService,
public JWTTokenManagerInterface $jwtManager,
public MattermostHelper $mattermostHelper,
public LoggerInterface $logger,
)
{
}
/**
* @throws \Doctrine\ORM\NonUniqueResultException
*/
#[Route('/login', name: 'app_email_user')]
public function login(Request $request): Response
{
match (true) {
$request->get('redirecturl') !== null => $redirectUrl = $request->get('redirecturl'),
default => $redirectUrl = null,
};
if (null !== $this->getUser() ) {
$session = $this->em->getRepository(ServiceSession::class)->findOneBy(
[
'userId' => $this->getUser(),
'active' => true
]);
if (empty($session)) {
$session = $this->sessionService->createSession($this->getUser(), $request);
$this->em->persist($session);
$this->em->flush();
}
$authToken = $this->jwtManager->create($this->getUser());
$sessionAuth = $request->getSession();
$sessionAuth->set('auth_token', $authToken);
$sessionAuth->set('token', $session->getToken());
if ($request->get('redirecturl') !== null) {
return new RedirectResponse($request->get('redirecturl') . '?token=' . $session->getToken() . '&auth_token=' . $authToken);
}
$this->logger->info('AuthToken', [$authToken]);
return $this->redirectToRoute('main');
}
if (!empty($request->query->get('error'))) {
return $this->render('security/login.html.twig',
[
'identity' => $request->get('identity'),
'redirectUrl' => $redirectUrl,
'error' => $request->query->get('error')
]);
}
return $this->render('security/login.html.twig',
[
'redirectUrl' => $redirectUrl,
]);
}
/**
* @param Request $request
* @param AuthenticationUtils $authenticationUtils
*/
#[Route('/login/accept', name: 'app_login')]
public function acceptLogin(
Request $request,
AuthenticationUtils $authenticationUtils
)
{
// if ($this->getUser()) {
// return $this->redirectToRoute('target_path');
// }
// get the login error if there is one
$error = $authenticationUtils->getLastAuthenticationError();
// last username entered by the user
$lastUsername = $authenticationUtils->getLastUsername();
}
#[Route('/logout', name: 'app_logout')]
public function logout(): void
{
throw new \LogicException('This method can be blank - it will be intercepted by the logout key on your firewall.');
}
#[Route('/user/check', name: 'user_check')]
public function checkUser(Request $request): Response
{
if (null !== $this->getUser() && $request->get('redirecturl') !== null) {
$session = $this->em->getRepository(ServiceSession::class)->findOneBy(
[
'userId' => $this->getUser()->getId(),
'active' => true
]);
if (empty($session)) {
$session = $this->sessionService->createSession($this->getUser(), $request);
$this->em->persist($session);
$this->em->flush();
}
return new RedirectResponse($request->get('redirecturl') . '?token=' . $session->getToken());
}
return $this->redirectToRoute('app_login');
}
}