commit inicial
Some checks failed
Primer flujo de trabajo CI/CD (Build, Test and Push Docker Image) para Ampliación de Entornos de Desarrollo / build-and-push (push) Has been cancelled

This commit is contained in:
Isidoro Nevares Martín 2026-05-08 14:56:49 +02:00
parent 6b38a6dc62
commit c329080e0c
18 changed files with 559 additions and 29 deletions

View File

@ -1,6 +0,0 @@
# Información de configuración de la base de datos
DB_HOST=localhost
DB_PORT=3306
DB_NAME=mapa_mundi
DB_USER=
DB_PASSWORD=

View File

@ -1,4 +1,4 @@
# Repositorio para la actividad 99.1 de Ampliación de Entornos (RA1-RA2-RA3-RA4-RA5).
# Repositorio para el examen de recuperación de Ampliación de Entornos (RA3-RA4-RA5).
¡Ánimo y a por ello!

View File

@ -1,6 +1,6 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.lapaloma.gobierno</groupId>
<groupId>org.lapaloma.examen.aaee</groupId>
<artifactId>aaee_gobierno</artifactId>
<version>0.0.2</version>

View File

@ -1,13 +1,13 @@
package org.lapaloma.gobierno;
package org.lapaloma.examen.aaee;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class AppHogwartsSB {
public class AppGobiernoSB {
public static void main(String[] args) {
SpringApplication.run(AppHogwartsSB.class, args);
SpringApplication.run(AppGobiernoSB.class, args);
}

View File

@ -0,0 +1,63 @@
package org.lapaloma.examen.aaee.controller;
import java.util.List;
import org.lapaloma.examen.aaee.service.MiembroService;
import org.lapaloma.examen.aaee.vo.Miembro;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* Controlador REST para gestionar miembros de ministerios
*
* @author Isidoro Nevares Martín - IES Virgen de la Paloma
* @date 08 mayo 2026
*/
@RestController
@RequestMapping("/gobierno/miembros")
public class MiembroController {
private final MiembroService miembroService;
// Spring inyecta automáticamente el service con su DAO
public MiembroController(MiembroService miembroService) {
this.miembroService = miembroService;
}
/**
* GET /gobierno/miembros - Obtiene la lista de todos los miembros
*
* @return List<Miembro> lista de todos los miembros en formato JSON
*/
@GetMapping
public List<Miembro> getAll() {
List<Miembro> listaMiembros = miembroService.obtenerListaMiembros();
return listaMiembros;
}
/**
* GET /gobierno/miembros/nombre/{nombre} - Obtiene un miembro por su nombre
*
* @param nombre el nombre del miembro a buscar
* @return Miembro el miembro encontrado en formato JSON
*/
@GetMapping("/nombre/{nombre}")
public Miembro getByNombre(@PathVariable String nombre) {
Miembro miembro = miembroService.obtenerMiembroPorNombre(nombre);
return miembro;
}
/**
* GET /gobierno/miembros/alias/{alias} - Obtiene un miembro por su alias
*
* @param alias el alias del miembro a buscar
* @return Miembro el miembro encontrado en formato JSON
*/
@GetMapping("/alias/{alias}")
public Miembro getByAlias(@PathVariable String alias) {
Miembro miembro = miembroService.obtenerMiembroPorAlias(alias);
return miembro;
}
}

View File

@ -1,12 +1,12 @@
/**
*
*/
package org.lapaloma.gobierno.controller;
package org.lapaloma.examen.aaee.controller;
import java.util.List;
import org.lapaloma.gobierno.service.MinisterioService;
import org.lapaloma.gobierno.vo.Ministerio;
import org.lapaloma.examen.aaee.service.MinisterioService;
import org.lapaloma.examen.aaee.vo.Ministerio;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

View File

@ -0,0 +1,14 @@
package org.lapaloma.examen.aaee.dao;
import java.util.List;
import org.lapaloma.examen.aaee.vo.Miembro;
public interface IMiembroDAO {
public List<Miembro> obtenerListaMiembros();
public Miembro obtenerMiembroPorNombre(String nombre);
public Miembro obtenerMiembroPorAlias(String alias);
}

View File

@ -1,8 +1,8 @@
package org.lapaloma.gobierno.dao;
package org.lapaloma.examen.aaee.dao;
import java.util.List;
import org.lapaloma.gobierno.vo.Ministerio;
import org.lapaloma.examen.aaee.vo.Ministerio;
public interface IMinisterioDAO {

View File

@ -0,0 +1,129 @@
package org.lapaloma.examen.aaee.dao.impl;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.sql.DataSource;
import org.lapaloma.examen.aaee.dao.IMiembroDAO;
import org.lapaloma.examen.aaee.vo.Miembro;
import org.lapaloma.examen.aaee.vo.Ministerio;
import org.springframework.stereotype.Repository;
@Repository
public class MiembroDaoJDBC implements IMiembroDAO {
private final DataSource dataSource;
// Spring inyecta el DataSource configurado automáticamente
public MiembroDaoJDBC(DataSource dataSource) {
this.dataSource = dataSource;
}
@Override
public List<Miembro> obtenerListaMiembros() {
List<Miembro> lista = new ArrayList<>();
String sentenciaSQL = """
SELECT * FROM miembro
""";
try (Connection conexion = dataSource.getConnection();
PreparedStatement sentenciaJDBCPreparada = conexion.prepareStatement(sentenciaSQL);) {
System.out.println(sentenciaJDBCPreparada);
ResultSet resultadoSentencia = sentenciaJDBCPreparada.executeQuery();
while (resultadoSentencia.next()) {
lista.add(getLineaFromResultSet(resultadoSentencia));
}
} catch (Exception e) {
e.printStackTrace();
}
return lista;
}
@Override
public Miembro obtenerMiembroPorNombre(String nombre) {
String sentenciaSQL = """
SELECT * FROM miembro WHERE nombre = ?
""";
try (Connection conexion = dataSource.getConnection();
PreparedStatement sentenciaJDBCPreparada = conexion.prepareStatement(sentenciaSQL);) {
sentenciaJDBCPreparada.setString(1, nombre);
System.out.println(sentenciaJDBCPreparada);
ResultSet resultadoSentencia = sentenciaJDBCPreparada.executeQuery();
if (resultadoSentencia.next()) {
return getLineaFromResultSet(resultadoSentencia);
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
public Miembro obtenerMiembroPorAlias(String alias) {
String sentenciaSQL = """
SELECT * FROM miembro WHERE alias = ?
""";
try (Connection conexion = dataSource.getConnection();
PreparedStatement sentenciaJDBCPreparada = conexion.prepareStatement(sentenciaSQL);) {
sentenciaJDBCPreparada.setString(1, alias);
System.out.println(sentenciaJDBCPreparada);
ResultSet resultadoSentencia = sentenciaJDBCPreparada.executeQuery();
if (resultadoSentencia.next()) {
return getLineaFromResultSet(resultadoSentencia);
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
private Miembro getLineaFromResultSet(ResultSet resultadoSentencia) throws SQLException {
Miembro miembro = new Miembro();
miembro.setIdentificador(resultadoSentencia.getInt("codMiembro"));
miembro.setNif(resultadoSentencia.getString("nif"));
miembro.setNombre(resultadoSentencia.getString("nombre"));
miembro.setApellido1(resultadoSentencia.getString("apellido1"));
miembro.setAlias(resultadoSentencia.getString("alias"));
// Obtener el código del ministerio
int codigoMinisterio = resultadoSentencia.getInt("codigoMinisterio");
// Si codigoMinisterio es válido (no es 0), crear objeto Ministerio
if (codigoMinisterio != 0) {
Ministerio ministerio = new Ministerio();
ministerio.setIdentificador(codigoMinisterio);
miembro.setMinisterio(ministerio);
}
return miembro;
}
}

View File

@ -1,4 +1,4 @@
package org.lapaloma.gobierno.dao.impl;
package org.lapaloma.examen.aaee.dao.impl;
import java.sql.Connection;
import java.sql.PreparedStatement;
@ -9,8 +9,8 @@ import java.util.List;
import javax.sql.DataSource;
import org.lapaloma.gobierno.dao.IMinisterioDAO;
import org.lapaloma.gobierno.vo.Ministerio;
import org.lapaloma.examen.aaee.dao.IMinisterioDAO;
import org.lapaloma.examen.aaee.vo.Ministerio;
import org.springframework.stereotype.Repository;
@Repository

View File

@ -0,0 +1,12 @@
package org.lapaloma.examen.aaee.excepcion;
public class MiembroNoEncontradoException extends RuntimeException {
/**
*
*/
private static final long serialVersionUID = -3344627619585104665L;
public MiembroNoEncontradoException(String mensaje) {
super(mensaje);
}
}

View File

@ -1,4 +1,4 @@
package org.lapaloma.gobierno.excepcion;
package org.lapaloma.examen.aaee.excepcion;
public class MinisterioNoEncontradoException extends RuntimeException {
/**

View File

@ -0,0 +1,79 @@
package org.lapaloma.examen.aaee.service;
import java.util.List;
import org.lapaloma.examen.aaee.dao.IMiembroDAO;
import org.lapaloma.examen.aaee.excepcion.MiembroNoEncontradoException;
import org.lapaloma.examen.aaee.vo.Miembro;
import org.springframework.stereotype.Service;
@Service
public class MiembroService {
private final IMiembroDAO miembroDAO;
// Spring inyecta el DAO automáticamente
public MiembroService(IMiembroDAO miembroDAO) {
this.miembroDAO = miembroDAO;
}
/**
* Obtiene la lista completa de miembros
*
* @return List<Miembro> lista de todos los miembros
* @throws RuntimeException si la lista está vacía
*/
public List<Miembro> obtenerListaMiembros() {
List<Miembro> lista = miembroDAO.obtenerListaMiembros();
// Simulamos el caso de lista vacía para probar la excepción
lista=null;
if (lista == null || lista.isEmpty()) {
throw new RuntimeException("No hay miembros disponibles");
}
return lista;
}
/**
* Obtiene un miembro por su nombre
*
* @param nombre el nombre del miembro a buscar
* @return Miembro el miembro encontrado
* @throws MiembroNoEncontradoException si no se encuentra el miembro
*/
public Miembro obtenerMiembroPorNombre(String nombre) {
Miembro miembro = miembroDAO.obtenerMiembroPorNombre(nombre);
// Simulamos el caso de miembro no encontrado para probar la excepción
miembro=null;
if (miembro == null) {
throw new MiembroNoEncontradoException("Miembro con nombre '" + nombre + "' no encontrado");
}
return miembro;
}
/**
* Obtiene un miembro por su alias
*
* @param alias el alias del miembro a buscar
* @return Miembro el miembro encontrado
* @throws MiembroNoEncontradoException si no se encuentra el miembro
*/
public Miembro obtenerMiembroPorAlias(String alias) {
Miembro miembro = miembroDAO.obtenerMiembroPorAlias(alias);
if (miembro == null) {
throw new MiembroNoEncontradoException("Miembro con alias '" + alias + "' no encontrado");
}
return miembro;
}
}

View File

@ -1,12 +1,12 @@
/**
*
*/
package org.lapaloma.gobierno.service;
package org.lapaloma.examen.aaee.service;
import java.util.List;
import org.lapaloma.gobierno.dao.IMinisterioDAO;
import org.lapaloma.gobierno.vo.Ministerio;
import org.lapaloma.examen.aaee.dao.IMinisterioDAO;
import org.lapaloma.examen.aaee.vo.Ministerio;
import org.springframework.stereotype.Service;
@Service

View File

@ -0,0 +1,88 @@
package org.lapaloma.examen.aaee.vo;
/**
*
* Casa: Clase de persistencia que representa un Miembro de un Ministerio.
*
* @author Isidoro Nevares Martín - IES Virgen de la Paloma
* @date 03 marzo 2026
*
*
*/
public class Miembro {
private int identificador;
private String nif;
private String nombre;
private String apellido1;
private String alias;
private Ministerio ministerio;
public Miembro() {
super();
}
public Miembro(int identificador, String nif, String nombre, String apellido1, String alias,
Ministerio ministerio) {
super();
this.identificador = identificador;
this.nif = nif;
this.nombre = nombre;
this.apellido1 = apellido1;
this.alias = alias;
this.ministerio = ministerio;
}
public int getIdentificador() {
return identificador;
}
public void setIdentificador(int identificador) {
this.identificador = identificador;
}
public String getNif() {
return nif;
}
public void setNif(String nif) {
this.nif = nif;
}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public String getApellido1() {
return apellido1;
}
public void setApellido1(String apellido1) {
this.apellido1 = apellido1;
}
public String getAlias() {
return alias;
}
public void setAlias(String alias) {
this.alias = alias;
}
public Ministerio getMinisterio() {
return ministerio;
}
public void setMinisterio(Ministerio ministerio) {
this.ministerio = ministerio;
}
@Override
public String toString() {
return "Miembro [identificador=" + identificador + ", nif=" + nif + ", nombre=" + nombre + ", apellido1="
+ apellido1 + ", alias=" + alias + ", ministerio=" + ministerio + "]";
}
}

View File

@ -1,4 +1,4 @@
package org.lapaloma.gobierno.vo;
package org.lapaloma.examen.aaee.vo;
/**
*

View File

@ -0,0 +1,151 @@
package org.lapaloma.examen.aaee.service;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertThrows;
import java.util.ArrayList;
import java.util.List;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.lapaloma.examen.aaee.dao.IMiembroDAO;
import org.lapaloma.examen.aaee.excepcion.MiembroNoEncontradoException;
import org.lapaloma.examen.aaee.vo.Miembro;
import org.lapaloma.examen.aaee.vo.Ministerio;
class MiembroServiceTest {
private MiembroService miembroService;
private FakeMiembroDAO fakeDAO;
@BeforeEach
void setUp() {
fakeDAO = new FakeMiembroDAO();
miembroService = new MiembroService(fakeDAO);
}
// =========================
// obtenerListaMiembros
// =========================
@Test
void obtenerListaMiembros_cuandoListaEstaVacia_lanzaExcepcion() {
assertThrows(RuntimeException.class, () -> {
miembroService.obtenerListaMiembros();
});
}
@Test
void obtenerListaMiembros_cuandoHayDatos_retornaLista() {
Ministerio ministerio = new Ministerio(1, "Ministerio de Defensa", 120000, 6000);
Miembro miembro1 = new Miembro(1, "23451596F", "James", "Logan", "Lobezno", ministerio);
fakeDAO.data.add(miembro1);
List<Miembro> resultado = miembroService.obtenerListaMiembros();
assertNotNull(resultado);
assertEquals(1, resultado.size());
assertEquals("James", resultado.get(0).getNombre());
}
// =========================
// obtenerMiembroPorNombre
// =========================
@Test
void obtenerMiembroPorNombre_cuandoNoExiste_lanzaExcepcion() {
assertThrows(MiembroNoEncontradoException.class, () -> {
miembroService.obtenerMiembroPorNombre("NoExiste");
});
}
@Test
void obtenerMiembroPorNombre_cuandoExiste_retornaMiembro() {
Ministerio ministerio = new Ministerio(1, "Ministerio de Defensa", 120000, 6000);
Miembro miembro1 = new Miembro(1, "23451596F", "James", "Logan", "Lobezno", ministerio);
fakeDAO.data.add(miembro1);
Miembro resultado = miembroService.obtenerMiembroPorNombre("James");
assertNotNull(resultado);
assertEquals("James", resultado.getNombre());
assertEquals("Logan", resultado.getApellido1());
assertEquals("Lobezno", resultado.getAlias());
}
// =========================
// obtenerMiembroPorAlias
// =========================
@Test
void obtenerMiembroPorAlias_cuandoNoExiste_lanzaExcepcion() {
assertThrows(MiembroNoEncontradoException.class, () -> {
miembroService.obtenerMiembroPorAlias("AliasNoExiste");
});
}
@Test
void obtenerMiembroPorAlias_cuandoExiste_retornaMiembro() {
Ministerio ministerio = new Ministerio(1, "Ministerio de Defensa", 120000, 6000);
Miembro miembro1 = new Miembro(1, "23451596F", "James", "Logan", "Lobezno", ministerio);
fakeDAO.data.add(miembro1);
Miembro resultado = miembroService.obtenerMiembroPorAlias("Lobezno");
assertNotNull(resultado);
assertEquals("James", resultado.getNombre());
assertEquals("Lobezno", resultado.getAlias());
}
@Test
void obtenerMiembroPorAlias_cuandoAliasEsNull_manejaCorrectamente() {
Ministerio ministerio = new Ministerio(2, "Ministerio de Economía", 375000, 38000);
Miembro miembro1 = new Miembro(3, "36974641B", "Tío", "Gilito", null, ministerio);
fakeDAO.data.add(miembro1);
// Buscar un alias null debería lanzar excepción
assertThrows(MiembroNoEncontradoException.class, () -> {
miembroService.obtenerMiembroPorAlias(null);
});
}
// =========================
// FakeMiembroDAO
// =========================
static class FakeMiembroDAO implements IMiembroDAO {
private List<Miembro> data = new ArrayList<>();
@Override
public List<Miembro> obtenerListaMiembros() {
return new ArrayList<>(data);
}
@Override
public Miembro obtenerMiembroPorNombre(String nombre) {
return data.stream()
.filter(m -> m.getNombre().equals(nombre))
.findFirst()
.orElse(null);
}
@Override
public Miembro obtenerMiembroPorAlias(String alias) {
return data.stream()
.filter(m -> {
String miembroAlias = m.getAlias();
return miembroAlias != null && miembroAlias.equals(alias);
})
.findFirst()
.orElse(null);
}
}
}

View File

@ -1,4 +1,4 @@
package org.lapaloma.hogwarts.service;
package org.lapaloma.examen.aaee.service;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
@ -9,11 +9,11 @@ import java.util.List;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.lapaloma.gobierno.dao.IMinisterioDAO;
import org.lapaloma.gobierno.service.MinisterioService;
import org.lapaloma.gobierno.vo.Ministerio;
import org.lapaloma.examen.aaee.dao.IMinisterioDAO;
import org.lapaloma.examen.aaee.service.MinisterioService;
import org.lapaloma.examen.aaee.vo.Ministerio;
class CasaServiceTest {
class MinisterioServiceTest {
private MinisterioService ministerioService;
private FakeMinisterioDAO fakeDAO;