<?php
namespace Bidcoz\Bundle\CoreBundle\Controller;
use Bidcoz\Bundle\CoreBundle\BidcozCoreServices;
use Bidcoz\Bundle\ManageBundle\Form\Type\FastListFilterConfig;
use Bidcoz\Bundle\ManageBundle\Form\Type\FastListFilterType;
use Doctrine\ORM\QueryBuilder;
use Doctrine\ORM\Tools\Pagination\Paginator;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Form\FormError;
use Symfony\Component\Form\FormErrorIterator;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Validator\ConstraintViolation;
abstract class CoreController extends AbstractController
{
use BidcozCoreServices;
protected array $hostRedirectMap = [
'nvidia.causepilot.com' => '/nvidia/nvpride2025',
'chg.causepilot.com' => '/chg/madw2024',
];
protected function returnJson($data, $convert = false, $status = 200)
{
// TODO: Fix and refactor calls to \Bidcoz\Bundle\CoreBundle\Controller\CoreController::returnJson
// Fixes calls with wrong set of parameters such as: $this->returnJson($payload, 400)
if (is_numeric($convert)) {
$status = $convert;
$convert = false;
}
$data = $convert
? json_decode($data)
: $data;
return new JsonResponse($data, $status);
}
protected function returnResponse(string $data, $status = 200)
{
return new Response($data, $status);
}
protected function returnRedirect(string $url)
{
return new RedirectResponse($url);
}
protected function returnJsonSuccess($message = 'success', array $data = [])
{
return $this->returnJson(array_merge($data, [
'status' => 'ok',
'message' => $message,
]));
}
protected function returnJsonError($errors, array $data = [])
{
if ($errors instanceof FormErrorIterator) {
$errorArray = array_map(function ($error) {
return $error->getMessage();
}, iterator_to_array($errors));
} elseif (is_array($errors)) {
$errorArray = $errors;
} else {
$errorArray = 'Unexpected Error';
}
return $this->returnJson(array_merge($data, [
'status' => 'error',
'errors' => $errors,
]), false, 400);
}
protected function getPagination($paginatable)
{
return $this->getPaginator()->paginate(
$paginatable,
$this->getRequestStack()->getCurrentRequest()->query->get('page', 1),
24
);
}
protected function applyFilters(Request $request, FormInterface $filterForm, QueryBuilder $qb)
{
if ($request->query->has($filterForm->getName())) {
$filterForm->submit($request->query->get($filterForm->getName()));
$this->getQueryBuilderFilter()->addFilterConditions($filterForm, $qb);
return true;
}
return false;
}
protected function messageAccessDeniedException($message, $type = 'info')
{
$this->addFlash($type, $message);
throw $this->createAccessDeniedException($message);
}
protected function isSuperAdmin(): bool
{
return $this
->get('security.authorization_checker')
->isGranted('ROLE_SUPER_ADMIN');
}
protected function getFormErrorMessage(FormError $error): string
{
$message = $error->getMessage();
$cause = $error->getCause();
$path = $cause && $cause instanceof ConstraintViolation
? $cause->getPropertyPath()
: null;
return $path
? sprintf('%s - %s', $path, $message)
: $message;
}
protected function getFastListFilterForm(FastListFilterConfig $config)
{
return $this->createForm(FastListFilterType::class, [], [
'config' => $config,
]);
}
protected function applyFastListFilters(Request $request, FormInterface $form, QueryBuilder $qb)
{
if ($request->query->has($form->getName())) {
$form->submit($request->query->get($form->getName()));
$data = $form->getData();
$config = $form->getConfig()->getOptions()['config'];
foreach ($config->all() as $field => $fieldConfig) {
if ($data[$field]) {
$qb
->andWhere(sprintf('%s = :%s', $fieldConfig['mapping'], $field))
->setParameter($field, $data[$field]);
}
}
}
}
protected function checkRedirectToFastListRoute(Request $request)
{
$campaign = $request->attributes->get('campaign');
$user = $this->getUser();
if ($user->getUseFastList() || $campaign->isUseFastList()) {
// Continue
} else {
return;
}
$request->attributes->set('_is_fast_list_route', true);
if ($request->cookies->has('_fast_list_override')) {
return;
}
$url = sprintf('%s/fast-list', $request->getPathInfo());
return $this->returnRedirect($url);
}
protected function paginate(Request $request, QueryBuilder $qb): array
{
$page = intval($request->query->get('page', 1));
$pageSize = intval(min(100, $request->query->get('pageSize', 25)));
$query = $qb->getQuery();
$query->setMaxResults($pageSize);
if ($page > 1) {
$query->setFirstResult($pageSize * ($page - 1));
}
// The base url is the URL minus the page parameter if present
$hasParams = false;
$urlParams = $request->query->all();
unset($urlParams['page']);
$clearUrl = $request->getPathInfo();
if (count($urlParams)) {
$hasParams = true;
$baseUrl = $clearUrl.'?'.http_build_query($urlParams);
} else {
$baseUrl = $clearUrl;
}
$paginatable = new Paginator($query);
$totalRecords = $paginatable->count();
$totalPages = ceil($totalRecords / $pageSize);
// Decide what page(s) to show
$firstPage = 1;
$lastPage = $totalPages;
if ($totalPages > 10) {
$firstPage = $page > 3 ? $page : 1;
$lastPage = min($totalPages, $firstPage + 10);
}
return [
'paginatable' => $paginatable,
'page' => $page,
'pageSize' => $pageSize,
'totalPages' => $totalPages,
'totalRecords' => $totalRecords,
'firstPage' => $firstPage,
'lastPage' => $lastPage,
'base_url' => $baseUrl,
'has_params' => $hasParams,
'clear_url' => $clearUrl,
];
}
}