chill-bundles/src/Bundle/ChillCalendarBundle/Controller/CalendarRangeAPIController.php
2022-05-11 21:27:47 +02:00

69 lines
2.5 KiB
PHP

<?php
/**
* Chill is a software for social workers
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*/
declare(strict_types=1);
namespace Chill\CalendarBundle\Controller;
use Chill\MainBundle\CRUD\Controller\ApiController;
use DateTime;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use function count;
class CalendarRangeAPIController extends ApiController
{
/**
* @Route("/api/1.0/calendar/calendar-range-available.{_format}", name="chill_api_single_calendar_range_available")
*/
public function availableRanges(Request $request, string $_format): JsonResponse
{
$em = $this->getDoctrine()->getManager();
$sql = 'SELECT c FROM ChillCalendarBundle:CalendarRange c
WHERE NOT EXISTS (SELECT cal.id FROM ChillCalendarBundle:Calendar cal WHERE cal.calendarRange = c.id)';
if ($request->query->has('user')) {
$user = $request->query->get('user');
$sql = $sql . ' AND c.user = :user';
$query = $em->createQuery($sql)
->setParameter('user', $user);
if ($request->query->has('start') && $request->query->has('end')) {
$startDate = $request->query->get('start');
$endDate = $request->query->get('end');
$sql = $sql . ' AND c.startDate > :startDate AND c.endDate < :endDate';
$query = $em ->createQuery($sql)
->setParameter('startDate', $startDate)
->setParameter('endDate', $endDate)
->setParameter('user', $user);
}
if($request->query->has('start') && !$request->query->has('end')) {
$startDate = $request->query->get('start');
$sql = $sql . ' AND c.startDate > :startDate + INTERVAL "1 DAY"';
dump($sql);
$query = $em ->createQuery($sql)
->setParameter('startDate', $startDate)
->setParameter('user', $user);
}
} else {
$query = $em->createQuery($sql);
}
$results = $query->getResult();
return $this->json(['count' => count($results), 'results' => $results], Response::HTTP_OK, [], ['groups' => ['read']]);
//TODO use also the paginator, eg return $this->serializeCollection('get', $request, $_format, $paginator, $results);
}
}