<?php
namespace App\Controller;
use Doctrine\ORM\EntityManagerInterface;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Entity;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Exception\HttpException;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Serializer\SerializerInterface;
use App\Form\PdfProjectSelectFormType;
use App\Form\PdfFolderSelectFormType;
use App\Entity\Taskmeister\PdfFolder;
use App\Entity\Taskmeister\PdfFile;
use App\Entity\Taskmeister\SelectionProject as Project;
use App\Entity\Taskmeister\Task;
/**
* @Route("/pdf-counter", name="pdf_counter_")
*/
class PdfCounterController extends AbstractController
{
private $entityManager;
private $projectRepository;
public function __construct(EntityManagerInterface $entityManager)
{
$this->entityManager = $entityManager;
$this->projectRepository = $entityManager->getRepository(Project::class);
$this->taskRepository = $entityManager->getRepository(Task::class);
}
/**
* @Route("/index", name="index")
*/
public function index(Request $request): Response
{
$form = $this->createForm(PdfProjectSelectFormType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
return $this->redirectToRoute("pdf_counter_show", ["id" => $form->getData()["project"]->getId()]);
}
return $this->render("pdf_counter/index.html.twig", [
"projectForm" => $form->createView()
]);
}
/**
* @Route("/{id}/select", name="select")
*/
public function select(Project $project, Request $request, SerializerInterface $serializer): Response
{
$this->denyAccessUnlessGranted("view", $project);
$pdfFiles = $project->getPdfFiles();
$form = $this->createForm(PdfFolderSelectFormType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$pdfFiles = json_decode($form->getData()["pdfJson"], true)["files"];
$overBatchLimit = $form->getData()["overBatchLimit"];
foreach ($pdfFiles as $_key => $file) {
$folderRepository = $this->entityManager->getRepository(PdfFolder::class);
$pdfFolder = $folderRepository->findOneBy(array("path" => $file["path"], "project" => $project));
if (empty($pdfFolder)) {
$pdfFolder = new PdfFolder($file["path"], $project);
$this->entityManager->persist($pdfFolder);
$this->entityManager->flush();
}
$pdfFile = new PdfFile(
$project,
$pdfFolder,
$file["fileName"],
$file["fileCount"],
$file["pageCount"],
$file["imageCount"],
$file["formInputCount"],
$file["tableCount"],
$file["listCount"],
$file["formXObjectCount"],
$file["linkCount"],
$file["ocrPageCount"]
);
$this->entityManager->persist($pdfFile);
}
$this->entityManager->flush();
// dd(json_decode($form->getData()["pdf_json"])->files);
if ($overBatchLimit == "true") {
return $this->redirectToRoute("pdf_counter_select", ["id" => $project->getId()]);
}
return $this->redirectToRoute("pdf_counter_show", ["id" => $project->getId()]);
}
// $pdfFiles = $project->getPdfFiles();
$filesArray = $project->getPdfFilesAsArray();
// dump($filesArray);
return $this->renderForm(
"pdf_counter/select.html.twig",
[
"folderForm" => $form,
"filesArray" => $filesArray,
"project" => $project
]
);
}
/**
* @Route("/{id}/show", name="show")
*/
public function show(Project $project, Request $request): Response
{
$this->denyAccessUnlessGranted("view", $project);
$pdfFiles = $project->getPdfFiles();
// $pdfTree = $project->getPdfFilesAsNestedArray();
$pdfTree = $project->getPdfFilesAsJson();
// dd($pdfTree);
if (is_array($pdfTree) && count($pdfTree) == 1) {
$pdfRoot = $pdfTree[0];
$pdfRoot["total"] = $pdfFiles->count();
}
if ($pdfFiles->isEmpty()) {
return $this->redirectToRoute("pdf_counter_select", ["id" => $project->getId()]);
}
// dd($pdfTree);
return $this->render(
"pdf_counter/show.html.twig",
[
"pdfRoot" => $pdfRoot,
"project" => $project,
"helpmeisterUrl" => $_ENV["HELPMEISTER_URL"]
]
);
}
/**
* @Route("/{id}/task-type/{taskType}/task/{taskId}/json", name="json")
*/
public function getJsonPdfs(Project $project, string $taskType, int $taskId, Request $request): JsonResponse
{
$this->denyAccessUnlessGranted("view", $project);
if ($taskId > 0) {
$task = $this->taskRepository->find($taskId);
}
switch ($taskType) {
case 'main':
$targetFiles = $task->getPdfFiles();
break;
default:
$targetFiles = null;
break;
}
$pdfTree = $project->getPdfFilesAsJson($targetFiles);
if (is_array($pdfTree) && count($pdfTree) == 1) {
$pdfTree = $pdfTree[0]["children"];
}
return new JsonResponse($pdfTree);
}
/**
* @Route("/{id}/json/ids", name="json_ids")
*/
public function getJsonPdfIds(Project $project, Request $request): JsonResponse
{
$this->denyAccessUnlessGranted("view", $project);
$pdfTree = $project->getPdfFilesAsJson();
if (is_array($pdfTree) && count($pdfTree) == 1) {
$pdfTree = $pdfTree[0]["children"];
}
return new JsonResponse($pdfTree);
}
/**
* @Route("/{id}/{type}/{taskId}", name="subtask", requirements={"type"="(ocr|ocr-qa|remediation|final-qa)"})
* @Entity("task", expr="repository.find(taskId)")
*/
public function subtask(Project $project, Task $task, string $type, Request $request): Response
{
// dd($type);
$this->denyAccessUnlessGranted("edit", $task);
if ($task->isSubtask()) {
// throw $this->createUnprocessableEntityHttpException();
throw new HttpException(422, "Subtasks are not valid for this action.");
}
$pdfFiles = $task->getPdfFiles();
if ($pdfFiles->isEmpty()) {
// throw $this->createUnprocessableEntityHttpException("This task has no associated pdf files.");
throw new HttpException(422, "This task has no associated pdf files.");
}
if ($project !== $pdfFiles[0]->getProject()) {
// throw $this->createUnprocessableEntityHttpException("This task is not part of this project.");
throw new HttpException(422, "This task is not part of this project.");
}
$pdfTree = $project->getPdfFilesAsJson($pdfFiles);
// dd($pdfTree);
if (is_array($pdfTree) && count($pdfTree) == 1) {
$pdfRoot = $pdfTree[0];
$pdfRoot["total"] = $pdfFiles->count();
}
return $this->render(
"pdf_counter/$type.html.twig",
[
"pdfRoot" => $pdfRoot,
"project" => $project,
"task" => $task,
"taskType" => $type,
"helpmeisterUrl" => $_ENV["HELPMEISTER_URL"]
]
);
}
}