Files
Mangarr/src/Controller/SettingsController.php
Jérémy Guillot 4672886a67 Added:
- fix progressbar
- {slug} {chapterNumber} in Url
- activity toolbar
2024-07-07 15:25:12 +02:00

140 lines
4.7 KiB
PHP

<?php
namespace App\Controller;
use App\Entity\ContentSource;
use App\Form\ContentSourceType;
use App\Repository\ContentSourceRepository;
use App\Service\MangaScraperService;
use App\Service\NotificationService;
use Doctrine\ORM\EntityManagerInterface;
use GuzzleHttp\Exception\GuzzleException;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
class SettingsController extends AbstractController
{
public function __construct(
private MangaScraperService $mangaScraperService,
private EntityManagerInterface $entityManager,
private NotificationService $notificationService
)
{
}
#[Route('/settings', name: 'app_settings')]
public function index(): Response
{
return $this->render('settings/index.html.twig', [
'controller_name' => 'SettingsController',
]);
}
#[Route('/settings/general', name: 'app_settings_general')]
public function general(): Response
{
return $this->render('settings/index.html.twig', [
'controller_name' => 'SettingsController',
]);
}
#[Route('/settings/folders', name: 'app_settings_folders')]
public function folders(): Response
{
return $this->render('settings/index.html.twig', [
'controller_name' => 'SettingsController',
]);
}
#[Route('/settings/scrappers/list', name: 'app_settings_scrappers_list')]
public function list(ContentSourceRepository $repository): Response
{
$contentSources = $repository->findAll();
return $this->render('settings/scrapper_list.html.twig', [
'contentSources' => $contentSources,
]);
}
#[Route('/settings/scrappers/{id}', name: 'app_settings_scrappers', defaults: ['id' => null])]
public function scrappers(Request $request, ?ContentSource $contentSource): Response
{
$isNew = $contentSource === null;
$contentSource = $contentSource ?? new ContentSource();
$form = $this->createForm(ContentSourceType::class, $contentSource);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$this->entityManager->persist($contentSource);
$this->entityManager->flush();
$this->notificationService->sendUpdate(['status' => 'success', 'message' => ($isNew ? 'New scrapper configuration saved' : 'Scrapper configuration updated') . ' successfully.']);
return $this->redirectToRoute('app_settings_scrappers_list');
}
return $this->render('settings/scrappers.html.twig', [
'form' => $form->createView(),
'isNew' => $isNew,
]);
}
/**
* @throws GuzzleException
*/
#[Route('/settings/scrappers_test', name: 'app_settings_scrappers_test', methods: ['POST'])]
public function scrapperTest(Request $request): JsonResponse
{
$contentSource = new ContentSource();
$form = $this->createForm(ContentSourceType::class, $contentSource);
$form->submit($request->request->all()['content_source']);
if ($form->isValid()) {
$mangaSlug = $request->request->get('mangaSlug');
$chapterNumber = $request->request->get('chapterNumber');
try {
$scrapedData = $this->mangaScraperService->testScrapingHtml($mangaSlug, $chapterNumber, $contentSource);
}catch (\Exception $e){
$this->notificationService->sendUpdate(['status' => 'error', 'message' => $e->getMessage()]);
return new JsonResponse([
'success' => false,
'message' => $e->getMessage(),
]);
}
return new JsonResponse([
'success' => true,
'message' => 'Test successful',
'data' => $scrapedData
]);
} else {
return new JsonResponse([
'success' => false,
'message' => 'Invalid form submission',
'errors' => $this->getFormErrors($form)
]);
}
}
private function getFormErrors($form): array
{
$errors = [];
foreach ($form->getErrors(true) as $error) {
$errors[] = $error->getMessage();
}
return $errors;
}
#[Route('/settings/ui', name: 'app_settings_ui')]
public function ui(): Response
{
return $this->render('settings/index.html.twig', [
'controller_name' => 'SettingsController',
]);
}
}