refs #734 Adds new endpoints sync and backup and status endpoint

ticket-769
Luis Gerardo Romero Garcia 2024-09-13 17:20:01 +02:00
parent a77eb7a69e
commit 0908888fce
1 changed files with 320 additions and 51 deletions

View File

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