<?php
namespace App\Controller\Api;
use App\Entity\HelpCenterCategory;
use App\Entity\HelpCenterArticle;
use App\Service\Rsa;
use App\Service\Tools;
use App\Service\SerializeService;
use App\Service\TranslationService;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\Common\Collections\Criteria;
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 HelpCenterController
* @package App\Controller\Api
* @Route(path="/api/help/center", name="api_help_center")
*/
class HelpCenterController extends AbstractController
{
private EntityManagerInterface $em;
private Rsa $rsa;
private TranslatorInterface $translator;
private SerializeService $serializeService;
public function __construct(
EntityManagerInterface $em,
Rsa $rsa,
TranslatorInterface $translator,
SerializeService $serializeService
) {
$this->em = $em;
$this->rsa = $rsa;
$this->translator = $translator;
$this->serializeService = $serializeService;
}
/**
* Find all main categories (the root ones that are not linked to a parent)
* @param Request $request
* @return JsonResponse
* @Route("/category/main", name="category_find_main")
*/
public function categoryFindMain(Request $request): JsonResponse
{
if (!$this->rsa->isValidToken($request->request->get('apiKey'))) {
return new JsonResponse([
'success' => false,
'message' => $this->translator->trans('global.invalidToken'),
]);
}
$criteria = Criteria::create()
->where(Criteria::expr()->eq('parent', null));
$categories = $this->em->getRepository(HelpCenterCategory::class)->matching($criteria);
$data = [];
foreach ($categories as $category) {
$data[] = $this->serializeService->serializeHelpCenterCategory($category);
}
return new JsonResponse([
'success' => true,
'categories' => $data,
]);
}
/**
* @param HelpCenterCategory $category
* @param Request $request
* @return JsonResponse
* @Route("/category/{category}", name="category_find", requirements={"category"="\d+"})
*/
public function categoryFind(HelpCenterCategory $category, 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,
'category' => $this->serializeService->serializeHelpCenterCategory($category),
]);
}
/**
* @param Request $request
* @return JsonResponse
* @Route("/article", name="article_find_all")
*/
public function articleFindAll(Request $request): JsonResponse
{
if (!$this->rsa->isValidToken($request->request->get('apiKey'))) {
return new JsonResponse([
'success' => false,
'message' => $this->translator->trans('global.invalidToken'),
]);
}
$articles = $this->em->getRepository(HelpCenterArticle::class)->findBy([], ['id' => 'ASC']);
$data = [];
foreach ($articles as $article) {
$data[] = $this->serializeService->serializeHelpCenterArticle($article);
}
return new JsonResponse([
'success' => true,
'articles' => $data,
]);
}
/**
* @param HelpCenterArticle $article
* @param Request $request
* @return JsonResponse
* @Route("/article/{article}", name="article_find", requirements={"article"="\d+"})
*/
public function articleFind(HelpCenterArticle $article, Request $request): JsonResponse
{
if (!$this->rsa->isValidToken($request->request->get('apiKey'))) {
return new JsonResponse([
'success' => false,
'message' => $this->translator->trans('global.invalidToken'),
]);
}
$article->setNumberOfViews($article->getNumberOfViews() + 1);
$this->em->persist($article);
$this->em->flush();
return new JsonResponse([
'success' => true,
'article' => $this->serializeService->serializeHelpCenterArticle($article),
]);
}
/**
* @param HelpCenterArticle $article
* @param Request $request
* @return JsonResponse
* @Route("/article/{article}/feedback", name="article_feedback", requirements={"article"="\d+"})
*/
public function articleFeedback(HelpCenterArticle $article, 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);
$helpful = $data['helpful'];
if ($helpful) {
$article->setHelpful($article->getHelpful() + 1);
} else {
$article->setNotHelpful($article->getNotHelpful() + 1);
}
$this->em->persist($article);
$this->em->flush();
return new JsonResponse([
'success' => true,
]);
}
}