LiterAlura es un catálogo de libros interactivo que permite a los usuarios buscar libros y autores a través de una API específica y guardar los resultados en una base de datos relacional.
Este proyecto tiene como objetivo interactuar con los usuarios a través de la consola, proporcionando 9 opciones de interacción. Los libros se buscan a través de la API de Gutendex.
El proyecto se divide en varios paquetes para mantenerlo modular:
model
: Contiene los registros Datos, DatosAutor y DatosLibros, así como la clase Libro y Autor, y un enum de Idiomas.principal
: Contiene la clase Principal, que maneja la interacción con el usuario y llama a los métodos correspondientes para cada opción del menú.repository
: Contiene las interfaces de los repositorios de Autor y Libro para interactuar con la base de datos.service
: Contiene las clases de servicio que contienen la lógica de negocio.
- Buscar libro por título.
- Listar libros registrados.
- Listar autores registrados.
- Listar autores vivos en un determinado año.
- Listar libros por idioma.
- Listar libros por título.
- Listar autores por nombre.
- Buscar los 5 libros más populares.
- Mostrar estadísticas de la base de datos.
- Java
- Spring Boot
- Jakarta Annotations
- API de Gutendex
Para ejecutar este proyecto, necesitarás tener instalado Java y Spring Boot en tu equipo. Te recomiendo usar un IDE como IntelliJ IDEA o Eclipse.
- Clona el repositorio a tu equipo local.
- Importa el proyecto a tu IDE.
- Ejecuta el proyecto.
- Sigue las instrucciones en la consola para interactuar con la aplicación.
En esta sección, se aborda la clase Principal
, que desempeña un papel fundamental en la interacción entre
el usuario y el sistema.
La clase Principal
se encuentra en el paquete principal
del proyecto y actúa como el punto de entrada principal para
la interacción del usuario con la aplicación.
Aquí hay una descripción detallada de algunas características clave de esta clase:
-
Componente principal: La clase
Principal
está anotada con@Component
, lo que la convierte en un componente de Spring y la administra automáticamente el contenedor de Spring. -
Inicialización de objetos: El método
init()
se anota con@PostConstruct
, lo que significa que se ejecuta después de que se haya completado la inicialización de la clase y sus dependencias. En este método, se inicializan objetos importantes comoScanner
,ConsumoAPI
yConvierteDatos
. -
Interfaz de usuario: El método
muestraMenu()
presenta un menú interactivo que permite al usuario seleccionar diferentes opciones para interactuar con la aplicación. Este método maneja la entrada del usuario y llama a los métodos correspondientes para cada opción del menú. -
Llamadas a otros servicios: La clase
Principal
interactúa con otros servicios del proyecto, comolibroService
,autorService
, yestadisticasService
, para implementar la lógica de negocio correspondiente a cada opción del menú. Por ejemplo, al seleccionar la opción para listar libros registrados, se llama al métodolistarLibrosRegistrados()
del servicio de libros (libroService
), que a su vez interactúa con el repositorio de libros (librosRepository
) para recuperar los libros de la base de datos.
Este método permite al usuario buscar un libro específico ingresando su título completo o una parte de él. Utiliza la entrada del usuario para realizar una búsqueda en la API externa de Gutendex, y muestra los resultados correspondientes.
public void buscarLibroPorTitulo() {
System.out.println("Escribe el nombre del libro que deseas buscar: ");
String tituloLibro = teclado.nextLine();
String json = consumoAPI.obtenerDatos(URL_BASE + "?search=" +
tituloLibro.replace(" ", "+").toLowerCase());
libroService.buscarLibroPorTitulo(tituloLibro, json);
}
Muestra todos los libros que están registrados en la base de datos. Esto proporciona al usuario una visión general de todos los libros disponibles en el catálogo
private void listarLibrosRegistrados() {
// Recuperar los libros almacenados en la BD y almacenarlos en la lista libros
List<Libro> libros = librosRepository.findAll();
libros.forEach(System.out::println);
}
Muestra una lista de todos los autores que están registrados en la base de datos. Esto permite al usuario explorar los distintos autores cuyos libros están disponibles en el catálogo.
private void listarAutoresRegistrados() {
// Obtener y ordenar la lista de autores a través del servicio
List<String> sortedAutores = autorService.listarAutoresRegistrados();
System.out.println("\nLISTADO DE AUTORES REGISTRADOS:" +
"\n──────────────────────────────");
sortedAutores.forEach(System.out::println);
}
Permite al usuario buscar autores que estén vivos en un año específico. Esto puede ser útil para investigar qué autores estaban activos en un determinado período de tiempo.
private void listarAutoresVivosEnDeterminadoAnio() {
System.out.println("En esta opción podrá buscar autores vivos en un determinado año." +
"\n¿Autores vivos en qué año desea encontrar?");
int anio = teclado.nextInt();
// Llama al servicio para listar los autores vivos en el año especificado
autorService.listarAutoresVivosEnAnio(anio);
}
Permite al usuario buscar libros escritos en un idioma específico. Esto facilita la búsqueda de libros en un idioma particular de interés para el usuario.
private void listarLibrosPorIdioma() {
System.out.println("En esta opción podrá buscar libros escritos en un determinado idioma. \n" +
"¿En qué idioma desea buscar?");
String idiomaStr = teclado.nextLine().toLowerCase(); // Convertir a minúsculas
// Eliminar tildes
idiomaStr = LibroService.eliminarTildes(idiomaStr);
// Manejar el caso especial para "español"
if ("español".equalsIgnoreCase(idiomaStr)) {
idiomaStr = "CASTELLANO";
}
try {
Idiomas idioma = Idiomas.valueOf(idiomaStr.toUpperCase()); // Convertir a objeto Idiomas
libroService.listarLibrosPorIdioma(idioma);
} catch (IllegalArgumentException e) {
System.out.println("El idioma ingresado no es válido.");
}
}
Permite al usuario buscar un libro específico ingresando su título o una parte de él. Esto facilita la búsqueda de libros específicos en el catálogo.
private void listarLibrosPorTitulo() {
System.out.println("En esta opción podrá buscar libros registrados en la base de datos. \n" +
"¿Qué titulo desea buscar?");
String titulo = teclado.nextLine();
List<Libro> libro = librosRepository.findByTituloContainingIgnoreCase(titulo);
if (libro.isEmpty()) {
System.out.println("No se encontraron libros con el titulo: " + titulo);
} else {
System.out.println("\nLIBRO ENCONTRADO:\n────────────────");
libro.forEach(System.out::println);
}
}
Permite al usuario buscar autores registrados en la base de datos por su nombre o apellido, o parte de ellos. Esto facilita la búsqueda de autores específicos en el catálogo.
private void listarAutoresPorNombre() {
System.out.println("En esta opción podrá buscar autores registrados en la base de datos. \n" +
"¿El nombre o apellido de qué autor desea buscar?");
String nombreAutor = teclado.nextLine();
// Llama al servicio para buscar autores por nombre
List<Autor> autores = autorService.listarAutoresPorNombre(nombreAutor);
// Verifica si la lista de autores está vacía
if (autores.isEmpty()) {
System.out.println("No se encontraron autores con el nombre: " + nombreAutor);
} else {
System.out.println("\nAUTOR ENCONTRADO:\n────────────────");
autores.forEach(System.out::println);
}
}
Este método busca y muestra los cinco libros más populares según el número de descargas. Accede a la lista de libros almacenados en el repositorio y, utilizando el servicio correspondiente, identifica los cinco libros que han sido descargados con más frecuencia. Luego, los imprime por pantalla junto con la cantidad de descargas que han recibido.
private void buscarTop5LibrosDescargados() {
// Obtener la lista de libros del repositorio
List<Libro> libros = librosRepository.findAll();
// Obtener los 5 libros más descargados del servicio
List<Libro> top5Libros = libroService.obtenerTop5LibrosMasDescargados(libros);
System.out.println("\nTop 5, libros más descargados.\nCANTIDAD TITULOS" +
"\nVECES MAS DESCARGADOS\n──────── ───────────");
// Mostrar los títulos de los 5 libros más descargados
top5Libros.forEach(libro -> System.out.println(libro.getNumeroDescargas() + " "
+ libro.getTitulo().toUpperCase()));
}
Esta opción proporciona al usuario estadísticas sobre la base de datos de LiterAlura. Puede incluir datos como el recuento total de libros y autores cargados, el recuento de libros por idioma, y estadísticas adicionales relevantes para la aplicación. Estas estadísticas ayudan al usuario a comprender mejor la composición y el alcance del catálogo de LiterAlura.
private void mostrarEstadisticas() {
// Llama al servicio de estadísticas para mostrar las estadísticas de la base de datos
estadisticasService.mostrarEstadisticas();
}
Si deseas contribuir a este proyecto, ¡eres bienvenido! Puedes enviar pull requests con mejoras o correcciones.
Agradezco al Programa ONE de Alura Latam y Oracle por proporcionar el material y el contexto para desarrollar este proyecto.
Este proyecto fue creado por Fica.
¡Siéntete libre de contactarme si tienes alguna pregunta o sugerencia!