<?php
namespace App\Controller\Webmaster;
use App\EventSubscriber\WebmasterReferenceRequestSubscriber;
use App\Form\Webmaster\SignupForm;
use App\Form\WebmasterLogin;
use App\Security\ApiUser;
use App\Service\Client\User\AccountService;
use App\Service\Client\User\WebmasterService;
use DomainException;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Security;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
/**
* @Route("/webmaster")
*/
class SecurityController extends AbstractController
{
/**
* @var WebmasterService
*/
protected WebmasterService $service;
/**
* @var AccountService
*/
protected AccountService $accountService;
/**
* @param WebmasterService $service
* @param AccountService $accountService
*/
public function __construct(WebmasterService $service, AccountService $accountService, protected Security $security)
{
$this->service = $service;
$this->accountService = $accountService;
}
/**
* @Route("/join")
* @Template()
* @param Request $request
* @return array|RedirectResponse
* @throws \Symfony\Contracts\HttpClient\Exception\ClientExceptionInterface
* @throws \Symfony\Contracts\HttpClient\Exception\RedirectionExceptionInterface
* @throws \Symfony\Contracts\HttpClient\Exception\ServerExceptionInterface
* @throws \Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface
*/
public function join(Request $request)
{
// go to dashboard, if we are already logged in as a webmaster
if ($this->isGranted('ROLE_WEBMASTER')) {
return $this->redirectToRoute('app_webmaster_dashboard_index');
}
$form = $this->createForm(SignupForm::class, [], []);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$data = $form->getData();
$specs = [
'email' => $data['email'],
'plaintextPassword' => $data['password'],
'channel' => 'webmaster',
"remote_ip" => $request->headers->get('X-Real-IP', $_SERVER["REMOTE_ADDR"]),
];
$session = $request->getSession();
if($session->has(WebmasterReferenceRequestSubscriber::SESSION_KEY)) {
$wmRef = $session->get(WebmasterReferenceRequestSubscriber::SESSION_KEY);
$specs['advertised_by_webmaster'] = $wmRef['webmaster_id'] ?? 0;
$specs['advertised_by_tracking_id'] = $wmRef['tracking_id'] ?? '';
$specs['advertised_by_campaign_id'] = $wmRef['campaign_id'] ?? 0;
}
try {
// try to find any existing user
$account = null;
if($this->security->getUser() !== null) {
$account = [
"id" => $this->security->getUser()->getAccountId()
];
}
if($account === null) {
// brand new user! try to register him
$account = $this->accountService->createRegistration($specs);
}
$wmSpecs = [
'person' => $data['person'],
'address' => $data['address']
];
if($wm = $this->service->createWebmasterForAccount($account['id'], $wmSpecs)) {
$session->set('registrationEmail', $specs['email']);
$session->save();
$this->addFlash('success', 'Wir haben Dir eine E-Mail geschickt.');
}
return $this->redirectToRoute('app_security_registrationconfirm');
}
catch(DomainException $e) {
$this->addFlash('error', $e->getMessage());
}
}
return [
'form' => $form->createView(),
];
}
/**
* @Template()
* @return array
*/
public function widget(): array
{
$form = $this->createForm(WebmasterLogin::class, null, [
'action' => $this->generateUrl('webmasterlogin'),
'attr' => [
'class' => 'd-none d-md-flex form-inline'
]
]);
return [
'form' => $form->createView(),
];
}
/**
* @Route("/security/login", name="webmasterlogin")
* @Template()
*
* @param AuthenticationUtils $authenticationUtils
* @param Request $request
*
* @return array|\Symfony\Component\HttpFoundation\RedirectResponse
*/
public function webmasterlogin(AuthenticationUtils $authenticationUtils, Request $request)
{
$form = $this->createForm(WebmasterLogin::class, null, [
'action' => $this->generateUrl('webmasterlogin'),
]);
$form->handleRequest($request);
$user = $this->getUser();
if ($user instanceof ApiUser && $user->getApiToken()) {
return $this->redirectToRoute('app_webmaster_dashboard_news');
}
return [
'error' => $authenticationUtils->getLastAuthenticationError(),
'form' => $form->createView(),
];
}
}