<?php
namespace App\Controller;
use App\Entity\Intervention;
use App\Entity\Payment;
use App\Entity\User;
use App\Security\TokenAuthenticator;
use Doctrine\DBAL\Exception\UniqueConstraintViolationException;
use Doctrine\Persistence\ObjectManager;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpClient\HttpClient;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Mailjet\Resources;
use Stripe\Stripe;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
use Symfony\Component\Security\Core\User\UserProviderInterface;
use Symfony\Component\Security\Guard\GuardAuthenticatorHandler;
class DefaultController extends AbstractController
{
private $pwEncoder;
private $userProvider;
public function __construct(UserProviderInterface $userProvider, UserPasswordEncoderInterface $pwEncoder)
{
$this->userProvider = $userProvider;
$this->pwEncoder = $pwEncoder;
}
public function index(): Response
{
return $this->render('app/index.html.twig');
}
public function test(Request $request)
{
// return new JsonResponse($this->isGranted('ROLE_USER'));
// $client = HttpClient::create();
//
// $response = $client->request('POST', 'https://api.mailjet.com/v4/sms-send', [
// 'headers' => [
// 'Authorization' => 'Bearer 69c42935f95046598fed9baecc36f758',
// 'Content-Type' => 'application/json'
// ],
// 'body' => [
// 'Text' => 'Merci de vous faire vacciner svp',
// 'To' => '+33695156479',
// 'From' => 'Conseil européen'
// ],
// ]);
// return new JsonResponse($response);
// dump(substr('Bearer nils', 0, 6) === "Bearer");
// dump($this->userProvider->loadUserByUsername("nils"));
// dump($request);
echo "nils";
exit;
}
public function sendSms(Request $request)
{
$tel = $request->request->get('tel');
$tel = str_replace(' ', '', $tel);
$tel = str_replace('.', '', $tel);
if (substr($tel, 0, 3) != "+33" && substr($tel, 0, 1) == "0")
{
$tel = "+33".substr($tel, 1);
}
$em = $this->getDoctrine()->getManager();
$user = $em->getRepository(User::class)->findOneByTel($tel);
if (!$user)
{
$user = new User();
}
$code = mt_rand(1111,9999);
$user->setTel($tel);
$user->setPassword("code");
$user->setCodeSms($code);
$url = "https://api.mailjet.com/v4/sms-send";
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$headers = array(
"Content-Type: application/json",
"Authorization: Bearer 67492d5bf526461990fb22b985817297",
);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
$data ='
{"From": "BlueStork",
"To": "'.$tel.'",
"Text": "Bienvenue chez BlueStork ! Votre code est le '.$code.'."}
';
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
//for debug only!
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
$resp = curl_exec($curl);
curl_close($curl);
$resp_decoded = json_decode($resp);
if ($resp_decoded->Status->Code == 1)
{
$em->persist($user);
$em->flush();
return new JsonResponse("SMS sent", 200);
}else
{
return new JsonResponse("SMS error", 400);
}
}
public function login(Request $request)
{
$em = $this->getDoctrine()->getManager();
if ($request->request->get('token'))
{
$user = $em->getRepository(User::class)->findOneByApiToken($request->request->get('token'));
if ($user)
{
return new JsonResponse($user->getApiToken(), 200);
}else
{
return new JsonResponse("Invalid Token", 404);
}
}
if ($request->request->get('tel'))
{
$user = $em->getRepository(User::class)->findOneByTel($request->request->get('tel'));
if ($user && $this->pwEncoder->isPasswordValid($user, $request->request->get('password')))
{
return new JsonResponse($user->getApiToken(), 200);
}else if ($user->getPassword() == "code")
{
return new JsonResponse("code", 404);
}else if ($user->getPassword() == "register")
{
return new JsonResponse("register", 404);
}else
{
return new JsonResponse("wrong password", 404);
}
}
return new JsonResponse("Not found", 404);
}
public function getUserInfo(Request $request)
{
$em = $this->getDoctrine()->getManager();
$user = $em->getRepository(User::class)->findOneByTel($request->request->get('tel'));
$infos = [];
$infos["id"] = $user->getId();
$infos["email"] = $user->getEmail();
$infos["name"] = $user->getName();
$infos["firstname"] = $user->getFirstname();
$infos["address"] = $user->getAddress();
$infos["subaddress"] = $user->getSubaddress();
$infos["town"] = $user->getTown();
$infos["cp"] = $user->getCp();
return new JsonResponse($infos);
}
public function setUserInfo(Request $request)
{
$em = $this->getDoctrine()->getManager();
$user = $em->getRepository(User::class)->findOneByTel($request->request->get('tel'));
$firstname = $request->request->get("firstname");
$name = $request->request->get("name");
$address = $request->request->get("address");
$subaddress = $request->request->get("subaddress");
$cp = $request->request->get("cp");
$town = $request->request->get("town");
$email = $request->request->get("email");
$user->setFirstname($firstname);
$user->setName($name);
$user->setAddress($address);
$user->setSubAddress($subaddress);
$user->setCp($cp);
$user->setTown($town);
$user->setEmail($email);
$em->persist($user);
$em->flush();
return new JsonResponse("Done");
}
public function checkUser(Request $request)
{
$em = $this->getDoctrine()->getManager();
$tel = $request->request->get('tel');
$tel = str_replace(' ', '', $tel);
$tel = str_replace('.', '', $tel);
if (substr($tel, 0, 3) != "+33" && substr($tel, 0, 1) == "0")
{
$tel = "+33".substr($tel, 1);
}
$user = $em->getRepository(User::class)->findOneByTel($tel);
if (!$user)
{
$codeSMS = mt_rand(111111,999999);
$user = new User();
$user->setTel($tel);
$user->setCodeSms($codeSMS);
$em->persist($user);
$em->flush();
$client = HttpClient::create();
$response = $client->request('POST', 'https://api.mailjet.com/v4/sms-send', [
'headers' => [
'Authorization' => 'Bearer 69c42935f95046598fed9baecc36f758',
'Content-Type' => 'application/json'
],
'body' => [
'Text' => "Bienvenue chez BlueStork ! Votre code d'activation est : ".$codeSMS,
'To' => $request->request->get('tel'),
'From' => 'BlueStork'
],
]);
return new JsonResponse('Not found', 404);
}elseif ($user->getPassword() == "register")
{
return new JsonResponse('register');
}elseif ($user->getPassword() == "code")
{
return new JsonResponse('code');
}else
{
return new JsonResponse('Found');
}
}
public function validateTel(Request $request)
{
$em = $this->getDoctrine()->getManager();
$user = $em->getRepository(User::class)->findOneByTel($request->request->get('tel'));
if (!$user)
{
return new JsonResponse('Not found', 404);
}else
{
if($user->getCodeSms() == $request->request->get('code'))
{
$user->setPassword("register");
$em->persist($user);
$em->flush();
return new JsonResponse('Found');
}else
{
return new JsonResponse('No match', 403);
}
}
}
public function register(UserPasswordEncoderInterface $passwordEncoder, Request $request)
{
$em = $this->getDoctrine()->getManager();
$user = $em->getRepository(User::class)->findOneByTel($request->request->get('tel'));
if (!$user)
{
return new JsonResponse('User not found', 404);
}
$password = $request->request->get("password");
$passwordConfirmation = $request->request->get("confirm_password");
$firstname = $request->request->get("firstname");
$name = $request->request->get("name");
$address = $request->request->get("address");
$subaddress = $request->request->get("subaddress");
$cp = $request->request->get("cp");
$town = $request->request->get("town");
$email = $request->request->get("email");
$errors = [];
if($password != $passwordConfirmation)
{
$errors[] = "Le mot de passe et sa confirmation doivent être identique";
}
if(strlen($password) < 6)
{
$errors[] = "Le mot de passe doit faire minimum 6 caractères";
}
if(!$errors)
{
$encodedPassword = $passwordEncoder->encodePassword($user, $password);
$user->setPassword($encodedPassword);
$user->setFirstname($firstname);
$user->setName($name);
$user->setAddress($address);
$user->setSubAddress($subaddress);
$user->setCp($cp);
$user->setTown($town);
$user->setEmail($email);
$user->setRoles(array('ROLE_USER'));
$user->setApiToken(strtoupper(substr(str_repeat(md5(rand()), ceil(6/32)), 0, 12)));
try
{
$em->persist($user);
$em->flush();
return new JsonResponse($user->getApiToken());
}
catch(UniqueConstraintViolationException $e)
{
$errors[] = "Adresse Email déjà enregistré !";
}
catch(\Exception $e)
{
$errors[] = "Impossible d'enregistrer vos informations, réessayer ultérieurement.";
}
}
return new JsonResponse($errors, 400);
}
public function profile()
{
return $this->json([
'user' => $this->getUser()
]);
}
public function getIntervention(Request $request)
{
if(!$this->isGranted('ROLE_USER'))
{
return new JsonResponse("Forbidden", 403);
}
$em = $this->getDoctrine()->getManager();
$user = $em->getRepository(User::class)->findOneByTel($request->request->get('tel'));
$interventions = $em->getRepository(Intervention::class)->findBy(array("user_id" => $user->getId()));
$interv_cleaned = [];
foreach ($interventions as $k => $v)
{
$tmp["type"] = $v->getType();
$tmp["date"] = $v->getDate();
$tmp["address"] = $v->getAddress();
$tmp["cp"] = $v->getCp();
$tmp["town"] = $v->getTown();
array_push($interv_cleaned, $tmp);
}
return new JsonResponse($interv_cleaned);
}
public function sendEmail(Request $request)
{
$type = $request->request->get('type');
$client_type = $request->request->get('client_type');
$client_chaudiere = $request->request->get('client_chaudiere');
$address = $request->request->get('client_address');
$sub_address = $request->request->get('client_subaddress');
$cp = $request->request->get('client_cp');
$town = $request->request->get('client_town');
$property_type = $request->request->get('client_property_type');
$room_type = $request->request->get('client_room_type');
$fuite_type = $request->request->get('client_fuite_type');
$more_info = $request->request->get('client_fuite_info');
$date = $request->request->get('client_date');
$price = $request->request->get('price');
$email = $request->request->get('email');
$paiementMethod = $request->request->get('method');
$attachments = array();
$attachments[] = array(
'ContentType' => "text/plain",
'Filename' => "photo1.jpg",
'Base64Content' => $request->request->get('pic1')
);
$attachments[] = array(
'ContentType' => "text/plain",
'Filename' => "photo2.jpg",
'Base64Content' => $request->request->get('pic2')
);
$attachments[] = array(
'ContentType' => "text/plain",
'Filename' => "photo3.jpg",
'Base64Content' => $request->request->get('pic3')
);
$em = $this->getDoctrine()->getManager();
$user = $em->getRepository(User::class)->findOneByTel($request->request->get('tel'));
$intervention = new Intervention();
$intervention->setDate($date);
$intervention->setType($type);
$intervention->setPropertyType($property_type);
$intervention->setRoomType($room_type);
$intervention->setFuiteType($fuite_type);
$intervention->setMoreInfo($more_info);
$intervention->setPrice($price);
$intervention->setUserId($user->getId());
$intervention->setClientType($client_type);
$intervention->setPaiementMethod($paiementMethod);
$intervention->setAddress($address);
$intervention->setSubaddress($sub_address);
$intervention->setCp($cp);
$intervention->setTown($town);
$em->persist($intervention);
$em->flush();
if ($this->getParameter('kernel.environment') == 'prod')
{
$email = 'protechservicegrandest@gmail.com';
// $email = 'alexandre.geng@gmail.com';
}else
{
$email = 'alexandre.geng@gmail.com';
}
if ($type == "J'ai une fuite !")
{
$template = "<html>
<head>
<title>Blue Stork</title>
</head>
<body>
<p>Nature de la demande : ".$type."</p>
<br>
<p>Prénom et nom : ".$user->getFirstname()." ".$user->getName()."</p>
<br>
<p>Email : ".$user->getEmail()."</p>
<br>
<p>Télépone : ".$user->getTel()."</p>
<br>
<p>Demande venant d'un ".$client_type."</p>
<br>
<p>Adresse : ".$address."</p>
<p>Supplément d'adresse : ".$sub_address."</p>
<p>Code postal : ".$cp."</p>
<p>Ville : ".$town."</p>
<br>
<p>Type de bien : ".$property_type."</p>
<br>
<p>Pièce : ".$room_type."</p>
<br>
<p>Type de fuite : ".$fuite_type."</p>
<br>
<p>Informations supplémentaire : ".$more_info."</p>
<br>
<p>Date : ".$date."</p>
<br>
<p>Prix : ".$price."</p>
<br>
<p>Méthode de paiement : ".$paiementMethod."</p>
</body>
</html>
";
}else
{
$template = "<html>
<head>
<title>Blue Stork</title>
</head>
<body>
<p>Nature de la demande : ".$type."</p>
<br>
<p>Prénom et nom : ".$user->getFirstname()." ".$user->getName()."</p>
<br>
<p>Email : ".$user->getEmail()."</p>
<br>
<p>Télépone : ".$user->getTel()."</p>
<br>
<p>Type de chaudière : ".$client_chaudiere."</p>
<br>
<p>Adresse : ".$address."</p>
<p>Supplément d'adresse : ".$sub_address."</p>
<p>Code postal : ".$cp."</p>
<p>Ville : ".$town."</p>
<br>
<p>Type de bien : ".$property_type."</p>
<br>
<p>Pièce : ".$room_type."</p>
<br>
<p>Informations supplémentaire : ".$more_info."</p>
<br>
<p>Date : ".$date."</p>
<br>
<p>Prix : ".$price."</p>
<br>
<p>Méthode de paiement : ".$paiementMethod."</p>
</body>
</html>
";
}
$mj = new \Mailjet\Client('b024e9db9ed72cb26f5e3dec34fa2be5','7f8c4d3ba3b4c16b2204e9fa094ae29e',true,['version' => 'v3.1']);
$body = [
'Messages' => [
[
'From' => [
'Email' => "developpement@bluestork.fr",
'Name' => "Blue Stork"
],
'To' => [
[
'Email' => "protechservicegrandest@gmail.com",
'Name' => "protechservicegrandest@gmail.com"
]
],
'Subject' => "Demande d'intervention Blue Stork",
'TextPart' => "Demande d'intervention Blue Stork",
'HTMLPart' => $template,
'CustomID' => "Blue Stork",
'Attachments' => $attachments
]
]
];
$mj = new \Mailjet\Client('b024e9db9ed72cb26f5e3dec34fa2be5','7f8c4d3ba3b4c16b2204e9fa094ae29e',true,['version' => 'v3.1']);
$body = [
'Messages' => [
[
'From' => [
'Email' => "developpement@bluestork.fr",
'Name' => "Blue Stork"
],
'To' => [
[
'Email' => "alexandre.geng@gmail.com",
'Name' => "alexandre.geng@gmail.com"
]
],
'Subject' => "Demande d'intervention Blue Stork",
'TextPart' => "Demande d'intervention Blue Stork",
'HTMLPart' => $template,
'CustomID' => "Blue Stork",
'Attachments' => $attachments
]
]
];
if ($this->getParameter('kernel.environment') == 'prod')
{
$response = $mj->post(Resources::$Email, ['body' => $body]);
$response->success();
$r_data = $response->getData();
if($r_data["Messages"][0]["Status"] == "success")
{
return new JsonResponse('Email sent');
}else
{
return new JsonResponse('Email fail');
}
}else
{
$response = $mj->post(Resources::$Email, ['body' => $body]);
$response->success();
$r_data = $response->getData();
return new JsonResponse($r_data);
}
}
public function stripeIntent(Request $request)
{
//sk_test_51KC50gEuum09L1EbWDlhU6XkukgvPw3ntiKwJptKxX9rQCoXvB2Vzu7NoJl473kedV1qpNFcP1ZnGAKA1fKyCWD80091ZF0rgq
//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
\Stripe\Stripe::setApiKey('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');
$paymentIntent = \Stripe\PaymentIntent::create([
'amount' => $request->request->get('price')*100,
'currency' => 'eur',
]);
$output = [
'clientSecret' => $paymentIntent->client_secret,
];
return new JsonResponse($output);
}
public function registerPayment(Request $request)
{
$em = $this->getDoctrine()->getManager();
$user = $em->getRepository(User::class)->findOneByTel($request->request->get('tel'));
$payment = new Payment();
$date = new \DateTime();
$payment->setUserId($user->getId());
$payment->setStriperesult(json_encode($request->request->get('paymentid')));
$payment->setDate($date->format("Y-m-d H:i:s"));
$em->persist($payment);
$em->flush();
return new JsonResponse(["transaction"=> $request->request->get('paymentid')]);
}
public function getInvalid(Request $request)
{
$em = $this->getDoctrine()->getManager();
$query = $em->createQuery("SELECT p FROM App\Entity\Intervention p ORDER BY p.date ASC");
$allResa = $query->getResult();
$invalid = array();
$formatInvalid = array();
$bainsCD = array();
foreach ($allResa as $k=>$v)
{
$date = $v->getDate();
$start = date('Y-d-m H:i:s',strtotime('-1 minutes',strtotime($date)));
$end = date('Y-d-m H:i:s',strtotime('+1 minutes',strtotime($date)));
$format_invalid["start"] = date(DATE_ISO8601, strtotime($start));
$format_invalid["end"] = date(DATE_ISO8601, strtotime($end));
array_push($invalid, $format_invalid);
}
return new JsonResponse($invalid);
}
}