<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use App\Repository\AddressRepository;
use App\Entity\Address;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\JsonResponse;
use Doctrine\ORM\EntityManagerInterface;
/**
* @Route("/api/address")
*/
class AddressesController extends AbstractController
{
/**
* @var AddressRepository
*/
private $addressRepository;
/**
* @var ParameterBagInterface
*/
private $params;
public function __construct(AddressRepository $addressRepository, ParameterBagInterface $params, EntityManagerInterface $em)
{
$this->addressRepository = $addressRepository;
$this->params = $params;
$this->em = $em;
}
/**
* @Route("/new", name="hbk_api_address_new", methods={"POST"})
* @Route("/edit/{id}", name="hbk_api_address_edit", methods={"PUT"})
*/
public function addressCreate(int $id = null, Request $request): Response
{
$parameters = json_decode($request->getContent(), true);
$response = new JsonResponse();
if($id == null) {
if(isset($parameters["_admin_token"]) && $parameters["_admin_token"] == $this->params->get('adminToken')) {
$id = $this->addressRepository->createAddress($parameters);
$response->setStatusCode(Response::HTTP_CREATED);
$response->setContent(json_encode([
"redirect_url" => 'admin.php?page=api-address-form-page&address='.$id
]));
} else if($this->getUser() != null) {
$params = [];
// $params['email'] = $parameters['email'];
$params['location'] = $parameters['location'];
$params['member_group'] = $parameters['member_group'];
$params['name'] = $parameters['name'];
$params['street'] = $parameters['street'];
$params['web'] = $parameters['web'];
$id = $this->addressRepository->createAddress($params);
$response->setStatusCode(Response::HTTP_CREATED);
$response->setContent(json_encode([
"redirect_url" => 'admin.php?page=api-address-form-page&address='.$id
]));
}
else {
$response->setStatusCode(Response::HTTP_FORBIDDEN);
}
} else {
if((isset($parameters["_admin_token"]) && $parameters["_admin_token"] == $this->params->get('adminToken')) || ($this->getUser() != null && $this->getUser()->getId() == $id)) {
$this->addressRepository->editAddress($id, $parameters);
$response->setStatusCode(Response::HTTP_OK);
} else {
$response->setStatusCode(Response::HTTP_FORBIDDEN);
}
}
return $response;
}
/**
* @Route("/delete/{id}", name="hbk_api_address_delete", methods={"POST"})
*/
public function addressDelete(int $id, Request $request): Response
{
$parameters = $request->request->all();
$response = new JsonResponse();
if((isset($parameters["_admin_token"]) && $parameters["_admin_token"] == $this->params->get('adminToken')) || ($this->getUser() != null && $this->getUser()->getId() == $id)) {
$address = $this->addressRepository->find($id);
if (isset($parameters["descendant"]) && $parameters["descendant"] != null) {
$descendant = $this->addressRepository->find($parameters["descendant"]);
foreach($address->getProjectTasks() as $task){
$descendant->addProjectTask($task);
$address->removeProjectTask($task);
}
foreach($address->getProjectArchitects() as $ar){
$descendant->addProjectArchitect($ar);
$address->removeProjectArchitect($ar);
}
foreach($address->getProjectCarpenters() as $cp){
$descendant->addProjectCarpenter($cp);
$address->removeProjectCarpenter($cp);
}
foreach($address->getProjects() as $pj) {
$descendant->addProject($pj);
$address->removeProject($pj);
}
$address->setDescendant($descendant);
$this->em->persist($descendant);
}
if ($address != null) {
$address->setDeleted(true);
$this->em->persist($address);
$this->em->flush();
}
$response->setStatusCode(Response::HTTP_OK);
} else {
$response->setStatusCode(Response::HTTP_FORBIDDEN);
}
return $response;
}
/**
* @Route("/categories", name="hbk_api_address_category_list")
*/
public function addressCategoryList(): Response
{
$categories = $this->addressRepository->getAddressCategories();
return $this->json($categories);
}
/**
* @Route("/search-detail", name="hbk_api_address_search_detail")
*/
public function addressSearchDetail(Request $request): Response
{
$parameters = [
"name" => $request->query->get('name'),
"location" => $request->query->get('location'),
"email" => $request->query->get('email'),
];
$addresses = $this->addressRepository->searchAddressesDetail($parameters);
return $this->json($addresses);
}
/**
* @Route("/search/{search}/{category}", name="hbk_api_address_search")
* @Route("/search//{category}", name="hbk_api_address_search_no_search")
*/
public function addressSearch(string $search = null, string $category = null): Response
{
$addresses = $this->addressRepository->searchAddresses($search, $category);
return $this->json($addresses);
}
/**
* @Route("/paginated/{max_results}/{offset}", name="hbk_api_address_paginated")
* @Route("/paginated/{max_results}/{offset}/{search}/{category}", name="hbk_api_address_paginated_search")
* @Route("/paginated/{max_results}/{offset}//{category}", name="hbk_api_address_paginated_category")
*/
public function paginatedAddresses(string $max_results = null, string $offset = null, string $search = null, string $category = null): Response
{
$addresses = $this->addressRepository->paginatedAddresses($search, $category, $max_results, $offset);
return $this->json($addresses);
}
/**
* @Route("/{category}", name="hbk_api_address_list")
*/
public function addressList(string $category = ''): Response
{
$addresses = $this->addressRepository->getAddresses($category);
return $this->json($addresses);
}
/**
* @Route("/manage/new", name="hbk_api_address_form_new")
* @Route("/manage/edit/{id}", name="hbk_api_address_form")
*/
public function editForm(int $id = null, Request $request): Response
{
$parameters = json_decode($request->getContent(), true);
$admin_token = isset($parameters["_admin_token"]) ? $parameters["_admin_token"] : $request->query->get('_admin_token');
$is_admin = $admin_token == $this->params->get('adminToken');
$user = $this->getUser();
if($id === null) {
if($user != null) {
$address = $user;
} else {
$address = new Address();
}
} else {
$address = $this->addressRepository->find($id);
}
$can_access = $is_admin || ($user && $address && $user->getId() === $address->getId());
if (!$can_access) {
$response = new Response();
$response->setStatusCode(Response::HTTP_FORBIDDEN);
return $response;
}
$addressJson = $address->jsonSerialize();
$addressJson["logo"] = $address->getLogo(); // Pass in a Medium object to template.
$address_categories = $this->addressRepository->getAddressCategories();
return $this->render('address/ajax.html.twig', [
'user' => $user,
'is_admin' => $is_admin,
'admin_token' => $admin_token,
'address' => $addressJson,
'address_categories' => $address_categories,
]);
}
/**
* @Route("/manage/overview/{page}", name="hbk_api_address_overview")
* @Route("/manage/overview/{category}/{page}", name="hbk_api_address_overview_category")
*/
public function overview(string $category = '', int $page = 1, Request $request): Response
{
$parameters = json_decode($request->getContent(), true);
$admin_token = isset($parameters["_admin_token"]) ? $parameters["_admin_token"] : $request->query->get('admin_token');
$is_admin = $admin_token == $this->params->get('adminToken');
$can_access = $is_admin;
if (!$can_access) {
$response = new Response();
$response->setStatusCode(Response::HTTP_FORBIDDEN);
return $response;
}
$address_categories = $this->addressRepository->getAddressCategories();
$allAddresses = $this->addressRepository->getAddresses($category);
$itemsPerPage = 100;
$pages = ceil(floatval(count($allAddresses)) / floatval($itemsPerPage));
$addresses = array_slice($allAddresses, ($page-1)*$itemsPerPage, $itemsPerPage);
return $this->render('address/overview.html.twig', [
'token' => $admin_token,
'page' => $page,
'pages' => $pages,
'addresses' => $addresses,
'is_admin' => $is_admin,
'category' => $category,
'address_categories' => $address_categories,
]);
}
}