refs #734 Control of errores and http codes in controler

ticket-769
Luis Gerardo Romero Garcia 2024-09-13 13:39:33 +02:00
parent c5fd09704b
commit b1c699dbea
2 changed files with 188 additions and 37 deletions

View File

@ -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",

View File

@ -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"})