<?php
namespace App\Controller\Front;
use App\EmailNotification\ToTrainee;
use DateTime;
use DateInterval;
use Knp\Snappy\Pdf;
use App\Entity\User;
use Knp\Snappy\Image;
use App\Entity\Trainee;
use App\Entity\SearchCourse;
use WebPConvert\WebPConvert;
use App\Form\SearchCourseType;
use App\Service\ImageOptimizer;
use App\Repository\UserRepository;
use App\Repository\MediaRepository;
use App\Repository\PhotoRepository;
use App\Repository\CourseRepository;
use App\Repository\ArticleRepository;
use App\Repository\BookingRepository;
use App\Repository\MessageRepository;
use App\Service\InternationalService;
use Symfony\Component\Intl\Timezones;
use Doctrine\Persistence\ObjectManager;
use App\Repository\HomeSliderRepository;
use App\Service\ConversationService;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\UX\Cropperjs\Form\CropperType;
use Symfony\Component\HttpFoundation\Cookie;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\UX\Cropperjs\Factory\CropperInterface;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Contracts\Translation\TranslatorInterface;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
class HomepageController extends AbstractController
{
private $apiKey;
private $stripe;
private $translator;
private $imageOptimizer;
public function __construct(TranslatorInterface $translator, ImageOptimizer $imageOptimizer)
{
$this->translator = $translator;
$this->apiKey = $_ENV['STRIPE_SECRET_KEY'];
$this->stripe = $this->stripe = new \Stripe\StripeClient($this->apiKey);
$this->imageOptimizer = $imageOptimizer;
}
private function generateUniqueName()
{
return md5(uniqid());
}
#[Route(path: '/authorize-access', name: 'authorize_access')]
public function authorizeAccess(Request $request)
{
$session = new Session();
if ($request->request->get('accessPassword')) {
$truePassword = "123123rt";
if ($request->request->get('accessPassword') == $truePassword) {
$expire = new DateTime();
$expire->add(new DateInterval("P1M"));
$cookie = Cookie::create('racket-beta-access')
->withValue(true)
->withExpires($expire)
->withSecure(true);
$response = $this->redirectToRoute('homepage');
$response->headers->setCookie($cookie);
return $response;
}
else {
$session->set('wrong-password', true);
}
}
return $this->redirectToRoute('homepage');
}
#[Route(path: '/', name: 'homepage_no_locale')]
public function indexNoLocale(): Response
{
return $this->redirectToRoute('homepage', ['_locale' => 'fr']);
}
#[Route(path: '/{_locale}', name: 'homepage')]
public function index(ArticleRepository $articleRepository, HomeSliderRepository $homeSliderRepository, CourseRepository $courseRepository, Request $request, MediaRepository $mediaRepository): Response
{
$user = $this->getUser();
$locale = ($request->getLocale() ? $request->getLocale() : 'en');
// Search form
$search = new SearchCourse();
$form = $this->createForm(SearchCourseType::class, $search, [
'action' => $this->generateUrl('courses'),
'method' => 'GET'
]);
$form->handleRequest($request);
$articles = $articleRepository->getLatestArticles($locale, 4);
$sliders = $homeSliderRepository->getSliderByLocale($locale);
if (empty($sliders)){
$sliders = $homeSliderRepository->getSliderByLocale('en');
}
$courses = $courseRepository->findFeaturedCourses(12, 'homepage');
$courseTokens = [];
foreach ($courses as $course) {
$courseTokens[] = $course->getToken();
}
if (count($courses) < 12) {
$notFeaturedCourses = $courseRepository->findNotFeaturedCourses($courseTokens, 12 - count($courses));
foreach ($notFeaturedCourses as $course) {
array_push($courses, $course);
}
}
$traineeCourses = null;
if ($user instanceof Trainee) {
$traineeCourses = $courseRepository->findFeaturedCoursesForTrainee($user, 12, 'homepage');
foreach ($traineeCourses as $course) {
$courseTokens[] = $course->getToken();
}
if (count($traineeCourses) < 12) {
$notFeaturedCourses = $courseRepository->findNotFeaturedCoursesForTrainee($user, $courseTokens, 12 - count($traineeCourses));
foreach ($notFeaturedCourses as $course) {
array_push($traineeCourses, $course);
}
}
}
$medias = $mediaRepository->getMediaByLocale($locale);
if (empty($medias)){
$medias = $mediaRepository->getMediaByLocale('en');
}
return $this->render('front/homepage.html.twig', [
'menu' => 'homepage',
'articles' => $articles,
'sliders' => $sliders,
'courses' => $courses,
'startingDate' => null,
'form' => $form->createView(),
'medias' => $medias,
'traineeCourses' => $traineeCourses
]);
}
#[Route(path: '/{_locale}/cropper', name: 'cropper_test')]
public function cropper(CropperInterface $cropper, Request $request): Response
{
$crop = $cropper->createCrop('/server/path/to/the/image.jpg');
$crop->setCroppedMaxSize(2000, 1500);
$form = $this->createFormBuilder(['crop' => $crop])
->add('crop', CropperType::class, [
'public_url' => '/public/url/to/the/image.jpg',
'cropper_options' => [
'aspectRatio' => 2000 / 1500,
],
])
->getForm()
;
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
// Get the cropped image data (as a string)
$crop->getCroppedImage();
// Create a thumbnail of the cropped image (as a string)
$crop->getCroppedThumbnail(200, 150);
// ...
}
return $this->render('front/cropper.html.twig', [
'form' => $form->createView(),
]);
}
/**
* Gere le changement de langue
*/
#[Route(path: '/change-language/{locale}', name: 'change_locale')]
public function changeLocale($locale, Request $request)
{
// On stocke la langue dans la session
$request->getSession()->set('_locale', $locale);
// On revient sur la page précédente
return $this->redirect($request->headers->get('referer'));
}
#[Route(path: '/{_locale}/get-country-phone-code', name: 'get_country_phone_code')]
public function getCoutryPhoneCodeJson(Request $request, InternationalService $internationalService)
{
$json = json_decode($request->getContent(), true);
if (isset($json['countryCode'])) {
$countryCode = $json['countryCode'];
$phoneCode = $internationalService->countryPhoneCode($countryCode);
return new JsonResponse(['countryCode' => $phoneCode]);
}
return new JsonResponse(['countryCode' => false]);
}
/**
* @param Request $request
* @return JsonResponse
*/
#[Route(path: '{_locale}/profile-image-save', name: 'save_image_profile', methods: ['POST'], options: ['expose' => true])]
public function saveProfileImage(Request $request, ObjectManager $manager)
{
/**
* @var User $user
*/
$user = $this->getUser();
// the file
$file = $_FILES['file'];
$file = new UploadedFile($file['tmp_name'], $file['name'], $file['type']);
$filename = $this->generateUniqueName() . '.' . $file->guessExtension();
$newName = $this->imageOptimizer->maxImageResize($file, $filename, 'avatar_directory', 'profile');
$oldProfile = $user->getPhoto();
/*
if ($oldProfile != 'default-profile.png' && file_exists($this->getParameter('avatar_directory').'/'.$oldProfile) && is_file($this->getParameter('avatar_directory').'/'.$oldProfile)) {
unlink($this->getParameter('avatar_directory').'/'.$oldProfile);
}
*/
$user->setPhoto($newName);
$manager->persist($user);
$manager->flush();
$this->addFlash(
'success',
$this->translator->trans('flashes.pro_controller.update_profile_picture')
);
return new JsonResponse("success");
}
/**
* @param Request $request
* @return JsonResponse
*/
#[Route(path: '{_locale}/pro-cover-image-save', name: 'save_pro_image_cover', methods: ['POST'], options: ['expose' => true])]
public function savecoverImage(Request $request, ObjectManager $manager)
{
/**
* @var User $pro
*/
$pro = $this->getUser();
// the file
$file = $_FILES['file'];
$file = new UploadedFile($file['tmp_name'], $file['name'], $file['type']);
$filename = $this->generateUniqueName() . '.' . $file->guessExtension();
$newName = $this->imageOptimizer->maxImageResize($file, $filename, 'avatar_directory', 'cover');
try {
$source = $this->getParameter('avatar_directory') . '/' . $filename;
$destination = $source . '.webp';
WebPConvert::serveConverted($source, $destination, [
'fail' => 'original',
'serve-image' => [
'headers' => [
'cache-control' => true,
'vary-accept' => true
],
'cache-control-header' => 'max-age=2'
],
'convert' => [
// all convert option can be entered here (ie "quality")
],
]);
}
catch (\Throwable $th) {
}
$proInfo = $pro->getProInfo();
$oldCover = $proInfo->getCoverPhoto();
/*
if ($oldCover != 'cover.png' && file_exists($this->getParameter('avatar_directory').'/'.$oldCover) && is_file($this->getParameter('avatar_directory').'/'.$oldCover)) {
unlink($this->getParameter('avatar_directory').'/'.$oldCover);
}
*/
$proInfo->setCoverPhoto($newName);
$manager->persist($proInfo);
$manager->flush();
$this->addFlash(
'success',
$this->translator->trans('flashes.pro_controller.update_cover_picture')
);
return new JsonResponse("success");
}
}