<?php
namespace App\Controller;
use App\Service\Email;
use Vimeo\Vimeo;
use App\Entity\City;
use App\Entity\Job;
use App\Entity\User;
use App\Form\SearchType;
use App\Entity\Newsletter;
use App\Form\NewsletterType;
use App\Form\SearchHomeType;
use App\Repository\JobRepository;
use App\Repository\CityRepository;
use App\Repository\UserRepository;
use App\Repository\SchoolRepository;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
class HomeController extends AbstractController
{
/**
* @Route("/user/set/password", name="user_set_password")
*/
public function userSetPassword(Request $request, UserPasswordEncoderInterface $encoder) {
$entityManager = $this->getDoctrine()->getManager();
$user = $this->getDoctrine()->getRepository(User::class)->findOneById(390);
$hashPassword = $encoder->encodePassword($user, 'audeCeleritup');
$user->setPassword($hashPassword);
$entityManager->persist($user);
$entityManager->flash();
die();
}
/**
* @Route("/users/relanch", name="users_relanch")
*/
public function relaunch(UserRepository $repository, Request $request){
$offset = 30 * 3600 * 24;
$entityManager = $this->getDoctrine()->getManager();
// If user subscription will be end less 30 days
// And
$users = $this->getDoctrine()->getRepository(User::class)->createQueryBuilder('u')
->where('u.subscription_end < :subscriptionEnd')
->andWhere('u.subscriptionRelaunch < :subscriptionRelaunch')
->andWhere('u.subscriptionCancel = :subscriptionCancel')
->andWhere('u.subscriptionAutoEnable = :subscriptionAutoEnable')
->setParameter('subscriptionEnd', time() + $offset)
->setParameter('subscriptionRelaunch', time() - $offset)
->setParameter('subscriptionCancel', false)
->setParameter('subscriptionAutoEnable', true)
->getQuery()
->getResult();
foreach ($users as $user) {
if($user->getSubscriptionAutoEnable()){
if($_ENV['APP_ENV'] == 'prod'){
$to = $user;
} else {
$to = [
'Email' => 'romain@meduza-agency.com',
'Name' => 'Duflot Romain'
];
}
// -> Send email
$email = Email::send($to, "SUBSCRIPTION_RENEW", "Renouvellement de votre abonnement", [
'fullName' => $user->getFullName(),
'date' => date('d/m/Y', $user->getSubscriptionEnd()),
'url' => $this->generateUrl('subscribe_renew', ['token' => $user->getToken()], UrlGeneratorInterface::ABSOLUTE_URL),
'url_cancel' => $this->generateUrl('subscription_cancel', ['id' => $user->getId(), 'token' => $user->getToken()], UrlGeneratorInterface::ABSOLUTE_URL)
]);
} else {
if($_ENV['APP_ENV'] == 'prod'){
$to = $user;
} else {
$to = [
'Email' => 'romain@meduza-agency.com',
'Name' => 'Duflot Romain'
];
}
$to = [
'Email' => 'romain@meduza-agency.com',
'Name' => 'Duflot Romain'
];
// -> Send email
$email = Email::send($to, "SUBSCRIPTION_END", "Votre adhésion se termine", [
'fullName' => $user->getFullName(),
'date' => date('d/m/Y', $user->getSubscriptionEnd()),
'url' => $this->generateUrl('home', [], UrlGeneratorInterface::ABSOLUTE_URL)
]);
}
$user->setSubscriptionRelaunch(time());
$entityManager->persist($user);
$entityManager->flush();
}
die();
/*
dump($users);
die();
*/
}
/**
* Affiche la homepage
*
* @Route("/", name="home")
*/
public function index(Request $request, SessionInterface $session, CityRepository $city, JobRepository $job, UserPasswordEncoderInterface $encoder)
{
/*
$client = new Vimeo("{client_id}", "386b2da3d8c07f9b5ee657689741aeb49478f194", "be6385abac50e4f20e83069067f6ef38");
$response = $client->request('/tutorial', array(), 'GET');
print_r($response);
die();
*/
/*
$entityManager = $this->getDoctrine()->getManager();
$user = $this->getDoctrine()->getRepository(User::class)->findOneById(390);
$password = $encoder->encodePassword($user,'audeCeleritup');
$user->setPassword($password);
$entityManager->persist($user);
$entityManager->flush();
*/
$user = $this->getUser();
$jobs = $job->findAll();
$time = new \Datetime();
if(isset($user)){
if($user->getSubscription() <= $time){
$user->setActif(0);
$manager = $this->getDoctrine()->getManager();
$manager->persist($user);
$manager->flush();
}else{
$user->setActif(1);
$manager = $this->getDoctrine()->getManager();
$manager->persist($user);
$manager->flush();
}
}
$query = [];
$form2 = $this->createForm(SearchHomeType::class, $query, ['method' => 'POST']);
// ->Reads the request and extracts the data from the form
// *******************************************************
$form2->handleRequest($request);
// -> Initialize a result array
// ****************************
$result = [];
$result_nearest = [];
$random_users = [];
if ($form2->isSubmitted() && $form2->isValid()) {
// -> extract and recover the data into variable
// *********************************************
extract($form2->getData());
if($job && empty($city)){
return $this->redirectToRoute('job', ['slug' => $job->getSlug()]);
}
if($city && empty($job)){
return $this->redirectToRoute('city', ['slug' => $city->getSlug()]);
}
if($city && $job){
$user = $this->getDoctrine()->getRepository(User::class)->findOneBy([
'city' => $city,
'job' => $job
]);
if($user){
return $this->redirectToRoute('fiche_index', ['city_slug' => $city->getSlug(),'user_slug' => $user->getSlug()]);
}
}
// -> Get param category id in query url geolocalisation
$latlng = $request->query->get('latlng');
if($latlng) {
$values = explode(',',$latlng);
$lat = $values[0];
$lng = $values[1];
$city = null;
$result = $this->getDoctrine()->getRepository(User::class)->searchUsers($job, $city);
$results = [];
foreach($result as $user) {
$userlat = $user->getCity()->getLat();
$userlng = $user->getCity()->getLng();
$theta = $userlng - $lng;
$dist = sin(deg2rad($lat)) * sin(deg2rad($userlat)) + cos(deg2rad($lat)) * cos(deg2rad($userlat)) * cos(deg2rad($theta));
$dist = acos($dist);
$dist = rad2deg($dist);
// -> Convert to miles
$miles = $dist * 60 * 1.1515;
// -> Convert to km
$distance = ($miles * 1.609344);
// -> Push each result in array
array_push($results, [$user, 'distance' => $distance]);
}
// -> Sort results by ASC
usort($results, function($a, $b) {
return $a['distance'] <=> $b['distance'];
});
$result = [];
foreach ($results as $user) {
array_push($result, $user[0]);
}
}else{
$result = $this->getDoctrine()->getRepository(User::class)->searchUsers($job, $city);
// shuffle($result);
if(!$result && $city){
$results_nearest_users = $this->getDoctrine()->getRepository(User::class)->searchUsers($job, null);
$lat = $city->getLat();
$lng = $city->getLng();
$results = [];
foreach($results_nearest_users as $user) {
$userlat = $user->getCity()->getLat();
$userlng = $user->getCity()->getLng();
$theta = $userlng - $lng;
$dist = sin(deg2rad($lat)) * sin(deg2rad($userlat)) + cos(deg2rad($lat)) * cos(deg2rad($userlat)) * cos(deg2rad($theta));
$dist = acos($dist);
$dist = rad2deg($dist);
// -> Convert to miles
$miles = $dist * 60 * 1.1515;
// -> Convert to km
$distance = ($miles * 1.609344);
// -> Push each result in array
array_push($results, [$user, 'distance' => $distance]);
}
// -> Sort results by ASC
usort($results, function($a, $b) {
return $a['distance'] <=> $b['distance'];
});
$result_nearest = [];
foreach ($results as $user) {
array_push($result_nearest, $user[0]);
}
if(!$result_nearest){
$result_random = $this->getDoctrine()->getRepository(User::class)->searchUsers(null, null);
// shuffle($result_random);
$result_random = array_slice($result_random, 0, 3);
$random_users = $result_random;
}
}else {
$result_random = $this->getDoctrine()->getRepository(User::class)->searchUsers(null, null);
// shuffle($result_random);
$result_random = array_slice($result_random, 0, 3);
$random_users = $result_random;
}
}
// -> If one of the fields is completed in then the search query is launched, on this field
// ****************************************************************************************
return $this->render('home/search.html.twig', compact('user','result', 'result_nearest', 'random_users'));
}
$newsletter = new Newsletter();
$formNews = $this->createForm(NewsletterType::class, $newsletter);
$formNews->handleRequest($request);
if ($formNews->isSubmitted() && $formNews->isValid()) {
// Save newsletter
$manager = $this->getDoctrine()->getManager();
$manager->persist($newsletter);
$manager->flush();
// -> Flash message
$this->addFlash("success", "Votre inscription à la newsletter est confirmée");
return $this->redirectToRoute('home');
}
return $this->render('home/index.html.twig', [
'name' => 'Accueil',
'form' => $form2->createView(),
// 'cities' => $cities,
'formNews' => $formNews->createView(),
'jobs' => $jobs
]);
}
/**
* Page professionnel Marketing
* @Route("/pro", name="pro")
*/
public function pro(Request $request) {
return $this->render('home/pro.html.twig');
}
/**
* Page professionnel Marketing
* @Route("/pro/subscriptions", name="pro_subscriptions")
*/
public function proSubscriptions(Request $request) {
return $this->render('home/pro_subscriptions.html.twig');
}
/**
* Permet de créer une barre de recherche dans le layout
*
* @param Request $request
* @param UserRepository $user_repo
* @param CityRepository $city_repo
* @param JobRepository $job_repo
* @return void
*/
public function search(Request $request, UserRepository $user_repo, CityRepository $city_repo, JobRepository $job_repo)
{
$query = [];
$form = $this->createForm(SearchHomeType::class, $query, ['method' => 'GET']);
// ->Reads the request and extracts the data from the form
// *******************************************************
$form->handleRequest($request);
// -> Initialize a result array
// ****************************
$result = [];
if ($form->isSubmitted() && $form->isValid()) {
// -> extract and recover the data into variable
// *********************************************
extract($form->getData());
// -> If one of the fields is completed in then the search query is launched, on this field
// ****************************************************************************************
$result = $this->getDoctrine()->getRepository(User::class)->searchUsers($job, $city);
return $this->redirectToRoute('home', array('result' => $result));
}
return $this->render('templates/_partials/nav.html.twig', [
'name' => 'Accueil',
'form' => $form->createView(),
]);
}
/**
* Returns a random pseudo character string of variable size
*
* @param [int] $length [Longueur souhaiter]
* @return [string] [chaine de caracteres pseudo aleatoire]
*/
public function randomString($length)
{
$string = "0123456789azertyuiopqsdfghjklmwxcvbnAZERTYUIOPQSDFGHJKLMWXCVBN";
return substr(str_shuffle(str_repeat($string, $length)), 0, $length);
}
/**
* Permet de se déconnecter
*
* @Route("/logout", name="account_logout")
*
* @return Response
*/
public function logout()
{
}
/**
* Permet de se connecter
*
* @Route("/login", name="login")
*
* @return Response
*/
public function login(AuthenticationUtils $utils){
$error = $utils->getLastAuthenticationError();
$username = $utils->getLastUsername();
return $this->render('_partials/login.html.twig', [
'hasError' => $error !== null,
'username' => $username,
]);
}
}