rater/src/Controller/Api/SubjectController.php

127 lines
3.4 KiB
PHP
Raw Normal View History

2026-06-03 23:49:30 +02:00
<?php
namespace App\Controller\Api;
use App\Entity\Restaurant;
2026-06-05 13:15:30 +02:00
use App\Entity\User;
2026-06-06 00:51:24 +02:00
use App\Presenter\SubjectPresenter;
2026-06-03 23:49:30 +02:00
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-05 13:15:30 +02:00
use Symfony\Component\Security\Http\Attribute\CurrentUser;
2026-06-03 23:49:30 +02:00
class SubjectController extends AbstractController
{
#[Route('/api/subjects', methods: ['GET'])]
public function index(
SubjectRepository $repo,
OutputService $output,
2026-06-06 00:51:24 +02:00
SubjectPresenter $subjectPresenter,
2026-06-03 23:49:30 +02:00
): JsonResponse {
2026-06-06 00:51:24 +02:00
return $this->json($output->success([
'subjects' => $subjectPresenter->presentMany($repo->findAll()),
]));
2026-06-03 23:49:30 +02:00
}
#[Route('/api/subjects', methods: ['POST'])]
public function create(
Request $request,
EntityManagerInterface $em,
2026-06-05 13:15:30 +02:00
#[CurrentUser]
User $user,
2026-06-03 23:49:30 +02:00
): JsonResponse {
2026-06-05 15:24:19 +02:00
$payload = $request->getPayload();
2026-06-03 23:49:30 +02:00
$subject = new Restaurant();
2026-06-05 15:24:19 +02:00
$subject->setName($payload->get('name'));
2026-06-05 13:15:30 +02:00
$subject->setCreatedBy($user);
2026-06-03 23:49:30 +02:00
2026-06-05 15:24:19 +02:00
if ($payload->has('latitude')) {
$subject->setLatitude($payload->getString('latitude'));
}
if ($payload->has('longitude')) {
$subject->setLongitude($payload->getString('longitude'));
}
2026-06-03 23:49:30 +02:00
$em->persist($subject);
$em->flush();
return $this->json(null, 201);
}
2026-06-05 13:57:21 +02:00
#[Route('/api/subjects/{id}', methods: ['GET'])]
public function show(
int $id,
SubjectRepository $repository,
SubjectPresenter $presenter,
OutputService $output,
): JsonResponse {
$subject = $repository->find($id);
if ($subject === null) {
return $this->json($output->error(['UNKNOWN_SUBJECT']), 404);
}
return $this->json($output->success(['subject' => $presenter->present($subject)]));
}
2026-06-05 13:57:21 +02:00
#[Route('/api/subjects/{id}', methods: ['PATCH'])]
public function update(
int $id,
Request $request,
EntityManagerInterface $em,
OutputService $output,
SubjectRepository $repository,
): JsonResponse {
2026-06-05 14:09:34 +02:00
$subject = $repository->find($id);
2026-06-05 13:57:21 +02:00
if ($subject === null) {
return $this->json(
2026-06-05 14:09:34 +02:00
$output->error(["UNKNOWN_SUBJECT"])
2026-06-05 13:57:21 +02:00
);
}
$payload = $request->getPayload();
if ($payload->has('name')) {
$subject->setName($payload->getString('name'));
}
2026-06-05 15:24:19 +02:00
if ($payload->has('latitude')) {
$subject->setLatitude($payload->getString('latitude'));
}
if ($payload->has('longitude')) {
$subject->setLongitude($payload->getString('longitude'));
}
2026-06-05 13:57:21 +02:00
$em->flush();
return $this->json(null, 202);
}
#[Route('/api/subjects/{id}', methods: ['DELETE'])]
public function delete(
int $id,
EntityManagerInterface $em,
OutputService $output,
SubjectRepository $repository,
): JsonResponse {
2026-06-05 14:09:34 +02:00
$subject = $repository->find($id);
2026-06-05 13:57:21 +02:00
if ($subject === null) {
2026-06-05 14:09:34 +02:00
return $this->json($output->error(["UNKNOWN_SUBJECT"]));
2026-06-05 13:57:21 +02:00
}
$em->remove($subject);
$em->flush();
return $this->json(null, 204);
}
2026-06-03 23:49:30 +02:00
}