<?php
namespace Harmonizely\Core\Response\Json;
use Harmonizely\Core\Exception\Contract\IBaseException;
use Harmonizely\Core\Response\Contract\IResponseBuilder;
use Harmonizely\Core\Serializer\Contract\ISerializer;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Response;
use Twig\Environment;
use Twig\Error\LoaderError;
use Twig\Error\RuntimeError;
use Twig\Error\SyntaxError;
/**
* Class ResponseBuilder
*
* @package Harmonizely\Core\Response\Json
*/
class ResponseBuilder implements IResponseBuilder
{
/**
* @var ISerializer
*/
private ISerializer $serializer;
/**
* @var RequestStack
*/
private RequestStack $requestStack;
/**
* @var Environment
*/
private Environment $twig;
/**
* ResponseBuilder constructor.
*
* @param ISerializer $serializer
* @param RequestStack $requestStack
* @param Environment $twig
*/
public function __construct(ISerializer $serializer, RequestStack $requestStack, Environment $twig)
{
$this->serializer = $serializer;
$this->requestStack = $requestStack;
$this->twig = $twig;
}
/**
* Build serializer response data
*
* @param $data
* @param array $groups
* @param callable|null $circularReferenceHandler
* @return Response
*/
public function buildResponse($data, array $groups = [], ?callable $circularReferenceHandler = null): Response
{
return new SerializedResponse($this->serializer->serialize($data, $groups, $circularReferenceHandler));
}
/**
* Build empty response
*
* @return Response
*/
public function buildEmptyResponse(): Response
{
return new EmptyResponse();
}
/**
* Build exception response
*
* @param IBaseException $exception
* @return Response
* @throws LoaderError
* @throws RuntimeError
* @throws SyntaxError
*/
public function buildExceptionResponse(IBaseException $exception): Response
{
$request = $this->requestStack->getCurrentRequest();
if ($request && $request->getPreferredFormat() === 'html' && strpos($request->getContentType(), 'json') === false && !$request->headers->has('X-AUTH-TOKEN') && !$request->headers->has('X-API-KEY')) {
return new Response(
$this->twig->render('common/error.html.twig', [
'error' => $exception->getMessage(),
'data' => $exception->getData(),
'code' => $exception->getCode(),
'exception' => $exception,
]), $exception->getCode()
);
}
return new ExceptionResponse($exception);
}
}