<?php
namespace App\Controller;
use App\Entity\Company;
use App\Form\CompanyType;
use Doctrine\ORM\EntityManagerInterface;
use ScssPhp\ScssPhp\Compiler;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Yaml\Yaml;
class HomeController extends AbstractController
{
/**
* @Route("/profil/{profil}", name="set_profil")
*/
public function setProfil($profil, Session $session): RedirectResponse
{
$session->set('profil', $profil);
return $this->redirectToRoute("home");
}
/**
* @Route("/upload", name="upload")
*/
public function upload(Request $request, $projectDir): JsonResponse
{
$content = json_decode($request->getContent(), true);
$token = $content['token'];
$configFile = sprintf("%s/var/tokens/%s.yaml", $projectDir, $token);
if(!file_exists(dirname($configFile))) {
mkdir(dirname($configFile));
}
$config = [];
if(file_exists($configFile)) {
$config = Yaml::parseFile($configFile);
}
$config['time'] = time();
unset($content['token']);
$content['time'] = time();
if(isset($content['reference']) && strlen($content['reference']) > 30) {
$content['reference'] = substr($content['reference'], 0, 30);
}
$alreadyExists = false;
if (array_key_exists('step', $content)) {
$step = $content['step'];
foreach ($config as $key => $conf) {
if (is_array($conf) && array_key_exists('step', $conf) && $conf['step'] == $step) {
$config[$key] = $content;
$alreadyExists = true;
break;
}
}
}
if ($alreadyExists === false) {
$config[] = $content;
}
$yaml = Yaml::dump($config, 4);
file_put_contents($configFile, $yaml);
if(!file_exists($configFile)) {
return $this->json(['result' => 'file not created']);
}
return $this->json(['result' => 'ok']);
}
/**
* @Route("/", name="home")
*/
public function index(iterable $activities): Response
{
return $this->render('home/index.html.twig');
}
/**
* @Route("/activity/{token}", name="sub_token")
*/
public function selectSubToken($token, iterable $activities): Response
{
foreach($activities as $activity) {
if($activity->getToken() === $token) {
if($activity->getSubToken() === false || !is_array($activity->getSubToken())) {
return $this->showActivity($token, false, $activities);
}
return $this->render('home/subtoken.html.twig', [
'activity' => $activity,
]);
}
}
throw new NotFoundHttpException();
}
/**
* @Route("/activity/{token}/{subtoken}", name="show_activity")
*/
public function showActivity($token, $subtoken, iterable $activities): Response
{
foreach($activities as $activity) {
if ($activity->getToken() === $token) {
return $this->render($activity->getTemplate($token, $subtoken), array_merge([
'activity' => $activity
], $activity->getTemplateData($token, $subtoken)));
}
}
throw new NotFoundHttpException();
}
/**
* @Route("/ajax/{token}", name="ajax_call_get", methods={"GET"})
*/
public function ajaxGet($token, iterable $activities, Request $request): JsonResponse
{
$response = new JsonResponse();
$response->setData(['error' => 'activity not found']);
if(!$request->query->has("command")) {
throw new BadRequestHttpException();
}
if(!$request->query->has("params")) {
throw new BadRequestHttpException();
}
foreach($activities as $activity) {
if ($activity->getToken() === $token) {
$params = [];
if(is_array($request->query->get('params') )) {
foreach($request->query->get("params") as $param) {
$params[] = json_decode($param, true);
}
} else {
$params = json_decode($request->query->get("params"), true);
}
$response->setData($activity->handleAjax($request->query->get("command"), $params ));
}
}
return $response;
}
/**
* @Route("/ajax/{token}", name="ajax_call_post", methods={"POST"})
*/
public function ajaxPost($token, iterable $activities, Request $request): JsonResponse
{
$response = new JsonResponse();
$response->setData(['error' => 'activity not found']);
$parameters = json_decode($request->getContent(), true);
if(!isset($parameters["command"])) {
throw new BadRequestHttpException();
}
if(!isset($parameters["params"])) {
throw new BadRequestHttpException();
}
foreach($activities as $activity) {
if ($activity->getToken() === $token) {
$response->setData($activity->handleAjax($parameters["command"], $parameters["params"] ));
}
}
return $response;
}
/**
* @Route("/mon-compte", name="account")
*/
public function account(EntityManagerInterface $entityManager, $projectDir, Request $request): Response
{
$company = $this->getUser()->getCompany();
$form = $this->createForm(CompanyType::class, $company);
$form->handleRequest($request);
$updated = false;
if($form->isSubmitted() && $form->isValid()) {
$logo = $company->getFile();
if($logo instanceof UploadedFile) {
$dest = sprintf("%s/public/uploads/%s.%s", $projectDir, uniqid(), $logo->getClientOriginalExtension());
$logo->move(dirname($dest), basename($dest));
$company->setLogo(basename($dest));
}
$entityManager->flush();
$company->setFile(null);
$updated = true;
}
return $this->render("home/account.html.twig", ['form' => $form->createView(), 'updated' => $updated]);
}
/**
* @Route("/mon-compte/composants", name="account_components")
*
* Company components list
*/
public function listComponents(EntityManagerInterface $entityManager)
{
$company = $this->getUser()->getCompany();
$companyComponents = $company->getCompanyComponents();
/*$companyComponentsToKeep = [];
foreach ($companyComponents as $companyComponent) {
$keep = true;
foreach ($companyComponent->getComponent()->getOptions() as $option) {
$keepOption = false;
foreach ($option->getModules() as $module) {
dump($module->getId());
if ($module->getId() == 1 || $module->getId() == 2) {
$keepOption = true;
}
}
if (!$keepOption) {
$keep = false;
}
}
if ($keep) {
$companyComponentsToKeep[] = $companyComponent;
}
}
return $this->render("home/components.html.twig", ['companyComponents' => $companyComponentsToKeep]);*/
return $this->render("home/components.html.twig", ['companyComponents' => $companyComponents]);
}
/**
* @Route("/css/custom", name="css")
*/
public function getCss(Request $request, EntityManagerInterface $entityManager, \App\Helper\Company $helper, $projectDir): Response
{
$companyId = $request->query->get('company');
$company = $entityManager->getRepository(Company::class)->find($companyId);
if(!$company instanceof Company) {
$company = $helper->getCompany();
}
$homeScss = sprintf("%s/assets/scss/home.scss", $projectDir);
$homeContent = file_get_contents($homeScss);
$content = "";
foreach ($company->getColors() as $color) {
$content .= sprintf("$%s: %s;", $color->getName(), $color->getValue()).PHP_EOL;
}
$content .= file_get_contents(sprintf("%s/node_modules/%s", $projectDir, "bootstrap/dist/css/bootstrap.css"));
$content .= $homeContent;
$compiler = new Compiler();
$css = $compiler->compile($content);
return new Response($css, 200, ['Content-type' => 'text/css']);
}
}