From b1c699dbea65a65406c125889eb74219bb2324d1 Mon Sep 17 00:00:00 2001 From: lgromero Date: Fri, 13 Sep 2024 13:39:33 +0200 Subject: [PATCH] refs #734 Control of errores and http codes in controler --- composer.json | 1 + .../Controller/OgGitController.php | 224 +++++++++++++++--- 2 files changed, 188 insertions(+), 37 deletions(-) diff --git a/composer.json b/composer.json index 44b9252..8c53fe1 100644 --- a/composer.json +++ b/composer.json @@ -11,6 +11,7 @@ "doctrine/doctrine-bundle": "^2.0", "doctrine/doctrine-migrations-bundle": "^3.0", "doctrine/orm": "^2.7", + "guzzlehttp/guzzle": "^7.9", "nelmio/api-doc-bundle": "^4.29", "phpdocumentor/reflection-docblock": "^5.0", "phpstan/phpdoc-parser": "^1.13", diff --git a/src/OgGitBundle/Controller/OgGitController.php b/src/OgGitBundle/Controller/OgGitController.php index 9526191..69c098f 100644 --- a/src/OgGitBundle/Controller/OgGitController.php +++ b/src/OgGitBundle/Controller/OgGitController.php @@ -4,7 +4,7 @@ namespace App\OgGitBundle\Controller; use OpenApi\Annotations as OA; use Psr\Log\LoggerInterface; -use App\OgGitBundle\Service\CurlRequestService; +use App\OgGitBundle\Service\OgGitService; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; @@ -22,12 +22,12 @@ class OgGitController * @OA\Info(title="OgGit API", version="1.0") */ - private $curlRequestService; + private $ogGitService; private $httpClient; private $params; - public function __construct(CurlRequestService $curlRequestService, LoggerInterface $logger, HttpClientInterface $httpClient, ParameterBagInterface $params) + public function __construct(OgGitService $ogGitService, LoggerInterface $logger, HttpClientInterface $httpClient, ParameterBagInterface $params) { - $this->curlRequestService = $curlRequestService; + $this->ogGitService = $ogGitService; $this->logger = $logger; $this->httpClient = $httpClient; $this->params = $params; @@ -74,38 +74,83 @@ public function getStatus(): Response * type="array", * @OA\Items( * type="object", - * @OA\Property(property="id", type="string", description="ID del repositorio"), - * @OA\Property(property="name", type="string", description="Nombre del repositorio"), - * @OA\Property(property="createdAt", type="string", format="date-time", description="Fecha de creación del repositorio"), - * @OA\Property(property="lastModified", type="string", format="date-time", description="Última modificación del repositorio") + * @OA\Property(property="name", type="string", description="Nombre del repositorio") * ) * ) * ), * @OA\Response( * response=500, - * description="Error interno del servidor" + * description="Error al conectar con el servicio externo" * ) * ) */ public function getRepositories(): JsonResponse { - // Lógica para obtener los repositorios (por ahora, devolvemos un mensaje de prueba) - return new JsonResponse([ - [ - 'id' => '1', - 'name' => 'Repositorio 1', - 'createdAt' => '2024-09-12T10:00:00Z', - 'lastModified' => '2024-09-12T12:00:00Z' - ], - [ - 'id' => '2', - 'name' => 'Repositorio 2', - 'createdAt' => '2024-09-11T08:30:00Z', - 'lastModified' => '2024-09-12T09:00:00Z' - ] - ], 200); + // Hacer la solicitud al servicio Python utilizando makeRequest + $response = $this->ogGitService->makeRequest('GET', '/repositories'); + + // Verificar si la solicitud al servicio Python falló + if (isset($response['error'])) { + return new JsonResponse(['error' => 'No se pudo conectar con el servicio externo'], 500); + } + + // Devolver la lista de repositorios + return new JsonResponse($response, 200); } + + /** + * @Route("/oggit/v1/repositories", methods={"POST"}) + * @OA\Post( + * path="/oggit/v1/repositories", + * summary="Crear un nuevo repositorio", + * tags={"Repositories"}, + * @OA\RequestBody( + * required=true, + * @OA\JsonContent( + * type="object", + * @OA\Property(property="name", type="string", description="Nombre del repositorio") + * ) + * ), + * @OA\Response( + * response=201, + * description="Repositorio creado con éxito" + * ), + * @OA\Response( + * response=400, + * description="Nombre de repositorio inválido" + * ), + * @OA\Response( + * response=500, + * description="Error al conectar con el servicio externo" + * ) + * ) + */ + public function createRepository(Request $request): JsonResponse + { + // Obtener el contenido JSON del cuerpo de la solicitud + $data = json_decode($request->getContent(), true); + $name = $data['name'] ?? ''; + + // Validar el nombre del repositorio usando isValidBranchName + if (!$this->ogGitService->isValidBranchName($name)) { + return new JsonResponse(['error' => 'Nombre de repositorio inválido'], 400); + } + + // Hacer la solicitud para crear el repositorio + $response = $this->ogGitService->makeRequest('PUT', "/repositories/{$name}"); + + // Manejar la respuesta en función de si el repositorio fue creado o ya existía + if ($response['status'] === 'Repository created') { + return new JsonResponse(['message' => 'Repositorio creado con éxito'], 201); + } elseif ($response['status'] === 'Repository already exists') { + return new JsonResponse(['message' => 'El repositorio ya existe'], 200); + } + + // Respuesta por defecto en caso de otro resultado inesperado + return new JsonResponse(['error' => 'Error desconocido'], 500); + } + /** * @Route("/oggit/v1/repositories/{id}", methods={"DELETE"}) * @OA\Delete( @@ -117,10 +162,11 @@ public function getStatus(): Response * in="path", * required=true, * description="ID del repositorio a eliminar", + * example="linux.git", * @OA\Schema(type="string") * ), * @OA\Response( - * response=204, + * response=200, * description="Repositorio eliminado exitosamente" * ), * @OA\Response( @@ -129,17 +175,68 @@ public function getStatus(): Response * ), * @OA\Response( * response=500, - * description="Error en el servidor" + * description="Error al conectar con el servicio externo" * ) * ) */ public function deleteRepository($id): JsonResponse { - return new JsonResponse([ - 'message' => "Llamando a la función deleteRepository para eliminar el repositorio con ID $id." - ], 204); + // Hacer la solicitud al servicio externo para eliminar el repositorio + $response = $this->ogGitService->makeRequest('DELETE', "/repositories/{$id}"); + + // Comprobar si la solicitud falló + if (isset($response['error'])) { + return new JsonResponse(['error' => 'No se pudo conectar con el servicio externo'], 500); + } + + // Manejar la respuesta del servicio externo + if (isset($response['status']) && $response['status'] === 'Repository deleted') { + return new JsonResponse(['message' => 'Repositorio eliminado exitosamente'], 200); + } + + // Devolver exactamente lo que devuelve tu compañero, incluyendo 404 + if (isset($response['error']) && $response['error'] === 'Repository not found') { + return new JsonResponse(['error' => 'Repository not found'], 404); + } + + // Respuesta por defecto en caso de un error inesperado + return new JsonResponse(['error' => 'Error desconocido'], 500); } + /** + * @Route("/oggit/v1/repositories/{id}/compact", methods={"POST"}) + * @OA\Post( + * path="/oggit/v1/repositories/{id}/compact", + * summary="Realizar la compactación del repositorio Git", + * tags={"Repositories"}, + * @OA\Parameter( + * name="id", + * in="path", + * required=true, + * description="ID del repositorio para compactar", + * @OA\Schema(type="string") + * ), + * @OA\Response( + * response=200, + * description="Compactación realizada con éxito" + * ), + * @OA\Response( + * response=500, + * description="Error al realizar la compactación" + * ) + * ) + */ + public function compactRepository($id): JsonResponse + { + // Llamar a la función del servicio para compactar el repositorio + $result = $this->ogGitService->makeRequest('POST', '/repositories/' . $id . '/compact'); + + if ($result['success']) { + return new JsonResponse(['message' => "Compactación realizada con éxito para el repositorio: {$id}"], 200); + } + + return new JsonResponse(['error' => 'Error al realizar la compactación'], 500); + } /** * @Route("/oggit/v1/repositories/{id}/branches", methods={"GET"}) @@ -156,22 +253,75 @@ public function getStatus(): Response * ), * @OA\Response( * response=200, - * description="Operación exitosa", - * @OA\JsonContent( - * type="object", - * @OA\Property(property="message", type="string") - * ) + * description="Lista de ramas obtenida con éxito" + * ), + * @OA\Response( + * response=500, + * description="Error al obtener las ramas" * ) * ) */ public function getBranches($id): JsonResponse { - return new JsonResponse([ - 'message' => "Llamando a la función getBranches con estos parámetros: id = $id" - ], 200); + // Llamar a la función makeRequest del servicio OgGitService + $response = $this->ogGitService->makeRequest('GET', "/repositories/{$id}/branches"); + + if (isset($response['branches'])) { + return new JsonResponse(['branches' => $response['branches']], 200); + } + + return new JsonResponse(['error' => 'No se pudieron obtener las ramas del repositorio'], 500); } + /** + * @Route("/oggit/v1/repositories/{repoId}/branches", methods={"POST"}) + * @OA\Post( + * path="/oggit/v1/repositories/{repoId}/branches", + * summary="Crear una nueva rama en un repositorio", + * tags={"Branches"}, + * @OA\Parameter( + * name="repoId", + * in="path", + * required=true, + * description="ID del repositorio", + * @OA\Schema(type="string") + * ), + * @OA\RequestBody( + * required=true, + * @OA\JsonContent( + * type="object", + * @OA\Property(property="branchName", type="string", description="Nombre de la nueva rama") + * ) + * ), + * @OA\Response( + * response=201, + * description="Rama creada con éxito" + * ), + * @OA\Response( + * response=400, + * description="Nombre de rama inválido" + * ) + * ) + */ + public function createBranch(Request $request, $repoId): JsonResponse + { + // Obtener el contenido JSON del cuerpo de la solicitud + $data = json_decode($request->getContent(), true); + $branchName = $data['branchName'] ?? ''; + // Validar el nombre de la rama usando isValidBranchName + if (!$this->ogGitService->isValidBranchName($branchName)) { + return new JsonResponse(['error' => 'Nombre de rama inválido'], 400); + } + + // Aquí podrías añadir la lógica para crear la rama en el repositorio si la validación es exitosa + + return new JsonResponse([ + 'message' => 'Rama creada con éxito', + 'branchName' => $branchName, + 'repository' => $repoId + ], 201); + } /** * @Route("/oggit/v1/repositories/{repoId}/branches/{branchId}", methods={"DELETE"})