rater/src/Controller/Api/RatingController.php

111 lines
2.9 KiB
PHP
Raw Normal View History

2026-06-05 00:00:51 +02:00
<?php
namespace App\Controller\Api;
use App\Entity\Rating;
2026-06-06 00:32:53 +02:00
use App\Entity\User;
2026-06-06 00:51:24 +02:00
use App\Presenter\RatingPresenter;
2026-06-05 00:00:51 +02:00
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;
2026-06-06 00:32:53 +02:00
use Symfony\Component\Security\Http\Attribute\CurrentUser;
2026-06-05 00:00:51 +02:00
class RatingController extends AbstractController
{
#[Route('/api/ratings', methods: ['GET'])]
public function index(
RatingRepository $repo,
OutputService $output,
2026-06-06 00:51:24 +02:00
RatingPresenter $ratingPresenter,
2026-06-05 00:00:51 +02:00
): JsonResponse {
return $this->json($output->success([
2026-06-06 00:51:24 +02:00
'ratings' => $ratingPresenter->presentMany($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,
2026-06-06 00:32:53 +02:00
#[CurrentUser]
User $user
2026-06-05 00:00:51 +02:00
): 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);
2026-06-06 00:32:53 +02:00
$rating->setUser($user);
2026-06-05 00:00:51 +02:00
$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
}