<?php
namespace App\Controller;
use App\Service\SitemapService;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\Routing\Annotation\Route;
use Doctrine\Persistence\ManagerRegistry;
/**
* Class PrimaryController
* @package App\Controller
*
*/
class PrimaryController extends AbstractController
{
#[Route(path: '/', name: 'app_main')]
#[Route(path: '/{url}', name: 'app_pages', requirements: ['url' => '^(?!api|action|manual).*\/$'])]
public function admin(): Response
{
return $this->render('index.html.twig', [
'application_name' => $_ENV['APP_NAME'],
]);
}
/**
* Get documentation for authorized user only
*
* @return RedirectResponse
*/
#[Route(path: '/manual', name: 'manual')]
public function manual(Request $request): RedirectResponse
{
$user = $this->getUser();
$download = filter_var($request->query->get('download'), FILTER_VALIDATE_BOOLEAN);
$subject = 'Руководство использования.pdf';
$root = $request->server->get('DOCUMENT_ROOT');
if ($user) {
$filename = "manual.pdf";
$directory = dirname($root).'/assets/doc';
if ($download) {
$response = new Response();
$response->headers->set('Content-type', 'application/octet-stream');
$response->headers->set('Content-Disposition', sprintf('attachment; filename="%s"', $subject));
$response->setContent(file_get_contents($directory.'/'.$filename));
$response->setStatusCode(200);
$response->headers->set('Content-Transfer-Encoding', 'binary');
$response->headers->set('Pragma', 'no-cache');
$response->headers->set('Expires', '0');
return $response;
}
header('Content-type: application/pdf');
header(sprintf('Content-Disposition: inline; filename="%s"', $subject));
header('Content-Length: ' . filesize($directory.'/'.$filename));
@readfile($directory.'/'.$filename);
exit;
}
return $this->redirectToRoute('app_admin');
}
/**
* SEARCH ACTION: SET
*
* @return RedirectResponse
*/
#[Route(path: '/action/search', methods: ['get'])]
public function search(Request $request): RedirectResponse
{
$session = new Session();
//$session->start();
$query = $request->query->get('query');
$route = $request->query->get('route');
$page = strtok($route, ':');
if ($query) {
$session->set('search', [
'query' => $query,
'page' => $page
]);
}
return $this->redirect('/admin/'.$page);
}
/**
* SEARCH ACTION: GET
*
* @return JsonResponse
*/
#[Route(path: '/action/search/get', methods: ['get'])]
public function getSearch(Session $session): JsonResponse {
return new JsonResponse(
$session->get('search') ?? [],
Response::HTTP_OK
);
}
/**
* SEARCH/SORT ACTION: DELETE
*
* @return RedirectResponse
*/
#[Route(path: '/action/{prop<search|sorted>}/del', methods: ['get'])]
public function removeSessionByProp(Request $request, Session $session, String $prop): RedirectResponse {
$session->remove($prop);
return $this->redirect($request->headers->get('referer'));
}
/**
* SORT ACTION: SET
*
* @return RedirectResponse
*/
#[Route(path: '/action/sorted', methods: ['get'])]
public function sorted(Request $request, Session $session): Response
{
$session->start();
$field = $request->query->get('field');
$page = $request->query->get('page');
$sort = 'ASC';
if ($field) {
$sorted = $session->get('sorted');
$count = $sorted['count'] ?? 1;
if ($sorted && $sorted['field'] === $field) {
$sort = $sorted['sort'] !== 'ASC' ? 'ASC' : 'DESC';
$count++;
}
$params = ['count', 'sort', 'field', 'page'];
foreach($params as $param) {
$sorted[$param] = ${$param};
}
$session->set('sorted', $sorted);
}
if ($sorted['count'] > 2) {
$session->remove('sorted');
}
$referer = $request->headers->get('referer');
return $this->redirect($referer);
}
/**
* @return RedirectResponse
*/
#[Route(path: '/action/reindexing-sitemap', methods: ['get'])]
public function reindexingSitemap(Request $request, SitemapService $sitemapService, ManagerRegistry $registry) {
$pages = $request->query->get('page') ?? [];
$pages = is_string($pages) ? [$pages] : $pages;
$result = [
'success' => false,
'message' => 'The value of some query parameters is undefined',
'errors' => []
];
foreach ($pages as $page) {
$repository = null;
$entityClassName = 'App\Entity\\' . ucfirst($page);
if (class_exists($entityClassName)) {
$repository = $registry->getRepository($entityClassName);
}
if ($repository != null) {
$sitemapService->clearSitemap($page);
$items = $repository->findAll();
foreach($items as $item) {
$link = method_exists($item, 'getLink') ? $item->getLink() : $item->getId();
$sitemapService->updateSitemap($page, $link, null);
}
$result = [
'success' => true,
'message' => 'Links in the sitemap were successfully indexed',
'errors' => []
];
}
}
$this->addFlash('notice', $result);
$referer = $request->headers->get('referer') ?? '/admin';
return $this->redirect($referer);
}
#[Route(path: '/action/{sel<modification|productOem>}/clear', methods: ['post'])]
public function clear(Request $request, ManagerRegistry $registry): RedirectResponse
{
$req = $request->request->all();
$conn = $registry->getManager()->getConnection();
$query = '';
try {
foreach($req as $key => $item) {
if (filter_var($item, FILTER_VALIDATE_BOOLEAN)) {
$query .= 'TRUNCATE TABLE '.strtolower(preg_replace('/(?<!^)[A-Z]/', '_$0', $key)).'; ';
}
}
if (!!$query) {
$conn->executeStatement('SET FOREIGN_KEY_CHECKS=0');
$conn->executeStatement($query);
$conn->executeStatement('SET FOREIGN_KEY_CHECKS=1');
}
} catch(\Throwable $th) {
$errors = $th->getMessage();
throw new \Exception($errors, 1);
}
$referer = $request->headers->get('referer');
return $this->redirect($referer);
}
}