getUser(); $import = $importRepository->findLatestForUser($user); if (!$import) { return $this->json(null); } return $this->json([ 'id' => $import->getId(), 'status' => $import->getStatus(), 'totalFilms' => $import->getTotalFilms(), 'processedFilms' => $import->getProcessedFilms(), 'failedFilms' => $import->getFailedFilms(), ]); } #[Route('/api/imports', methods: ['POST'])] #[IsGranted('ROLE_USER')] public function create( Request $request, FilesystemOperator $defaultStorage, EntityManagerInterface $em, ImportRepository $importRepository, MessageBusInterface $bus, ): JsonResponse { /** @var User $user */ $user = $this->getUser(); if ($importRepository->hasActiveImport($user)) { return $this->json(['error' => 'Un import est déjà en cours.'], Response::HTTP_CONFLICT); } $file = $request->files->get('file'); if (!$file) { return $this->json(['error' => 'No file provided.'], Response::HTTP_UNPROCESSABLE_ENTITY); } if ('csv' !== $file->getClientOriginalExtension()) { return $this->json(['error' => 'Only CSV files are accepted.'], Response::HTTP_UNPROCESSABLE_ENTITY); } if ($file->getSize() > 5 * 1024 * 1024) { return $this->json(['error' => 'File too large (max 5 MB).'], Response::HTTP_UNPROCESSABLE_ENTITY); } $import = new Import(); $import->setUser($user); $import->setFilePath('pending'); $em->persist($import); $em->flush(); try { $filePath = sprintf('imports/%d/%d.csv', $user->getId(), $import->getId()); $defaultStorage->write($filePath, file_get_contents($file->getPathname())); $import->setFilePath($filePath); $em->flush(); $bus->dispatch(new ProcessImportMessage($import->getId())); } catch (\Throwable) { $import->setStatus(Import::STATUS_FAILED); $em->flush(); return $this->json(['error' => 'An error occurred while starting the import.'], Response::HTTP_INTERNAL_SERVER_ERROR); } return $this->json([ 'id' => $import->getId(), 'status' => $import->getStatus(), ], Response::HTTP_CREATED); } }