rater/src/Controller/Api/RatingController.php

114 lines
3.1 KiB
PHP
Raw Normal View History

2026-06-05 00:00:51 +02:00
<?php
namespace App\Controller\Api;
use App\Entity\Rating;
use App\Repository\RatingRepository;
use App\Repository\SubjectRepository;
use App\Services\OutputService;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Attribute\Route;
class RatingController extends AbstractController
{
#[Route('/api/ratings', methods: ['GET'])]
public function index(
RatingRepository $repo,
OutputService $output,
): JsonResponse {
return $this->json($output->success([
'ratings' => array_map(
fn(Rating $rating) => [
'id' => $rating->getId(),
'score' => $rating->getScore(),
'subject' => [
'id' => $rating->getSubject()->getId(),
'name' => $rating->getSubject()->getName(),
],
],
$repo->findAll()
),
2026-06-05 13:00:09 +02:00
]), 200);
2026-06-05 00:00:51 +02:00
}
#[Route('/api/ratings', methods: ['POST'])]
public function create(
Request $request,
EntityManagerInterface $em,
OutputService $output,
SubjectRepository $subjectRepository,
): JsonResponse {
2026-06-05 14:09:34 +02:00
$subject = $subjectRepository->find($request->getPayload()->get('subject_id'));
2026-06-05 00:00:51 +02:00
if ($subject === null) {
return $this->json(
$output->error(["UNKNOWN_SUBJECT"])
);
}
$rating = new Rating();
$rating->setSubject($subject);
$rating->setScore($request->getPayload()->get('score'));
$em->persist($rating);
$em->flush();
return $this->json(null, 201);
}
2026-06-05 00:20:33 +02:00
#[Route('/api/ratings/{id}', methods: ['PATCH'])]
public function update(
int $id,
Request $request,
EntityManagerInterface $em,
OutputService $output,
RatingRepository $ratingRepository,
): JsonResponse {
2026-06-05 14:09:34 +02:00
$rating = $ratingRepository->find($id);
2026-06-05 00:20:33 +02:00
if ($rating === null) {
return $this->json(
$output->error(["UNKNOWN_RATING"])
);
}
$payload = $request->getPayload();
if ($payload->has('score')) {
$rating->setScore($payload->getInt('score'));
}
if ($payload->has('note')) {
$rating->setNote($payload->getString('note'));
}
$em->flush();
2026-06-05 13:00:09 +02:00
return $this->json(null, 202);
}
#[Route('/api/ratings/{id}', methods: ['DELETE'])]
public function delete(
int $id,
EntityManagerInterface $em,
OutputService $output,
RatingRepository $ratingRepository,
): JsonResponse {
2026-06-05 14:09:34 +02:00
$rating = $ratingRepository->find($id);
2026-06-05 13:00:09 +02:00
if ($rating === null) {
return $this->json(
$output->error(["UNKNOWN_RATING"])
);
}
$em->remove($rating);
$em->flush();
return $this->json(null, 204);
2026-06-05 00:20:33 +02:00
}
2026-06-05 00:00:51 +02:00
}