- Descripción
- Funcionalidades
- Demostración
- Acceso
- Tecnologías Utilizadas
- Código de Ejemplo
- Contribución
- Agradecimientos
- Autor
La API de Foro Hub es una aplicación backend desarrollada para facilitar funcionalidades de foros de discusión. Construida con Java y Spring Boot, proporciona endpoints RESTful robustos para gestionar tópicos, mensajes, autenticación de usuarios y más. Esta API se integra perfectamente con MySQL para el almacenamiento de datos y utiliza Swagger para una documentación clara y detallada de la API.
- Gestión de Usuarios: Registro de nuevos usuarios y autenticación de usuarios existentes mediante tokens JWT (JSON Web Tokens).
- Gestión de Tópicos: Creación, actualización y cierre de tópicos de discusión.
- Gestión de Mensajes: Adición, eliminación y recuperación de mensajes dentro de los tópicos.
- Filtrado por Curso: Filtrado de tópicos basado en cursos asociados.
- Paginación: Uso de solicitudes paginables para una recuperación eficiente de datos.
A continuación se muestra cómo utilizar la API de Foro Hub mediante Swagger:
-
Dirígete a
POST /usuarios/registro
y completa los campos de nombre, email y clave. -
Confirma que el usuario ha sido registrado correctamente.
-
Usa
POST /auth/login
para autenticarte y obtener un jwtToken. -
Ve al icono de "Authorize" en la parte superior derecha.
-
Ingresa el token encriptado.
-
Con el usuario autenticado, podrás acceder a todas las funcionalidades de
Foro Hub
.
Puede acceder a la API de Foro Hub localmente siguiendo estos pasos:
- Clonar el Repositorio:
git clone https://github.com/Fica-Millan/alura_ForoHub.git
- Ejecutar la Aplicación:
- Abra el proyecto en IntelliJ IDEA.
- Configure la conexión segura de la base de datos MySQL en application.properties mediante el uso de variables de entorno:
spring.datasource.url=jdbc:mysql://${MYSQL_HOST}/${MYSQL_NAME}
spring.datasource.username=${MYSQL_USER}
spring.datasource.password=${MYSQL_PASS}
- Compila y ejecuta la aplicación.
- Explorar la API:
- Acceda a Swagger UI en http://localhost:8080/swagger-ui/index.html#/ para la documentación de la API.
- Utilice herramientas como Insomnia para probar los endpoints e interactuar con la API.
- Java 17: Lenguaje de programación para lógica backend.
- Spring Boot 2.6.5: Marco de trabajo para construir y desplegar aplicaciones Java.
- Swagger 3.0: Herramienta de documentación y exploración de API.
- MySQL 8: Sistema de gestión de base de datos relacional para almacenamiento de datos.
- Insomnia 2024.1: Cliente API RESTful para probar endpoints.
@PostMapping
public ResponseEntity<DatosRegistroTopico> registrarTopico(
@Valid @RequestBody DatosRegistroTopico datosRegistroTopico,
UriComponentsBuilder uriComponentsBuilder) {
Topico topico = topicoService.registrarTopico(datosRegistroTopico);
URI uri = uriComponentsBuilder.path("/topicos/{id}")
.buildAndExpand(topico.getId())
.toUri();
return ResponseEntity.created(uri).body(datosRegistroTopico);
}
@GetMapping
public ResponseEntity<PagedModel<EntityModel<DatosListadoTopico>>> listadoTopicos(
@PageableDefault(size = 10, sort = "fecha", direction = Sort.Direction.ASC) Pageable paginacion) {
Page<DatosListadoTopico> topicosPage = topicoService.listarTopicos(paginacion);
PagedModel<EntityModel<DatosListadoTopico>> pagedModel = topicoService.convertirAPagedModel(topicosPage,
pagedResourcesAssembler, paginacion);
return ResponseEntity.ok(pagedModel);
}
@GetMapping("/{id}")
public ResponseEntity<EntityModel<Topico>> buscarDetalleTopicoPorId(@PathVariable Long id) {
Optional<Topico> optionalTopico = topicoService.buscarTopicoPorId(id);
if (optionalTopico.isPresent()) {
Topico topico = optionalTopico.get();
return ResponseEntity.ok(EntityModel.of(topico));
} else {
return ResponseEntity.notFound().build();
}
}
@GetMapping("/buscar")
public ResponseEntity<PagedModel<EntityModel<DatosListadoTopico>>> buscarTopicosPorCurso(
@RequestParam(name = "curso") String nombreCurso,
@PageableDefault(size = 10, sort = "fecha", direction = Sort.Direction.ASC) Pageable paginacion) {
Page<DatosListadoTopico> datosListadoTopicoPage = topicoService.buscarTopicosPorCurso(nombreCurso, paginacion);
PagedModel<EntityModel<DatosListadoTopico>> pagedModel = topicoService.convertirAPagedModel(datosListadoTopicoPage,
pagedResourcesAssembler, paginacion);
return ResponseEntity.ok(pagedModel);
}
@PutMapping("/{id}")
public ResponseEntity <DatosListadoMensaje>actualizarTopico(@PathVariable Long id,
@Valid @RequestBody DatosActualizarTopico datosActualizarTopico){
topicoService.actualizarTopico(id, datosActualizarTopico);
DatosListadoMensaje datosUltimoMensaje = topicoService.obtenerUltimoMensaje(id);
return ResponseEntity.ok(datosUltimoMensaje);
}
@DeleteMapping("/{idTopico}/mensajes/{idMensaje}")
public ResponseEntity<String> eliminarMensaje(@PathVariable Long idTopico,
@PathVariable Long idMensaje) {
topicoService.eliminarMensaje(idTopico, idMensaje);
return ResponseEntity.ok("Mensaje eliminado exitosamente");
}
@DeleteMapping("/{id}")
@Transactional
public ResponseEntity<String> cerrarTopico(@PathVariable Long id) {
topicoService.cerrarTopico(id);
return ResponseEntity.ok("Tópico cerrado exitosamente");
}
Si deseas contribuir a este proyecto, por favor sigue los siguientes pasos:
- Realiza un fork del repositorio.
- Crea una nueva rama (
git checkout -b feature-nueva-funcionalidad
). - Realiza tus cambios y haz commit (
git commit -m 'Agrega nueva funcionalidad'
). - Empuja tus cambios a la rama (
git push origin feature-nueva-funcionalidad
). - Abre un Pull Request.
Por favor, asegúrate de seguir las buenas prácticas de contribución y respeta el código de conducta del proyecto. Esto incluye escribir código limpio y bien documentado, realizar pruebas exhaustivas antes de enviar tus cambios, y mantener un ambiente respetuoso y colaborativo en todas las interacciones.
Agradezco al Programa ONE de Alura Latam y Oracle por proveer 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!