Skip to content

Latest commit

Β 

History

84 Commits

Folders and files

NameName
Last commit message
Last commit date
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

πŸŽ“ FOROEPCC - Foro AcadΓ©mico para Estudiantes de Ciencia de la ComputaciΓ³n

Java Spring Boot Next.js PostgreSQL Jenkins SonarQube

Proyecto Final - IngenierΓ­a de Software II
Universidad Nacional de San AgustΓ­n de Arequipa

Repositorio GitHub


πŸ“‹ Tabla de Contenidos

  1. Equipo de Trabajo
  2. PropΓ³sito del Proyecto
  3. Funcionalidades de Alto Nivel
  4. Modelo de Dominio
  5. VisiΓ³n General de Arquitectura
  6. Servicios REST Disponibles
  7. Pipeline CI/CD
  8. InstalaciΓ³n y EjecuciΓ³n
  9. Capturas de Pantalla

1. Equipo de Trabajo

πŸ‘₯ FOROEPCC

πŸ‘₯ Integrantes del equipo

  • Huayhua Carlos, Lenin
  • Lizarve Mamani, Johan
  • Mamani Yucra, Edilson

2. PropΓ³sito del Proyecto

🎯 Objetivo General

FOROEPCC es una plataforma web tipo foro acadΓ©mico diseΓ±ada especΓ­ficamente para estudiantes de la Escuela Profesional de Ciencia de la ComputaciΓ³n (EPCC) de la UNSA. El sistema permite a los estudiantes:

  • Compartir conocimiento mediante publicaciones y respuestas.
  • Resolver dudas acadΓ©micas de forma colaborativa.
  • Interactuar con otros estudiantes a travΓ©s de comentarios y votos.
  • Buscar informaciΓ³n utilizando un motor de bΓΊsqueda integrado.

πŸ”‘ Objetivos EspecΓ­ficos

  1. Implementar un sistema de autenticaciΓ³n seguro con JWT.
  2. Desarrollar un CRUD completo para posts, respuestas y comentarios.
  3. Aplicar prΓ‘cticas de Domain-Driven Design (DDD) y Clean Architecture.
  4. Establecer un pipeline CI/CD completo con Jenkins.
  5. Garantizar la calidad del cΓ³digo mediante anΓ‘lisis estΓ‘tico y pruebas automatizadas.

3. Funcionalidades de Alto Nivel

πŸ“Š Diagrama de Casos de Uso

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                        SISTEMA FOROEPCC                          β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                  β”‚
β”‚   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”                                                   β”‚
β”‚   β”‚ Usuario β”‚                                                   β”‚
β”‚   β”‚ AnΓ³nimo │──────┬──► Registrarse                             β”‚
β”‚   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜      β”‚                                            β”‚
β”‚                    └──► Ver Posts PΓΊblicos                      β”‚
β”‚                                                                  β”‚
β”‚   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”                                                   β”‚
β”‚   β”‚ Usuario │──────┬──► Iniciar SesiΓ³n                          β”‚
β”‚   β”‚Registradoβ”‚     β”œβ”€β”€β–Ί Crear Post                              β”‚
β”‚   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜      β”œβ”€β”€β–Ί Responder Post                          β”‚
β”‚                    β”œβ”€β”€β–Ί Comentar Respuesta                      β”‚
β”‚                    β”œβ”€β”€β–Ί Buscar Posts                            β”‚
β”‚                    β”œβ”€β”€β–Ί Ver Detalles de Post                    β”‚
β”‚                    β”œβ”€β”€β–Ί Editar Perfil                           β”‚
β”‚                    └──► Cerrar SesiΓ³n                           β”‚
β”‚                                                                  β”‚
β”‚   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”                                                   β”‚
β”‚   β”‚  Admin  │──────┬──► Gestionar Usuarios                      β”‚
β”‚   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜      β”œβ”€β”€β–Ί Moderar Contenido                       β”‚
β”‚                    └──► Ver EstadΓ­sticas                        β”‚
β”‚                                                                  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

✨ Funcionalidades Principales

MΓ³dulo Funcionalidad DescripciΓ³n
Auth Registro CreaciΓ³n de cuenta con validaciΓ³n de datos
Auth Login/Logout AutenticaciΓ³n mediante JWT
Post CRUD Posts Crear, leer, actualizar y eliminar publicaciones
Post Respuestas Sistema de respuestas a posts
Post Comentarios Comentarios anidados en respuestas
Search BΓΊsqueda Motor de bΓΊsqueda full-text con Hibernate Search
User Perfil GestiΓ³n de informaciΓ³n del usuario

4. Modelo de Dominio

πŸ“ Diagrama de Clases Principal

Untitled

πŸ“¦ MΓ³dulos Principales

