<?php
namespace App\Controller\Frontend;
use App\Entity\Media\Cart;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use App\Entity\ThirdParty\ThirdParty;
use App\Entity\ThirdParty\Address;
use App\Entity\User\User;
use App\Entity\ThirdParty\Type;
use App\Entity\User\Group;
use App\Form\ThirdParty\RegisterType;
use Symfony\Component\HttpFoundation\Request;
use App\Form\User\CheckRegisterType;
use Symfony\Component\Validator\Validator\ValidatorInterface;
use Symfony\Component\Validator\Constraints\Email as EmailConstraint;
use Symfony\Component\Validator\Constraints\NotBlank;
use App\Entity\Site\AccessSite;
use App\Entity\Federation\Race;
use App\Entity\Federation\Boat;
use App\Form\Site\RegisterAccessSiteType;
use App\Form\Site\AccessSiteComplementType;
use App\Entity\Federation\Participation;
use App\Entity\Media\Document;
use App\Entity\Media\DocumentType;
use App\Service\Site\SiteManager;
use App\Service\Email\EmailManager;
use Symfony\Component\Security\Core\Security;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
use App\Entity\Media\Quality;
class FrontendController extends AbstractController
{
public function indexAction(Security $security, SiteManager $site)
{
$documentsProofs = $lastMovies = $lastPictures = $lastSounds = $lastDocuments = array();
$em = $this->getDoctrine()->getManager();
$race = $site->getCurrentSite()->getRace();
$user = $security->getUser();
$accessSite = $site->userAccessSite($user);
$access = $site->userAccessSite($user);
foreach($user->getParticipations() as $participation)
{
if($participation->getRace()->getId() == $race->getId())
{
$participationDocumentsProof = $em->getRepository(Document::class)->getDocumentsProof($race, $participation->getBoat(), $participation->getSkipper());
foreach($participationDocumentsProof as $participationDocumentProof)
if(!in_array($participationDocumentProof, $documentsProofs))
array_push($documentsProofs, $participationDocumentProof);
}
}
$movies = $em->getRepository(DocumentType::class)->findOneByDirectoryName('movies');
if ($race->getDocumentTypes()->contains($movies) && $accessSite->getDocumentTypes()->contains($movies))
{
$lastMovies = $this->getDoctrine()
->getManager()
->getRepository(Document::class)
->getFrontAccessDocuments(null, null, $movies, false, $race, $accessSite->getCategories(), [], [], [], null, null, 15);
}
$pictures = $em->getRepository(DocumentType::class)->findOneByDirectoryName('pictures');
if ($race->getDocumentTypes()->contains($pictures) && $accessSite->getDocumentTypes()->contains($pictures))
{
$lastPictures = $this->getDoctrine()
->getManager()
->getRepository(Document::class)
->getFrontAccessDocuments(null, null, $pictures, false, $race, $accessSite->getCategories(), [], [], [], null, null, 15);
}
$sounds = $em->getRepository(DocumentType::class)->findOneByDirectoryName('sounds');
if ($race->getDocumentTypes()->contains($sounds) && $accessSite->getDocumentTypes()->contains($sounds))
{
$lastSounds = $this->getDoctrine()
->getManager()
->getRepository(Document::class)
->getFrontAccessDocuments(null, null, $sounds, false, $race, $accessSite->getCategories(), [], [], [], null, null, 15);
}
$documents = $em->getRepository(DocumentType::class)->findOneByDirectoryName('documents');
if ($race->getDocumentTypes()->contains($documents) && $accessSite->getDocumentTypes()->contains($documents))
{
$lastDocuments = $this->getDoctrine()
->getManager()
->getRepository(Document::class)
->getFrontAccessDocuments(null, null, $documents, false, $race, $accessSite->getCategories(), [], [], [], null, null, 15);
}
return $this->render('Frontend/Views/index.html.twig', array(
'documentsProofs' => $documentsProofs,
'lastMovies' => $lastMovies,
'lastPictures' => $lastPictures,
'lastSounds' => $lastSounds,
'lastDocuments' => $lastDocuments,
'accessSite' => $accessSite,
'cart' => $em->getRepository(Cart::class)->findOneByAccessSite($access)
));
}
public function loadCheckRegisterFormAction()
{
$form = $this->createForm(CheckRegisterType::class, null, array(
'action' => $this->generateUrl('auth_security_check_register'),
));
return $this->render('Frontend/Views/User/check_register_form.html.twig', array(
'form' => $form->createView()
));
}
public function checkRegisterAction(Request $request, SiteManager $site, ValidatorInterface $validator, TranslatorInterface $translator)
{
$em = $this->getDoctrine()->getManager();
$form = $this->createForm(CheckRegisterType::class);
$form->handleRequest($request);
$errors = $validator->validate(
$form['email']->getData(),
array(new NotBlank(), new EmailConstraint())
);
if ($form->isSubmitted()) {
if($errors->count() == 0){
// 1 - Check if user is already subsribe on the application
$user = $em->getRepository(User::class)->findOneByEmail($form['email']->getData());
if($user)
{
// 2 - Check if user is not already registered
$access = $site->userAccessSite($user);
if($access)
{
$request->getSession()->getFlashBag()->add('error', $translator->trans('auth.register.already_allowed'));
return $this->redirectToRoute('frontend_homepage');
} else {
return $this->redirectToRoute('auth_security_register_race', array('user' => $user->getId()));
}
}
} else {
foreach ($errors as $violation)
$messages[] = $violation->getMessage();
$request->getSession()->getFlashBag()->add('error', implode(", ", $messages));
return $this->redirectToRoute('frontend_homepage');
}
}
return $this->redirectToRoute('auth_security_register', array('email' => $form['email']->getData()));
}
public function registerAction(Request $request, string $email = null, UserPasswordHasherInterface $passwordHasher)
{
$em = $this->getDoctrine()->getManager();
$thirdParty = new ThirdParty();
$address = new Address();
$user = new User();
$type = $em->getRepository(Type::class)->find(1);
$defaultGroup = $em->getRepository(Group::class)->find(2);
/* Default values */
$user->addGroup($defaultGroup);
$user->setEmail($email);
$address->setThirdParty($thirdParty);
$thirdParty->setType($type);
$thirdParty->setMainAddress($address);
$thirdParty->addAddress($address);
$thirdParty->addUser($user);
$form = $this->createForm(RegisterType::class, $thirdParty, array('em' => $em));
$form->handleRequest($request);
if ($form->isSubmitted()) {
if($form->isValid()){
$user->setPassword($passwordHasher->hashPassword($user, $user->getPassword()));
$em->persist($thirdParty);
$em->flush();
return $this->redirectToRoute('auth_security_register_race', array('user' => $thirdParty->getUsers()[0]->getId()));
}
}
return $this->render('Frontend/Views/User/register.html.twig', array(
'thirdParty' => $thirdParty,
'form' => $form->createView()
));
}
public function registerRaceAction(Request $request, User $user, SiteManager $siteManager, TranslatorInterface $translator)
{
$em = $this->getDoctrine()->getManager();
$site = $siteManager->getCurrentSite();
$access = $siteManager->userAccessSite($user);
if($access)
{
$request->getSession()->getFlashBag()->add('error', $translator->trans('auth.register.already_allowed'));
return $this->redirectToRoute('frontend_homepage');
}
$accessSite = new AccessSite();
$accessSite->setSite($site);
$accessSite->setUser($user);
$accessSite->setStatus(1);
if(sizeof($site->getRace()->getDocumentTypes()) == 1)
{
$documentType = $site->getRace()->getDocumentTypes()[0];
$accessSite->addDocumentType($documentType);
}
if(!$site->getRace()->allowUploadPicture())
{
$quality = $em->getRepository(Quality::class)->findOneByCode('BD');
$accessSite->addQuality($quality);
}
$form = $this->createForm(RegisterAccessSiteType::class, $accessSite, array(
'documentTypesChoices' => $site->getRace()->getDocumentTypes(),
'race' => $site->getRace()
));
$form->handleRequest($request);
if ($form->isSubmitted()) {
$access = $siteManager->userAccessSite($user);
if($access)
{
$request->getSession()->getFlashBag()->add('error', $translator->trans('auth.register.already_allowed'));
return $this->redirectToRoute('frontend_homepage');
}
if($form->isValid()){
if(!empty($accessSite->getBoats()) && $accessSite->getBoats()->count() > 0)
{
$complement = $this->getAssociationParticipationDatas($site->getRace(), $accessSite->getBoats());
$accessSite->addSkipper($complement['skipper']);
$accessSite->addClass($complement['classe']);
}
$em->persist($accessSite);
$em->flush();
return $this->redirectToRoute('auth_security_register_race_validation', array('accessSite' => $accessSite->getId()));
}
}
return $this->render('Frontend/Views/User/registerRace.html.twig', array(
'site' => $site,
'user' => $user,
'form' => $form->createView()
));
}
public function getAssociationParticipationDatas(Race $race, $boats = null)
{
$datas = [];
$em = $this->getDoctrine()->getManager();
if(!empty($boats))
{
foreach($boats as $id)
{
$boat = $em->getRepository(Boat::class)->find($id);
if(!empty($boat))
{
$participation = $em->getRepository(Participation::class)->findOneBy(['status' => 1, 'race' => $race, 'boat' => $boat]);
if(!empty($participation))
{
$datas['skipper'] = $participation->getSkipper();
$datas['classe'] = $boat->getClasse();
}
}
}
}
return $datas;
}
public function registerRaceValidationAction(Request $request, AccessSite $accessSite, TranslatorInterface $translator, EmailManager $emailManager)
{
$form = $this->createForm(AccessSiteComplementType::class, $accessSite);
$form->handleRequest($request);
if ($form->isSubmitted()) {
$em = $this->getDoctrine()->getManager();
$em->flush();
$request->getSession()->getFlashBag()->add('error', $translator->trans('auth.register.complementSave'));
$datas = array(
'accessSite' => $accessSite,
'locale' => $accessSite->getUser()->getLanguage()
);
if($accessSite->getStatus() == 3)
if($accessSite->getSite() && $accessSite->getSite()->getRace())
foreach($accessSite->getSite()->getRace()->getContacts() as $contact)
if($contact['subscribeAlert'] && $contact['email'])
$emailManager->sendContactMessage($contact['email'], 'admin-register', $datas, null, $accessSite->getSite());
}
return $this->render('Frontend/Views/User/registerRaceValidation.html.twig', array(
'accessSite' => $accessSite,
'form' => $form->createView()
));
}
}