<?php
namespace App\Controller;
use App\Entity\Gender;
use App\Entity\Report;
use App\Repository\GenderRepository;
use App\Repository\ReportRepository;
use App\Service\GenderService;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Contracts\HttpClient\HttpClientInterface;
/**
* @Route("/api/v1", name="app_api_")
*/
class ApiController extends AbstractController
{
/**
* @Route("/guess-gender/{name}", name="guess_gender")
*/
public function guessGender($name, GenderService $finder): Response
{
return new JsonResponse($finder->guess($name));
}
/**
* @Route("/update-gender/{name}", name="update_gender", methods={"POST","GET"})
*/
public function updateGender(Request $request, String $name, GenderRepository $genderRepository): Response
{
$status = false;
$name = trim(strtolower($name));
$json = json_decode($request->getContent(), true);
$value = $json['gender'] ?? Gender::TYPE_UNKNOWN;
if (in_array($value, [
Gender::TYPE_FEMALE,
Gender::TYPE_MALE,
Gender::TYPE_UNKNOWN
])) {
$gender = $genderRepository->findOneBy(['name' => $name]);
if (!$gender) {
$gender = new Gender();
$gender->setName($name);
}
$status = true;
$gender->setGender($value);
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($gender);
$entityManager->flush();
}
return new JsonResponse(compact('status'));
}
/**
* @Route("/report/{id}", name="report_data")
*/
public function getReportData(String $id, ReportRepository $reportRepository, Request $request): Response
{
$user = $this->getUser();
$hasAccess = true;
if (!$user) {
$session = $request->getSession();
$hasAccess = intval($session->get('anonymous_report_id', null)) == $id;
}
if ($hasAccess) {
$report = $reportRepository->findOneBy(['id' => $id]);
if ($report) {
$article = $report->getSource();
$data = [
'type' => $report->getType(),
'overall' => $report->getOverallScore(),
'raw' => $report->getRaw(),
'status' => $report->getStatus(),
'body' => $article ? $article->getBody() : "",
'indicators' => []
];
$indicators = $report->getIndicators();
foreach ($indicators as $indicator) {
$data['indicators'][$indicator->getId()] = [
'slug' => $indicator->getIndicator()->getSlug(),
'value' => $indicator->getValue(),
'meta' => $indicator->getMeta(),
'status' => $indicator->getStatus()
];
}
return new JsonResponse($data);
}
}
return new JsonResponse(null);
}
}