<?php
namespace App\Controller\Api;
use App\Entity\Article;
use App\Service\Rsa;
use App\Service\SerializeService;
use App\Service\Tools;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Contracts\Translation\TranslatorInterface;
/**
* Class ArticleController
* @package App\Controller\Api
* @Route(path="/api/article", name="api_article_")
*/
class ArticleController extends AbstractController
{
private EntityManagerInterface $em;
private SerializeService $serializeService;
private Rsa $rsa;
private TranslatorInterface $translator;
public function __construct(
EntityManagerInterface $em,
SerializeService $serializeService,
Rsa $rsa,
TranslatorInterface $translator
) {
$this->em = $em;
$this->serializeService = $serializeService;
$this->rsa = $rsa;
$this->translator = $translator;
}
/**
* Find the 12 most recent articles and the others after that (paginated, by batch)
* @param Request $request
* @return JsonResponse
* @Route("", name="find_all_with_pagination")
*/
public function findAllWithPagination(Request $request): JsonResponse
{
if (!$this->rsa->isValidToken($request->request->get('apiKey'))) {
return new JsonResponse([
'success' => false,
'message' => $this->translator->trans('global.invalidToken'),
]);
}
$data = Tools::getRequestData($request);
$page = $data['page'];
$serializedArticles = [];
/** @var Article[] $articles */
$articles = $this->em->getRepository(Article::class)->findAllWithPagination($page);
foreach ($articles as $article) {
$serializedArticles[] = $this->serializeService->serializeArticleOverview($article);
}
return new JsonResponse([
'success' => true,
'articles' => $serializedArticles,
]);
}
/**
* @param Article $article
* @param Request $request
* @return JsonResponse
* @Route("/{article}", name="find", requirements={"article"="\d+"})
*/
public function find(Article $article, Request $request): JsonResponse
{
if (!$this->rsa->isValidToken($request->request->get('apiKey'))) {
return new JsonResponse([
'success' => false,
'message' => $this->translator->trans('global.invalidToken'),
]);
}
return new JsonResponse([
'success' => true,
'article' => $this->serializeService->serializeArticle($article),
]);
}
/**
* @param Request $request
* @return JsonResponse
* @Route("/last", name="find_two_last")
*/
public function findTwoLast(Request $request): JsonResponse
{
if (!$this->rsa->isValidToken($request->request->get('apiKey'))) {
return new JsonResponse([
'success' => false,
'message' => $this->translator->trans('global.invalidToken'),
]);
}
$data = [];
/** @var Article[] $articles */
$articles = $this->em->getRepository(Article::class)->findBy(['active' => true], ['date' => 'DESC'], 2, 0);
foreach ($articles as $article) {
$data[] = $this->serializeService->serializeArticleOverview($article);
}
return new JsonResponse([
'success' => true,
'articles' => $data,
]);
}
}