<?php
namespace App\Controller\Backoffice;
use App\Repository\UserRepository;
use App\Repository\SportRepository;
use App\Repository\CourseRepository;
use App\Service\EditorUploadStorage;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Contracts\Translation\TranslatorInterface;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
class AdminHomeController extends AbstractController
{
const MAX_FILESIZE = 10000000; // 10 MB
private $translator;
public function __construct(TranslatorInterface $translator)
{
$this->translator = $translator;
}
#[Route(path: '', name: 'admin_dashboard')]
public function dashboard(Request $request, UserRepository $userRepository, CourseRepository $courseRepository, SportRepository $sportRepository): Response
{
if (!$this->isGranted('ROLE_ADMIN') && $this->isGranted('ROLE_EDITOR')) {
return $this->redirectToRoute('admin_blog_published_articles');
}
$trainees = $userRepository->getNumber("Trainee");
$operators = $userRepository->getNumber("Operator");
$clubs = $userRepository->getNumber("Club");
$coachs = $userRepository->getNumber("Coach");
$courses = $courseRepository->getNumber();
$coursesActive = $courseRepository->getNumber('active');
$coursesArchived = $courseRepository->getNumber('archived');
$coursesFinished = $courseRepository->getNumber('completed');
$sports = $sportRepository->findAll();
$arraySports = [];
$arrayCourses = [];
$arrayBooking = [];
foreach ($sports as $sport)
{
$arraySports[] = $this->translator->trans("sport_name." . $sport->getSlug());
$coursesData = $courseRepository->getCoursesBySport($sport);
$arrayCourses[] = count($coursesData);
$booking = 0;
foreach($coursesData as $course)
{
foreach($course->getBookings() as $bookingData)
{
if($bookingData->getStatus() != "denied")
{
$booking++;
}
}
}
$arrayBooking[] = $booking;
}
$mostCountries = $courseRepository->getMostCountries();
$countries = [];
foreach($mostCountries as $country)
{
$countryCode = $country['countryCode'];
$coursesCount = count($courseRepository->findBy(['countryCode' => $countryCode, 'status' => 'active']));
$country['courses'] = $coursesCount;
$countries[] = $country;
}
$newTrainees = [];
$newPros = [];
for ($i = 1; $i < 13; $i++)
{
$newTrainees[] = $userRepository->getNewTraineeByMonth(strval($i), date('Y'));
$newPros[] = $userRepository->getNewProByMonth(strval($i), date('Y'));
}
if($request->request->get('editordata')) {
dd($request->request->all());
}
return $this->render('backoffice/dashboard.html.twig', [
'trainees' => $trainees,
'operators' => $operators,
'clubs' => $clubs,
'coachs' => $coachs,
'courses' => $courses,
'coursesActive' => $coursesActive,
'coursesArchived' => $coursesArchived,
'coursesFinished' => $coursesFinished,
'arraySports' => $arraySports,
'arrayCourses' => $arrayCourses,
'arrayBooking' => $arrayBooking,
'countries' => $countries,
'newTrainees' => $newTrainees,
'newPros' => $newPros,
'menu' => 'dashboard'
]);
}
#[Route(path: '/upload-editor-image', name: 'upload_editor_image')]
public function uploadEditoImage(Request $request, EditorUploadStorage $editorUploadStorage)
{
// @TODO: Set your own domain(s) in `$allowedOrigins`
$allowedOrigins = ["https://backoffice.localhost", "https://racket-trip.com", "https://racket-trip.eu"];
$origin = $request->server->get('HTTP_ORIGIN');
/*
// same-origin requests won't set an origin. If the origin is set, it must be valid.
if ($origin && !in_array($origin, $allowedOrigins)) {
return new Response("You do not have access to this resource.", 403);
}
*/
// Don't attempt to process the upload on an OPTIONS request
if ($request->isMethod("OPTIONS")) {
return new Response("", 200, ["Access-Control-Allow-Methods" => "POST, OPTIONS"]);
}
/** @var UploadedFile|null */
$file = $request->files->get("file");
if (!$file) {
return new Response("Missing file.", 400);
}
if ($file->getSize() > self::MAX_FILESIZE) {
return new Response("Your file is too big. Maximum size: ".(self::MAX_FILESIZE / 1000000)."MB", 400);
}
if (!str_starts_with($file->getMimeType(), "image/")) {
return new Response("Provided file is not an image.", 400);
}
/**
* @TODO: Replace this next line with your own file upload/save process.
* The $fileUrl variable should contain the publicly accessible URL of
* the file/image.
*/
$fileUrl = $editorUploadStorage->upload($file);
return new JsonResponse(
["location" => $fileUrl],
200,
[
"Access-Control-Allow-Origin" => $origin,
"Access-Control-Allow-Credentials" => true,
"P3P" => 'CP="There is no P3P policy."',
],
);
}
}