Get login working

This commit is contained in:
2024-11-28 11:37:56 -05:00
parent 17b399aa3f
commit 2656d93208
18 changed files with 1577 additions and 15 deletions

View File

@ -0,0 +1,30 @@
<?php
namespace App\Controller;
use App\Entity\User;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Http\Attribute\CurrentUser;
class DefaultController extends AbstractController
{
#[Route('/dashboard', name: 'app_dashboard')]
public function dashboard(Request $request, #[CurrentUser()] ?User $user): Response
{
$this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
if (!$user->getCompany()) {
return $this->redirectToRoute('app_register_step', ['step' => RegistrationController::REGISTER_STEP_TWO]);
}
return $this->render(
'internal/dashboard.html.twig',
[
'user' => $user
]
);
}
}

View File

@ -0,0 +1,157 @@
<?php
namespace App\Controller;
use App\DataTransferObject\CompanyDetailsDto;
use App\Entity\User;
use App\Enums\CaseLevel;
use App\Enums\JobType;
use App\Enums\RateType;
use App\Factory\CompanyFactory;
use App\Form\CompanyFormType;
use App\Form\RegistrationFormType;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Security\Http\Authentication\UserAuthenticatorInterface;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Component\Routing\Attribute\Route;
use Symfony\Component\Security\Http\Attribute\CurrentUser;
class RegistrationController extends AbstractController
{
public const REGISTER_STEP_ONE = 'admin';
public const REGISTER_STEP_TWO = 'company';
public function __construct(
private readonly CompanyFactory $companyFactory,
private readonly RequestStack $requestStack,
private readonly EntityManagerInterface $entityManager,
private readonly UserPasswordHasherInterface $userPasswordHasher,
private readonly UserAuthenticatorInterface $userAuthenticator
) {
}
#[Route('/register/{step}', name: 'app_register_step')]
public function registerStep(string $step, Request $request, #[CurrentUser] ?User $user): Response
{
$form = match($step) {
self::REGISTER_STEP_ONE => $this->createForm(RegistrationFormType::class),
self::REGISTER_STEP_TWO => $this->renderRegisterStepTwo(),
default => $this->redirectToRoute('app_register_step', ['step' => self::REGISTER_STEP_ONE]),
};
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
return match(true) {
$step === self::REGISTER_STEP_ONE => $this->handleRegisterStepOne($form, $request),
$step === self::REGISTER_STEP_TWO => $this->handleRegisterStepTwo($form, $user),
default => $this->redirectToRoute('app_register_step', ['step' => self::REGISTER_STEP_ONE]),
};
}
return $this->render(sprintf('registration/register-step-%s.html.twig', $step), [
'form' => $form,
'data' => $form->getData(),
'admin' => $user
]);
}
private function handleRegisterStepOne(FormInterface $form, Request $request): Response
{
$user = new User();
$form = $this->createForm(RegistrationFormType::class, $user);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
// @var string $plainPassword
$plainPassword = $form->get('plainPassword')->getData();
// encode the plain password
$user->setPassword(
$this->userPasswordHasher->hashPassword(
$user,
$plainPassword
)
);
$user->setJob(JobType::ADMIN);
$user->setRateType(RateType::FIXED);
$user->setRate('0.00');
$user->setRoles(['ROLE_ADMIN']);
$user->setLevel(CaseLevel::ADMIN);
// save user
$this->entityManager->persist($user);
$this->entityManager->flush();
return $this->redirectToRoute('app_dashboard');
}
return $this->redirectToRoute('app_register_step', ['step' => self::REGISTER_STEP_ONE]);
}
private function renderRegisterStepTwo(): FormInterface
{
$company = $this->requestStack->getSession()->get('register-form-step-two');
if (!$company instanceof CompanyDetailsDto) {
$company = new CompanyDetailsDto();
}
return $this->createForm(CompanyFormType::class, $company);
}
private function handleRegisterStepTwo(FormInterface $form, User $owner): Response
{
$company = $this->companyFactory->create($form->getData(), $owner);
$owner->setCompany($company);
$this->entityManager->persist($owner);
$this->entityManager->persist($company);
$this->entityManager->flush();
return $this->redirectToRoute('app_dashboard');
}
#[Route('/new-user', name: 'app_new_user')]
public function newUser(Request $request): Response
{
return $this->render('registration/new-user.html.twig');
}
#[Route('/add-user', name: 'app_add_user')]
public function addUser(Request $request, UserPasswordHasherInterface $userPasswordHasher, EntityManagerInterface $entityManager): Response
{
$user = new User();
$user->setUsername('new-user');
$user->setEmail('g6eK1@example.com');
$user->setName('New User');
$user->setPassword(
$this->userPasswordHasher->hashPassword(
$user,
'password'
)
);
$user->setJob(JobType::ADMIN);
$user->setRateType(RateType::FIXED);
$user->setRate('0.00');
$entityManager->persist($user);
$entityManager->flush();
return $this->redirectToRoute('dashboard');
}
#[Route('/register', name: 'app_register')]
public function register(): Response
{
return $this->redirectToRoute('app_register_step', ['step' => self::REGISTER_STEP_ONE]);
}
}

View File

@ -0,0 +1,34 @@
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
class SecurityController extends AbstractController
{
#[Route(path: '/', name: 'app_login')]
public function login(AuthenticationUtils $authenticationUtils): Response
{
if ($this->isGranted('IS_AUTHENTICATED_FULLY')) {
return $this->redirectToRoute('app_dashboard');
}
// get the login error if there is one
$error = $authenticationUtils->getLastAuthenticationError();
// last username entered by the user
$lastUsername = $authenticationUtils->getLastUsername();
return $this->render('security/login.html.twig', [
'last_username' => $lastUsername,
'error' => $error,
]);
}
#[Route(path: '/logout', name: 'app_logout')]
public function logout(): void
{
}
}