From 0908888fce9b7554800807ff6ce3ff8d46f542b6 Mon Sep 17 00:00:00 2001 From: lgromero Date: Fri, 13 Sep 2024 17:20:01 +0200 Subject: [PATCH] refs #734 Adds new endpoints sync and backup and status endpoint --- .../Controller/OgGitController.php | 371 +++++++++++++++--- 1 file changed, 320 insertions(+), 51 deletions(-) diff --git a/src/OgGitBundle/Controller/OgGitController.php b/src/OgGitBundle/Controller/OgGitController.php index 69c098f..2019db6 100644 --- a/src/OgGitBundle/Controller/OgGitController.php +++ b/src/OgGitBundle/Controller/OgGitController.php @@ -36,31 +36,6 @@ class OgGitController -/** - * @Route("/oggit/v1/status", name="getStatus", methods={"GET"}) - * @OA\Get( - * path="/oggit/v1/status", - * summary="Get oggit status", - * @OA\Response( - * response=200, - * description="Status retrieved successfully", - * @OA\JsonContent( - * type="object", - * @OA\Property(property="message", type="string") - * ) - * ) - * ) - */ -public function getStatus(): Response -{ - $response = [ - 'message' => 'Todo OK' - ]; - - return new JsonResponse($response, 200); -} - - /** * @Route("/oggit/v1/repositories", methods={"GET"}) * @OA\Get( @@ -152,13 +127,13 @@ public function getStatus(): Response } /** - * @Route("/oggit/v1/repositories/{id}", methods={"DELETE"}) + * @Route("/oggit/v1/repositories/{repoId}", methods={"DELETE"}) * @OA\Delete( - * path="/oggit/v1/repositories/{id}", + * path="/oggit/v1/repositories/{repoId}", * tags={"Repositories"}, * summary="Eliminar un repositorio", * @OA\Parameter( - * name="id", + * name="repoId", * in="path", * required=true, * description="ID del repositorio a eliminar", @@ -179,10 +154,10 @@ public function getStatus(): Response * ) * ) */ - public function deleteRepository($id): JsonResponse + public function deleteRepository($repoId): JsonResponse { // Hacer la solicitud al servicio externo para eliminar el repositorio - $response = $this->ogGitService->makeRequest('DELETE', "/repositories/{$id}"); + $response = $this->ogGitService->makeRequest('DELETE', "/repositories/{$repoId}"); // Comprobar si la solicitud falló if (isset($response['error'])) { @@ -204,13 +179,13 @@ public function getStatus(): Response } /** - * @Route("/oggit/v1/repositories/{id}/compact", methods={"POST"}) + * @Route("/oggit/v1/repositories/{repoId}/compact", methods={"POST"}) * @OA\Post( - * path="/oggit/v1/repositories/{id}/compact", + * path="/oggit/v1/repositories/{repoId}/compact", * summary="Realizar la compactación del repositorio Git", * tags={"Repositories"}, * @OA\Parameter( - * name="id", + * name="repoId", * in="path", * required=true, * description="ID del repositorio para compactar", @@ -226,26 +201,284 @@ public function getStatus(): Response * ) * ) */ - public function compactRepository($id): JsonResponse + public function compactRepository($repoId): JsonResponse { // Llamar a la función del servicio para compactar el repositorio - $result = $this->ogGitService->makeRequest('POST', '/repositories/' . $id . '/compact'); + $result = $this->ogGitService->makeRequest('POST', '/repositories/' . $repoId . '/compact'); if ($result['success']) { - return new JsonResponse(['message' => "Compactación realizada con éxito para el repositorio: {$id}"], 200); + return new JsonResponse(['message' => "Compactación realizada con éxito para el repositorio: {$repoId}"], 200); } return new JsonResponse(['error' => 'Error al realizar la compactación'], 500); } /** - * @Route("/oggit/v1/repositories/{id}/branches", methods={"GET"}) + * @Route("/oggit/v1/repositories/{repoId}/sync", methods={"POST"}) + * @OA\Post( + * path="/oggit/v1/repositories/{repoId}/sync", + * summary="Sincronizar un repositorio con otro", + * tags={"Repositories"}, + * @OA\Parameter( + * name="repoId", + * in="path", + * required=true, + * description="ID del repositorio a sincronizar", + * example="linux", + * @OA\Schema(type="string") + * ), + * @OA\RequestBody( + * required=true, + * @OA\JsonContent( + * type="object", + * @OA\Property(property="remote_repository", type="string", description="Repositorio remoto") + * ) + * ), + * @OA\Response( + * response=200, + * description="Sincronización iniciada" + * ), + * @OA\Response( + * response=404, + * description="Repositorio no encontrado" + * ), + * @OA\Response( + * response=500, + * description="Error al conectar con el servicio externo" + * ) + * ) + */ + public function syncRepository(Request $request, $repoId): JsonResponse + { + // Obtener los datos del cuerpo de la solicitud + $data = json_decode($request->getContent(), true); + $remoteRepository = $data['remote_repository'] ?? ''; + + // Hacer la solicitud al servicio externo para la sincronización + $response = $this->ogGitService->makeRequest('POST', "/repositories/{$repoId}/sync", [ + 'json' => ['remote_repository' => $remoteRepository] + ]); + + // 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'] === 'Started synchronization') { + return new JsonResponse([ + 'message' => 'Sincronización iniciada', + 'repository' => $repoId, + 'remote_repository' => $remoteRepository + ], 200); + } + + // Devolver 404 si el repositorio no se encuentra + if (isset($response['error']) && $response['error'] === 'Repository not found') { + return new JsonResponse(['error' => 'Repository not found'], 404); + } + + return new JsonResponse(['error' => 'Error desconocido'], 500); + } + + /** + * @Route("/oggit/v1/repositories/{repoId}/sync/status", methods={"GET"}) * @OA\Get( - * path="/oggit/v1/repositories/{id}/branches", + * path="/oggit/v1/repositories/{repoId}/sync/status", + * summary="Consultar el estado de la sincronización de un repositorio", + * tags={"Repositories"}, + * @OA\Parameter( + * name="repoId", + * in="path", + * required=true, + * description="ID del repositorio a consultar", + * example="linux", + * @OA\Schema(type="string") + * ), + * @OA\RequestBody( + * required=true, + * @OA\JsonContent( + * type="object", + * @OA\Property(property="remote_repository", type="string", description="Repositorio remoto") + * ) + * ), + * @OA\Response( + * response=200, + * description="Estado de la sincronización consultado con éxito" + * ), + * @OA\Response( + * response=404, + * description="Repositorio no encontrado" + * ), + * @OA\Response( + * response=500, + * description="Error al conectar con el servicio externo" + * ) + * ) + */ + public function getSyncStatus(Request $request, $repoId): JsonResponse + { + // Obtener los datos del cuerpo de la solicitud + $data = json_decode($request->getContent(), true); + $remoteRepository = $data['remote_repository'] ?? ''; + + // Hacer la solicitud al servicio externo para consultar el estado de sincronización + $response = $this->ogGitService->makeRequest('GET', "/repositories/{$repoId}/sync/status", [ + 'json' => ['remote_repository' => $remoteRepository] + ]); + + // Comprobar si la solicitud falló + if (isset($response['error'])) { + return new JsonResponse(['error' => 'No se pudo conectar con el servicio externo'], 500); + } + + return new JsonResponse($response, 200); + } + /** + * @Route("/oggit/v1/repositories/{repoId}/backup", methods={"POST"}) + * @OA\Post( + * path="/oggit/v1/repositories/{repoId}/backup", + * summary="Realizar una copia de seguridad de un repositorio", + * tags={"Repositories"}, + * @OA\Parameter( + * name="repoId", + * in="path", + * required=true, + * description="ID del repositorio a respaldar", + * example="linux", + * @OA\Schema(type="string") + * ), + * @OA\RequestBody( + * required=true, + * @OA\JsonContent( + * type="object", + * @OA\Property(property="ssh_server", type="string", description="Servidor SSH"), + * @OA\Property(property="ssh_user", type="string", description="Usuario SSH"), + * @OA\Property(property="filename", type="string", description="Archivo de destino") + * ) + * ), + * @OA\Response( + * response=200, + * description="Copia de seguridad iniciada" + * ), + * @OA\Response( + * response=404, + * description="Repositorio no encontrado" + * ), + * @OA\Response( + * response=500, + * description="Error al conectar con el servicio externo" + * ) + * ) + */ + public function backupRepository(Request $request, $repoId): JsonResponse + { + // Obtener los datos del cuerpo de la solicitud + $data = json_decode($request->getContent(), true); + $sshServer = $data['ssh_server'] ?? ''; + $sshUser = $data['ssh_user'] ?? ''; + $filename = $data['filename'] ?? ''; + + // Hacer la solicitud al servicio externo para la copia de seguridad + $response = $this->ogGitService->makeRequest('POST', "/repositories/{$repoId}/backup", [ + 'json' => [ + 'ssh_server' => $sshServer, + 'ssh_user' => $sshUser, + 'filename' => $filename + ] + ]); + + // 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 y devolver los valores del response + if (isset($response['status']) && $response['status'] === 'Started backup') { + return new JsonResponse([ + 'message' => 'Copia de seguridad iniciada', + 'repository' => $repoId, + 'ssh_server' => $response['ssh_server'], + 'ssh_user' => $response['ssh_user'], + 'filename' => $response['filename'] + ], 200); + } + // Devolver 404 si el repositorio no se encuentra + if (isset($response['error']) && $response['error'] === 'Repository not found') { + return new JsonResponse(['error' => 'Repository not found'], 404); + } + + return new JsonResponse(['error' => 'Error desconocido'], 500); + } + /** + * @Route("/oggit/v1/repositories/{repoId}/backup/status", methods={"GET"}) + * @OA\Get( + * path="/oggit/v1/repositories/{repoId}/backup/status", + * summary="Consultar el estado de la copia de seguridad de un repositorio", + * tags={"Repositories"}, + * @OA\Parameter( + * name="repoId", + * in="path", + * required=true, + * description="ID del repositorio a consultar", + * example="linux", + * @OA\Schema(type="string") + * ), + * @OA\RequestBody( + * required=true, + * @OA\JsonContent( + * type="object", + * @OA\Property(property="ssh_server", type="string", description="Servidor SSH"), + * @OA\Property(property="ssh_user", type="string", description="Usuario SSH"), + * @OA\Property(property="filename", type="string", description="Archivo de destino") + * ) + * ), + * @OA\Response( + * response=200, + * description="Estado de la copia de seguridad consultado con éxito" + * ), + * @OA\Response( + * response=404, + * description="Repositorio no encontrado" + * ), + * @OA\Response( + * response=500, + * description="Error al conectar con el servicio externo" + * ) + * ) + */ + public function getBackupStatus(Request $request, $repoId): JsonResponse + { + // Obtener los datos del cuerpo de la solicitud + $data = json_decode($request->getContent(), true); + $sshServer = $data['ssh_server'] ?? ''; + $sshUser = $data['ssh_user'] ?? ''; + $filename = $data['filename'] ?? ''; + + // Hacer la solicitud al servicio externo para consultar el estado de la copia de seguridad + $response = $this->ogGitService->makeRequest('GET', "/repositories/{$repoId}/backup/status", [ + 'json' => [ + 'ssh_server' => $sshServer, + 'ssh_user' => $sshUser, + 'filename' => $filename + ] + ]); + + // Comprobar si la solicitud falló + if (isset($response['error'])) { + return new JsonResponse(['error' => 'No se pudo conectar con el servicio externo'], 500); + } + + return new JsonResponse($response, 200); + } + /** + * @Route("/oggit/v1/repositories/{repoId}/branches", methods={"GET"}) + * @OA\Get( + * path="/oggit/v1/repositories/{repoId}/branches", * summary="Obtener las ramas de un repositorio", * tags={"Branches"}, * @OA\Parameter( - * name="id", + * name="repoId", * in="path", * required=true, * description="ID del repositorio", @@ -261,10 +494,10 @@ public function getStatus(): Response * ) * ) */ - public function getBranches($id): JsonResponse + public function getBranches($repoId): JsonResponse { // Llamar a la función makeRequest del servicio OgGitService - $response = $this->ogGitService->makeRequest('GET', "/repositories/{$id}/branches"); + $response = $this->ogGitService->makeRequest('GET', "/repositories/{$repoId}/branches"); if (isset($response['branches'])) { return new JsonResponse(['branches' => $response['branches']], 200); @@ -300,6 +533,10 @@ public function getStatus(): Response * @OA\Response( * response=400, * description="Nombre de rama inválido" + * ), + * @OA\Response( + * response=500, + * description="Error al conectar con el servicio externo" * ) * ) */ @@ -314,13 +551,29 @@ public function getStatus(): Response 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 + // Hacer la solicitud al servicio externo para crear la rama + $response = $this->ogGitService->makeRequest('POST', "/repositories/{$repoId}/branches/{$branchName}"); - return new JsonResponse([ - 'message' => 'Rama creada con éxito', - 'branchName' => $branchName, - 'repository' => $repoId - ], 201); + // 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'] === 'Branch created') { + return new JsonResponse([ + 'message' => 'Rama creada con éxito', + 'branchName' => $response['branchName'], + 'repository' => $response['repoId'] + ], 201); + } + + // Devolver 404 si el repositorio no se encuentra + if (isset($response['error']) && $response['error'] === 'Repository not found') { + return new JsonResponse(['error' => 'Repository not found'], 404); + } + + return new JsonResponse(['error' => 'Error desconocido'], 500); } /** @@ -353,15 +606,31 @@ public function getStatus(): Response * ), * @OA\Response( * response=500, - * description="Error en el servidor" + * description="Error al conectar con el servicio externo" * ) * ) */ public function deleteBranch($repoId, $branchId): JsonResponse { - return new JsonResponse([ - 'message' => "Llamando a la función deleteBranch para eliminar la rama con ID $branchId del repositorio con ID $repoId." - ], 204); + // Hacer la solicitud al servicio externo para eliminar la rama + $response = $this->ogGitService->makeRequest('DELETE', "/repositories/{$repoId}/branches/{$branchId}"); + + // 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'] === 'Branch deleted') { + return new JsonResponse(['message' => 'Rama eliminada exitosamente'], 204); + } + + // Devolver 404 si el repositorio o la rama no se encuentran + if (isset($response['error']) && $response['error'] === 'Repository or branch not found') { + return new JsonResponse(['error' => 'Repository or branch not found'], 404); + } + + return new JsonResponse(['error' => 'Error desconocido'], 500); } } \ No newline at end of file