MΓ³dulo Responsabilidad Entidades
auth AutenticaciΓ³n y autorizaciΓ³n (JWT) ForoUser, Role, Person
post GestiΓ³n de publicaciones, respuestas y comentarios Post, Entry, Answer, Comment
user GestiΓ³n de perfiles de usuario ForoUser, Person

πŸ“ Carpetas de Soporte

Carpeta Responsabilidad
config Configuraciones de Spring Security, WebSocket, CORS
dto Data Transfer Objects compartidos
exceptions Manejadores globales de excepciones
shared Utilidades y componentes transversales

5. VisiΓ³n General de Arquitectura

πŸ—οΈ Enfoque: DDD + Clean Architecture

El proyecto sigue los principios de Domain-Driven Design (DDD) combinados con Clean Architecture, organizando el cΓ³digo en capas bien definidas:

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                      CAPA DE PRESENTACIΓ“N                        β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”              β”‚
β”‚  β”‚ Controllers β”‚  β”‚    DTOs     β”‚  β”‚  Responses  β”‚              β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜              β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚         β–Ό           CAPA DE APLICACIΓ“N                          β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”              β”‚
β”‚  β”‚  Services   β”‚  β”‚ Interfaces  β”‚  β”‚   Mappers   β”‚              β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜              β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚         β–Ό             CAPA DE DOMINIO                           β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”              β”‚
β”‚  β”‚  Entities   β”‚  β”‚   Value     β”‚  β”‚  Domain     β”‚              β”‚
β”‚  β”‚  (Modelos)  β”‚  β”‚   Objects   β”‚  β”‚  Events     β”‚              β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜              β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚         β–Ό         CAPA DE INFRAESTRUCTURA                       β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”              β”‚
β”‚  β”‚Repositories β”‚  β”‚  Security   β”‚  β”‚   Config    β”‚              β”‚
β”‚  β”‚    (JPA)    β”‚  β”‚   (JWT)     β”‚  β”‚  (Spring)   β”‚              β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜              β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ“ Diagrama de Paquetes

backend/
β”œβ”€β”€ src/main/java/com/app/
β”‚   β”œβ”€β”€ modules/
β”‚   β”‚   β”œβ”€β”€ auth/
β”‚   β”‚   β”‚   β”œβ”€β”€ controller/     # AuthController
β”‚   β”‚   β”‚   β”œβ”€β”€ dto/            # LoginDTO, SignupDTO, TokenDTO
β”‚   β”‚   β”‚   β”œβ”€β”€ model/          # ForoUser, Role, Person
β”‚   β”‚   β”‚   β”œβ”€β”€ repository/     # UserRepository, RoleRepository
β”‚   β”‚   β”‚   └── service/        # UserService, JwtService
β”‚   β”‚   β”‚
β”‚   β”‚   β”œβ”€β”€ post/
β”‚   β”‚   β”‚   β”œβ”€β”€ controller/     # PostController, AnswerController, CommentController
β”‚   β”‚   β”‚   β”œβ”€β”€ dto/            # PostDTO, AnswerDTO, CommentDTO
β”‚   β”‚   β”‚   β”œβ”€β”€ model/          # Post, Entry, Answer, Comment
β”‚   β”‚   β”‚   β”œβ”€β”€ repository/     # PostRepository, AnswerRepository
β”‚   β”‚   β”‚   └── service/        # PostService, AnswerService, CommentService
β”‚   β”‚   β”‚
β”‚   β”‚   └── search/
β”‚   β”‚       β”œβ”€β”€ controller/     # SearchController
β”‚   β”‚       └── service/        # SearchService (Hibernate Search)
β”‚   β”‚
β”‚   β”œβ”€β”€ shared/
β”‚   β”‚   β”œβ”€β”€ config/             # SecurityConfig, WebConfig
β”‚   β”‚   β”œβ”€β”€ exception/          # GlobalExceptionHandler
β”‚   β”‚   └── utils/              # JwtUtils, ValidationUtils
β”‚   β”‚
β”‚   └── BackendApplication.java
β”‚
β”œβ”€β”€ src/test/java/com/app/
β”‚   β”œβ”€β”€ modules/post/
β”‚   β”‚   β”œβ”€β”€ controller/         # Tests unitarios de controllers
β”‚   β”‚   └── functional/         # Tests funcionales de integraciΓ³n
β”‚   β”‚
β”‚   └── security/               # Tests de seguridad y autorizaciΓ³n
β”‚
└── src/gatling/java/simulations/  # Tests de rendimiento
    β”œβ”€β”€ LoginLoadSimulation.java
    β”œβ”€β”€ PostReadLoadSimulation.java
    └── SearchLoadSimulation.java

6. Servicios REST Disponibles

πŸ“– DocumentaciΓ³n OpenAPI / Swagger

