<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use App\Repository\ProjectRepository;
use App\Manager\ProjectManager;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use App\Service\PdfService;
use App\Service\MailService;
use App\Manager\MediumManager;
use App\Repository\AddressRepository;
use Knp\Snappy\Pdf;
use Knp\Bundle\SnappyBundle\Snappy\Response\PdfResponse;
/**
* @Route("/api/project")
*/
class ProjectController extends AbstractController
{
/**
* @var ProjectRepository
*/
private $projectRepository;
/**
* @var AddressRepository
*/
private $addressRepository;
/**
* @var ProjectManager
*/
private $projectManager;
/**
* @var ParameterBagInterface
*/
private $params;
/**
* @var PdfService
*/
private $pdfService;
/**
* @var MailService
*/
private $mailService;
public function __construct(ProjectRepository $projectRepository, AddressRepository $addressRepository, ProjectManager $projectManager, ParameterBagInterface $params, PdfService $pdfService, MailService $mailService, Pdf $knpSnappyPdf, MediumManager $mediumManager)
{
$this->projectRepository = $projectRepository;
$this->addressRepository = $addressRepository;
$this->projectManager = $projectManager;
$this->params = $params;
$this->pdfService = $pdfService;
$this->mailService = $mailService;
$this->knpSnappyPdf = $knpSnappyPdf;
$this->mediumManager = $mediumManager;
}
/**
* @Route("/list/my", name="hbk_api_project_list_my", methods={"GET"})
*/
public function projectListMy(Request $request): Response
{
$admin_token = isset($parameters["_admin_token"]) ? $parameters["_admin_token"] : $request->query->get('_admin_token');
$is_admin = $admin_token == $this->params->get('adminToken');
if($request->query->get('_admin_token') == $this->params->get('adminToken')) {
$projects = $this->projectRepository->getMyProjects();
} else {
if($this->getUser() != null) {
$projects = $this->projectRepository->getMyProjects($this->getUser());
} else {
$response = new Response();
$response->setStatusCode(Response::HTTP_FORBIDDEN);
return $response;
}
}
$projects['is_admin'] = $is_admin;
return $this->json($projects);
}
/**
* @Route("/list/{category}/{campaign}", name="hbk_api_project_list")
* @Route("/list//{campaign}", name="hbk_api_project_list_no_category")
*/
public function projectList(string $category = null, string $campaign = null): Response
{
$projects = $this->projectRepository->getProjects($category, $campaign);
return new JsonResponse($projects);
}
/**
* @Route("/location/list/{category}/{campaign}", name="hbk_api_project_location_list")
* @Route("/location/list//{campaign}", name="hbk_api_project_location_list_no_category")
*/
public function projectLocationList(string $category = null, string $campaign = null): Response
{
$projects = $this->projectRepository->getProjectLocations($category, $campaign);
return new JsonResponse($projects);
}
/**
* @Route("/new", name="hbk_api_project_new", methods={"POST"})
* @Route("/edit/{id}", name="hbk_api_project_edit", methods={"PUT"})
*/
public function projectCreate($id = null, Request $request): Response
{
$parameters = json_decode($request->getContent(), true);
$response = new JsonResponse();
if((isset($parameters["_admin_token"]) && $parameters["_admin_token"] == $this->params->get('adminToken')) || ($this->getUser() != null && $this->getUser()->getId() == $parameters['submitter'])) {
if($id == null) {
$id = $this->projectManager->createProject($parameters);
$response->setStatusCode(Response::HTTP_CREATED);
if (isset($parameters['submission']) && $parameters['submission'] == 'submitted') {
$address = $this->addressRepository->find($parameters['submitter']);
$this->mailService->sendMailTemplate(
$this->params->get('sendMailTo'),
'Neue Projekteinreichung',
"mail/new_project.html.twig",
[
"parameters" => $parameters,
"address" => $address
]
);
}
if((isset($parameters["_admin_token"]) && $parameters["_admin_token"] == $this->params->get('adminToken'))) {
//Redirect to wp admin edit page
$response->setContent(json_encode([
"redirect_url" => 'admin.php?page=api-project-form-page&submission='.$id
]));
} else if (($this->getUser() != null && $this->getUser()->getId() == $parameters['submitter'])) {
//Redirect to public user page
$response->setContent(json_encode([
"redirect_url" => 'projekt-formular/?submission='.$id
]));
}
} else {
if (isset($parameters['submission']) && $parameters['submission'] == 'submitted') {
$address = $this->addressRepository->find($parameters['submitter']);
$this->mailService->sendMailTemplate(
$this->params->get('sendMailTo'),
'Neue Projekteinreichung',
"mail/new_project.html.twig",
[
"parameters" => $parameters,
"address" => $address
]
);
} else if (isset($parameters['submission']) && $parameters['submission'] == 'rejected') {
$address = $this->addressRepository->find($parameters['submitter']);
$mail = $address->getEmail();
if($mail != null && $mail != "") {
$this->mailService->sendMailTemplate(
$mail,
'Ihr Projekt wurde abgelehnt',
"mail/rejected_project.html.twig",
[
"id" => $id,
"parameters" => $parameters,
"address" => $address
]
);
}
}
$this->projectManager->editProject($id, $parameters);
$response->setStatusCode(Response::HTTP_OK);
}
} else {
$response->setStatusCode(Response::HTTP_FORBIDDEN);
}
return $response;
}
/**
* @Route("/edit/{id}", name="hbk_api_project_edit_info", methods={"GET"})
*/
public function projectEditInfo($id, Request $request): Response
{
$project = $this->projectManager->getProjectEditInfo($id);
if(($request->query->get('_admin_token') == $this->params->get('adminToken')) || $this->getUser()->getId() == $project['submitter']['id']) {
return $this->json($project);
}
$response = new Response();
$response->setStatusCode(Response::HTTP_FORBIDDEN);
return $response;
}
/**
* @Route("/delete/{id}", name="hbk_api_project_delete", methods={"DELETE"})
*/
public function projectDelete(int $id, Request $request): Response
{
$parameters = $request->request->all();
$response = new Response();
$submitter = $this->projectManager->getProjectSubmitter($id);
if((isset($parameters["_admin_token"]) && $parameters["_admin_token"] == $this->params->get('adminToken')) || $this->getUser() == $submitter) {
$this->projectManager->deleteProject($id);
$response->setStatusCode(Response::HTTP_OK);
} else {
$response->setStatusCode(Response::HTTP_FORBIDDEN);
}
return $response;
}
/**
* @Route("/{id}", name="hbk_api_project")
*/
public function project(int $id): Response
{
$project = $this->projectRepository->getProject($id);
$project["similar_projects"] = $this->projectRepository->findSimilarProjects($id);
return $this->json($project);
}
/**
* @Route("/slug/{slug}", name="hbk_api_project_slug")
*/
public function projectSlug(string $slug): Response
{
$project = $this->projectRepository->getProject(0, $slug);
$project["similar_projects"] = $this->projectRepository->findSimilarProjects($project['id']);
return $this->json($project);
}
/**
* @Route("/pdf/{id}", name="hbk_api_project_pdf")
*/
public function projectPdfExport(int $id): Response
{
$project = $this->projectRepository->find($id);
$pdf = $this->pdfService->Create($project);
return $pdf->Output('Projekt '.$project->getName().'.pdf', 'I');
}
/**
* @Route("/pdf_new/{id}", name="hbk_api_project_pdf_new")
*/
public function projectPdfExportNew(int $id): Response
{
$project = $this->projectRepository->find($id);
$images = [];
foreach ($project->getProjectMedia() as $key => $value) {
if ($value->getIsActive()) {
$images[$value->getSort()] = [
'id' => $value->getMedium()->getId(),
'label' => $value->getLabel(),
'url' => $this->mediumManager->getFilePath($value->getMedium()->getId(), 'ORIGINAL'),
];
}
}
foreach ($project->getProjectAttachments() as $key => $value) {
if ($value->getIsActive()) {
$images[$value->getSort()] = [
'id' => $value->getMedium()->getId(),
'label' => $value->getLabel(),
'url' => $value->getMedium()->getUrl() . '.jpg',
];
}
}
$this->knpSnappyPdf
->setOption('page-size', 'A0')
->setOption('margin-bottom', '0mm')
->setOption('margin-top', '0mm')
->setOption('margin-right', '0mm')
->setOption('margin-left', '0mm')
->setOption('dpi', '300');
$html = $this->renderView('pdf/project_pdf.html.twig', [
'project' => $project,
'images' => $images,
'category' => $project->getMainCategory()->getName()
]);
return new PdfResponse(
$this->knpSnappyPdf->getOutputFromHtml($html),
iconv("UTF-8", "ASCII//IGNORE", uniqid()).'.pdf'
);
}
/**
* @Route("/pdf_certificate/{id}", name="hbk_api_project_pdf_certificate")
*/
public function projectPdfExportCertificate(int $id): Response
{
$project = $this->projectRepository->find($id);
$images = [];
foreach ($project->getProjectCertificates() as $project_certificate) {
$proof_files = $project_certificate->getProofFiles();
if(sizeof($proof_files) > 0) {
foreach ($proof_files as $file) {
$images[$project_certificate->getId()][] = [
'id' => $file->getMedium()->getId(),
'url' => $file->getMedium()->getType() == "application/pdf" ? $file->getMedium()->getUrl().'.jpg' : $this->mediumManager->getFilePath($file->getMedium()->getId(), 'ORIGINAL'),
];
}
}
}
$this->knpSnappyPdf
->setOption('page-size', 'A4')
->setOption('margin-bottom', '0mm')
->setOption('margin-top', '0mm')
->setOption('margin-right', '0mm')
->setOption('margin-left', '0mm')
->setOption('dpi', '300');
$html = $this->renderView('pdf/project_certificate.html.twig', [
'project' => $project,
'images' => $images,
'category' => $project->getMainCategory()->getName()
]);
return new PdfResponse(
$this->knpSnappyPdf->getOutputFromHtml($html),
iconv("UTF-8", "ASCII//IGNORE", uniqid()).' - Sonderpreis Info.pdf'
);
}
/**
* @Route("/pdf/data/{id}", name="hbk_api_project_pdf_data")
*/
public function projectPdfDataExport(int $id): Response
{
$project = $this->projectRepository->find($id);
$pdf = $this->pdfService->generateDetailPDF($project);
return $pdf->Output('Projekt '.$project->getName().'.pdf', 'I');
}
}