<?php
namespace App\Controller;
use App\Entity\ActionTrace;
use App\Entity\Prospect;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Security;
class ActionTraceController extends AbstractController
{
private $entityManager;
private $security;
public function __construct(EntityManagerInterface $entityManager, Security $security)
{
$this->entityManager = $entityManager;
$this->security = $security;
}
/**
* @Route("/action/trace", name="create_action_trace", methods={"POST"})
*/
public function createActionTrace(Request $request): JsonResponse
{
$data = $request->toArray();
$prospectId = $data['prospectId'] ?? null;
$type = $data['type'] ?? null;
$description = $data['description'] ?? null;
$date = $data['date'] ?? null;
$user = $this->security->getUser();
if (!$prospectId || !$type || !$user || !$date) {
return new JsonResponse(['error' => 'Missing parameters'], 400);
}
$prospect = $this->entityManager->getRepository(Prospect::class)->find($prospectId);
if (!$prospect) {
return new JsonResponse(['error' => 'Prospect not found'], 404);
}
try {
$createdAt = new \DateTimeImmutable($date);
} catch (\Exception $e) {
return new JsonResponse(['error' => 'Invalid date format'], 400);
}
$actionTrace = new ActionTrace();
$actionTrace->setProspect($prospect);
$actionTrace->setType($type);
$actionTrace->setDescription($description);
$actionTrace->setCreatedAt($createdAt);
$actionTrace->setUser($user);
$this->entityManager->persist($actionTrace);
$this->entityManager->flush();
return new JsonResponse(['success' => 'Action trace created']);
}
/**
* @Route("/action/trace/list/{prospectId}", name="list_action_trace", methods={"GET"})
*/
public function listActionTrace(int $prospectId): JsonResponse
{
$prospect = $this->entityManager->getRepository(Prospect::class)->find($prospectId);
if (!$prospect) {
return new JsonResponse(['error' => 'Prospect not found'], 404);
}
$actionTraces = $this->entityManager->getRepository(ActionTrace::class)
->findBy(['prospect' => $prospect], ['createdAt' => 'DESC']);
$data = array_map(function ($actionTrace) {
$user = $actionTrace->getUser();
return [
'id' => $actionTrace->getId(),
'type' => $actionTrace->getType(),
'description' => $actionTrace->getDescription(),
'createdAt' => $actionTrace->getCreatedAt()->format('Y-m-d\TH:i'), // Adjusted format for datetime-local
'user' => [
'id' => $user->getId(),
'prenom' => $user->getPrenom(),
'nom' => $user->getNom(),
'email' => $user->getEmail(),
'couleur' => $user->getCouleur(),
],
];
}, $actionTraces);
return new JsonResponse(['actionTraces' => $data]);
}
/**
* @Route("/action/trace/{actionId}/update", name="update_action_trace", methods={"POST"})
*/
public function updateActionTrace(int $actionId, Request $request): JsonResponse
{
$data = $request->toArray();
$type = $data['type'] ?? null;
$description = $data['description'] ?? null;
$date = $data['date'] ?? null;
$user = $this->security->getUser();
if (!$type || !$user || !$date) {
return new JsonResponse(['error' => 'Missing parameters'], 400);
}
$actionTrace = $this->entityManager->getRepository(ActionTrace::class)->find($actionId);
if (!$actionTrace) {
return new JsonResponse(['error' => 'Action trace not found'], 404);
}
// Optionally, check if the current user has permission to edit this action trace
// For example:
// if ($actionTrace->getUser()->getId() !== $user->getId() && !$this->isGranted('ROLE_ADMIN')) {
// return new JsonResponse(['error' => 'Unauthorized'], 403);
// }
try {
$createdAt = new \DateTimeImmutable($date);
} catch (\Exception $e) {
return new JsonResponse(['error' => 'Invalid date format'], 400);
}
$actionTrace->setType($type);
$actionTrace->setDescription($description);
$actionTrace->setCreatedAt($createdAt);
// Optionally update the user if needed
// $actionTrace->setUser($user);
$this->entityManager->flush();
return new JsonResponse(['success' => 'Action trace updated']);
}
/**
* @Route("/action/trace/{actionId}/delete", name="delete_action_trace", methods={"DELETE"})
*/
public function deleteActionTrace(int $actionId): JsonResponse
{
$actionTrace = $this->entityManager->getRepository(ActionTrace::class)->find($actionId);
if (!$actionTrace) {
return new JsonResponse(['error' => 'Action trace not found'], 404);
}
$this->entityManager->remove($actionTrace);
$this->entityManager->flush();
return new JsonResponse(['success' => 'Action trace deleted']);
}
}