Screenshot 2026-01-14 103924

πŸ” MΓ³dulo: Authentication (/auth)

PropΓ³sito: GestiΓ³n de registro, inicio de sesiΓ³n y tokens JWT.

MΓ©todo Endpoint DescripciΓ³n ParΓ‘metros
POST /auth/signup Registrar nuevo usuario SignupFieldsDTO (body)
POST /auth/signin Iniciar sesiΓ³n LoginRequestDTO (body)
GET /auth/hello Verificar estado del servicio -

Modelos Involucrados:

// SignupFieldsDTO
{
  "username": "string",
  "password": "string",
  "email": "string",
  "firstName": "string",
  "lastName": "string"
}

// LoginRequestDTO
{
  "username": "string",
  "password": "string"
}

// TokenResponseDTO
{
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6..."
}

πŸ“ MΓ³dulo: Posts (/post)

PropΓ³sito: CRUD completo de publicaciones del foro.

MΓ©todo Endpoint DescripciΓ³n Auth
POST /post/create Crear nueva publicaciΓ³n βœ… JWT
GET /post/ultimatePost Obtener posts recientes ❌ Público
GET /post/details/{id} Ver detalles de un post ❌ Público

Modelos Involucrados:

// CreatePostDTO
{
  "title": "string",
  "content": "string",
  "image": "string (opcional)"
}

// PostResponseDTO
{
  "id": 1,
  "title": "string",
  "content": "string",
  "authorUsername": "string",
  "views": 0,
  "answers": 0,
  "createdAt": "2026-01-14T00:00:00Z"
}

πŸ’¬ MΓ³dulo: Answers (/answer)

PropΓ³sito: GestiΓ³n de respuestas a publicaciones.

MΓ©todo Endpoint DescripciΓ³n Auth
POST /answer/create Crear respuesta a post βœ… JWT
GET /answer/post/{postId} Obtener respuestas de un post ❌ Público

πŸ—¨οΈ MΓ³dulo: Comments (/comment)

PropΓ³sito: GestiΓ³n de comentarios en respuestas.

MΓ©todo Endpoint DescripciΓ³n Auth
POST /comment/create Crear comentario βœ… JWT
GET /comment/answer/{answerId} Obtener comentarios ❌ Público

πŸ” MΓ³dulo: Search (/search)

PropΓ³sito: Motor de bΓΊsqueda full-text sobre posts.

MΓ©todo Endpoint DescripciΓ³n ParΓ‘metros
GET /search Buscar posts query (string)

7. Pipeline CI/CD

πŸ”„ VisiΓ³n General del Pipeline

El proyecto implementa un pipeline de IntegraciΓ³n y Entrega Continua utilizando Jenkins, activado automΓ‘ticamente mediante webhooks de GitHub.

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                           PIPELINE CI/CD                                     β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                              β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”               β”‚
β”‚  β”‚ Checkout │───►│  Build   │───►│ SonarQube│───►│  Unit    β”‚               β”‚
β”‚  β”‚   SCM    β”‚    β”‚ (Gradle) β”‚    β”‚ Analysis β”‚    β”‚  Tests   β”‚               β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜               β”‚
β”‚                                                        β”‚                     β”‚
β”‚       β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                    β”‚
β”‚       β–Ό                                                                      β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”               β”‚
β”‚  β”‚Functional│───►│ Security │───►│   Perf   │───►│ Package  β”‚               β”‚
β”‚  β”‚  Tests   β”‚    β”‚  Tests   β”‚    β”‚  Tests   β”‚    β”‚  (JAR)   β”‚               β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜               β”‚
β”‚                                                                              β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
image

πŸ“‹ Etapas del Pipeline

1️⃣ ConstrucciΓ³n AutomΓ‘tica

  • Herramienta: Gradle 8.11
  • Comando: ./gradlew clean assemble -x test
  • DescripciΓ³n: Compila el cΓ³digo fuente y genera los artefactos sin ejecutar tests.

2️⃣ AnΓ‘lisis EstΓ‘tico de CΓ³digo

  • Herramienta: SonarQube + sonar-scanner
  • Comando: ./gradlew sonar
  • MΓ©tricas Analizadas:
    • Code Smells
    • Vulnerabilidades de seguridad
    • Cobertura de cΓ³digo
    • DuplicaciΓ³n de cΓ³digo
    • Complejidad ciclomΓ‘tica

3️⃣ Pruebas Unitarias

  • Framework: JUnit 5 + Mockito
  • Comando: ./gradlew unitTest
  • Cobertura: Controllers, Services, Repositories
  • Ejemplos:
    • AnswerControllerTest.java
    • CommentControllerTest.java
    • PostControllerTest.java

4️⃣ Pruebas Funcionales

  • Framework: Spring Boot Test + MockMvc
  • Comando: ./gradlew functionalTest
  • DescripciΓ³n: Pruebas de integraciΓ³n end-to-end.
  • Ejemplos:
    • AuthFunctionalTest.java - Flujo de registro de usuarios
    • PostFunctionalTest.java - Flujo de creaciΓ³n de posts
public class AnswerControllerTest extends BaseIntegrationTest {

    @MockBean
    private IAnswerService answerService;

    @Test
    @WithMockUser(username = "user", roles = { "USER" })
    void testCreateAnswerSuccess() throws Exception {
        CreateAnswerFieldsDTO fields = new CreateAnswerFieldsDTO(1L, "This is an answer");

        Person person = Person.builder().firstName("John").lastName("Doe").build();
        ForoUser user = ForoUser.builder().id(2L).username("user").person(person).build();

        Post post = Post.builder().id(1L).title("Test Post").build();

        Entry entry = Entry.builder()
                .id(10L)
                .content("This is an answer")
                .user(user)
                .createdAt(LocalDateTime.now())
                .upVotes(0)
                .downVotes(0)
                .build();

        Answer answer = Answer.builder()
                .id(100L)
                .entry(entry)
                .post(post)
                .build();

        when(answerService.createAnswer(anyLong(), anyString())).thenReturn(answer);

        mockMvc.perform(post("/answer")
                .contentType(MediaType.APPLICATION_JSON)
                .content(objectMapper.writeValueAsString(fields)))
                .andExpect(status().isCreated())
                .andExpect(jsonPath("$.id").value(100))
                .andExpect(jsonPath("$.content").value("This is an answer"))
                .andExpect(jsonPath("$.postId").value(1));
    }

    @Test
    void testCreateAnswerUnauthorized() throws Exception {
        CreateAnswerFieldsDTO fields = new CreateAnswerFieldsDTO(1L, "This is an answer");

        mockMvc.perform(post("/answer")
                .contentType(MediaType.APPLICATION_JSON)
                .content(objectMapper.writeValueAsString(fields)))
                .andExpect(status().isUnauthorized()); // Assuming 401/403 behavior
    }
}

5️⃣ Pruebas de Seguridad

  • Framework: Spring Security Test + OWASP Dependency Check
  • Comandos:
    • ./gradlew securityTest - Tests de autorizaciΓ³n
    • ./gradlew dependencyCheckAnalyze - AnΓ‘lisis de vulnerabilidades CVE
  • Ejemplos:
    • AuthorizationSecurityTest.java - VerificaciΓ³n de endpoints protegidos

6️⃣ Pruebas de Rendimiento

  • Framework: Gatling (Java DSL)
  • Comando: ./gradlew gatlingRun
  • Simulaciones:
    SimulaciΓ³n DescripciΓ³n Usuarios Virtuales
    LoginLoadSimulation Stress test de login 50 usuarios/seg
    PostReadLoadSimulation Carga de lectura de posts 100 usuarios/seg
    SearchLoadSimulation EstrΓ©s del motor de bΓΊsqueda 30 usuarios/seg

7️⃣ Empaquetado

  • Herramienta: Gradle + Spring Boot
  • Comando: ./gradlew bootJar
  • Artefacto: backend-0.0.1-SNAPSHOT.jar

πŸ› GestiΓ³n de Issues

El proyecto utiliza GitHub Issues y GitHub Projects para el seguimiento de:

  • 🐞 Bugs: Errores identificados durante desarrollo y testing.
  • ✨ Features: Nuevas funcionalidades solicitadas.
  • πŸ“ Tasks: Tareas tΓ©cnicas y de documentaciΓ³n.
  • πŸ”§ Improvements: Mejoras de cΓ³digo existente.

Tablero Kanban: image


8. InstalaciΓ³n y EjecuciΓ³n

πŸ“‹ Requisitos Previos

  • Java 21 (JDK)
  • Node.js 18+ (para el frontend)
  • PostgreSQL 15
  • Docker Desktop (opcional, para contenedores)
  • Jenkins (para CI/CD)

πŸš€ EjecuciΓ³n Local

Backend

cd backend
./gradlew bootRun

El servidor estarΓ‘ disponible en: http://localhost:8080

Frontend

cd frontend
npm install
npm run dev

La aplicaciΓ³n estarΓ‘ disponible en: http://localhost:3000

9. Capturas de Pantalla

πŸ” Registro de Usuario

Register

πŸ”‘ Inicio de SesiΓ³n

Login

🏠 PÑgina Principal

Home

πŸ“ Vista de Posts

Posts


FOROEPCC Β© 2026 - Todos los derechos reservados

Desarrollado con ❀️ por el equipo FOROEPCC

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages