CeliaHelp es un sistema de gestión de incidencias que permite a usuarios:
- Crear, consultar, actualizar y eliminar incidencias.
- Registrar acciones en un log para trazabilidad.
- Gestionar usuarios y roles.
- Backend: Java 21, Spring Boot 3.4.4, Maven.
- Persistencia: MySQL 8.0, Spring Data JPA, Hibernate 6.6.
- Contenedores: Docker Compose (MySQL, phpMyAdmin, Backend, Frontend).
- Control de versiones: Git.
src/
├─ main/
│ ├─ java/com/celiahelp/
│ │ ├─ controller/ # Controladores REST
│ │ ├─ dto/ # Data Transfer Objects
│ │ ├─ exception/ # Excepciones y manejador global
│ │ ├─ mapper/ # Mapeadores Entity<->DTO
│ │ ├─ model/ # Entidades JPA
│ │ ├─ repository/ # Repositorios Spring Data JPA
│ │ └─ service/ # Interfaces de servicios
│ │ └─ impl/ # Implementaciones de servicios
│ └─ resources/
│ └─ application.properties # Configuración Spring
│
├─ backend/Dockerfile
│ └─ scripts/wait-for-it.sh
└─ frontend/Dockerfile
- Compilar el proyecto:
./mvn clean package
- Levantar servicios:
docker compose up --build
- Documentación de la API disponible en
http://localhost:8080/swagger-ui/index.html.
| Recurso | Método | URI |
|---|---|---|
| Incidencias | GET | /api/incidencias |
| GET | /api/incidencias/{id} |
|
| POST | /api/incidencias |
|
| PUT | /api/incidencias/{id} |
|
| DELETE | /api/incidencias/{id} |
|
| Usuarios | GET | /api/usuarios |
| POST | /api/usuarios |
|
| PUT | /api/usuarios/{id} |
|
| Roles | GET | /api/roles |
| POST | /api/roles |
|
| Logs | GET | /api/logs |
| POST | /api/logs |
flowchart TD
A[Cliente] -- HTTP Request --> B{Es POST /api/incidencias?}
B -- Sí --> C1[AuthFilter sin JWT]
B -- No --> C2[AuthFilter con JWT]
C2 -->|Válido| D[AuthManager]
C2 -->|Inválido| E[Error 401/403]
D --> F[Set Auth]
C1 --> F
F --> G[Servlet]
G --> H[Controller]
H --> I[Validar entrada]
I --> J[Mapper]
J --> K[Service]
K --> L[ServiceImpl]
L --> M[Repository]
M --> N[Base de datos]
N --> M
M --> L
L --> J
J --> H
H --> O[Respuesta JSON]
flowchart TD
A[Petición HTTP entrante] --> B{"¿Ruta pública?"}
B -- Sí --> Z[Permitir acceso sin token]
B -- No --> C[JwtAuthenticationFilter]
C --> D{"¿Authorization: Bearer <token>?"}
D -- No --> J["JwtAuthenticationEntryPoint → 401"]
D -- Sí --> E[Validar token con JwtTokenProvider]
E --> F{"¿Token válido?"}
F -- No --> J
F -- Sí --> G[Extraer usuario y roles]
G --> H[UserDetailsServiceImpl carga el usuario]
H --> I[Setear Authentication en SecurityContext]
I --> K[Permitir acceso a recursos protegidos]
classDef green fill:#bbf,stroke:#333,stroke-width:1px;
Ubicación: /frontend
| Archivo | Propósito |
|---|---|
index.html |
Página de bienvenida con acceso general. |
create.html |
Formulario público para registrar incidencias sin autenticación. |
login.html |
Formulario de login, captura credenciales y obtiene JWT. |
incidencias.html |
Panel privado para visualizar y filtrar incidencias. |
api.js |
Módulo de funciones fetch para interactuar con la API. |
style.css |
Estilos personalizados con identidad visual (tema CeliaHelp). |
Flujo de navegación:
index.html → [crear.html] o [login.html] → incidencias.html (si login correcto)
📸 Imagen sugerida: Diagrama de flujo de navegación entre páginas.
- Se utiliza
fetchpara todas las peticiones HTTP. - El
token JWTse guarda enlocalStoragetras el login. - Cada petición autenticada incluye
Authorization: Bearer <token>.
async function loginUser(credentials) {
const response = await fetch('/auth/login', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(credentials)
});
const data = await response.json();
if (data.token) {
localStorage.setItem('token', data.token);
}
return data;
}Salida de comando exitosos
celia-api | 2025-05-23T12:44:03.471Z DEBUG 1 --- [celiahelp] [nio-8080-exec-1] o.s.security.web.FilterChainProxy : Securing OPTIONS /auth/login
celia-api | 2025-05-23T12:44:03.488Z DEBUG 1 --- [celiahelp] [nio-8080-exec-4] o.s.security.web.FilterChainProxy : Securing POST /auth/login
celia-api | 2025-05-23T12:44:03.488Z DEBUG 1 --- [celiahelp] [nio-8080-exec-4] o.s.s.w.a.AnonymousAuthenticationFilter : Set SecurityContextHolder to anonymous SecurityContext
celia-api | 2025-05-23T12:44:03.488Z DEBUG 1 --- [celiahelp] [nio-8080-exec-4] o.s.security.web.FilterChainProxy : Secured POST /auth/login
celia-api | 2025-05-23T12:44:03.488Z DEBUG 1 --- [celiahelp] [nio-8080-exec-4] o.s.web.servlet.DispatcherServlet : POST "/auth/login", parameters={}
celia-api | 2025-05-23T12:44:03.489Z DEBUG 1 --- [celiahelp] [nio-8080-exec-4] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped to com.celiahelp.controller.AuthController#login(LoginRequest)
celia-api | 2025-05-23T12:44:03.489Z DEBUG 1 --- [celiahelp] [nio-8080-exec-4] m.m.a.RequestResponseBodyMethodProcessor : Read "application/json;charset=UTF-8" to [LoginRequest[email=admin@celiahelp.com, password=admin123]]
celia-api | 2025-05-23T12:44:03.491Z DEBUG 1 --- [celiahelp] [nio-8080-exec-4] org.hibernate.SQL :
celia-api | select
celia-api | u1_0.id,
celia-api | u1_0.email,
celia-api | u1_0.nombre,
celia-api | u1_0.password_hash,
celia-api | r1_0.id,
celia-api | r1_0.tipo
celia-api | from
celia-api | usuarios u1_0
celia-api | join
celia-api | roles r1_0
celia-api | on r1_0.id=u1_0.rol_id
celia-api | where
celia-api | u1_0.email=?
celia-api | Hibernate:
celia-api | select
celia-api | u1_0.id,
celia-api | u1_0.email,
celia-api | u1_0.nombre,
celia-api | u1_0.password_hash,
celia-api | r1_0.id,
celia-api | r1_0.tipo
celia-api | from
celia-api | usuarios u1_0
celia-api | join
celia-api | roles r1_0
celia-api | on r1_0.id=u1_0.rol_id
celia-api | where
celia-api | u1_0.email=?
celia-api | 2025-05-23T12:44:03.552Z DEBUG 1 --- [celiahelp] [nio-8080-exec-4] o.s.s.a.dao.DaoAuthenticationProvider : Authenticated user
celia-api | 2025-05-23T12:44:03.553Z DEBUG 1 --- [celiahelp] [nio-8080-exec-4] o.s.w.s.m.m.a.HttpEntityMethodProcessor : Using 'application/json', given [*/*] and supported [application/json, application/*+json, application/yaml]
celia-api | 2025-05-23T12:44:03.554Z DEBUG 1 --- [celiahelp] [nio-8080-exec-4] o.s.w.s.m.m.a.HttpEntityMethodProcessor : Writing [AuthResponse[accessToken=eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZG1pbkBjZWxpYWhlbHAuY29tIiwiaWF0IjoxNzQ4MD (truncated)...]
celia-api | 2025-05-23T12:44:03.554Z DEBUG 1 --- [celiahelp] [nio-8080-exec-4] o.s.web.servlet.DispatcherServlet : Completed 200 OK
celia-front | 172.18.0.1 - - [23/May/2025:12:44:03 +0000] "GET /incidencias.html HTTP/1.1" 200 2070
celia-front | 172.18.0.1 - - [23/May/2025:12:44:03 +0000] "GET /js/view.js HTTP/1.1" 200 1839
celia-api | 2025-05-23T12:44:03.600Z DEBUG 1 --- [celiahelp] [nio-8080-exec-3] o.s.security.web.FilterChainProxy : Securing OPTIONS /api/incidencias
celia-api | 2025-05-23T12:44:03.605Z DEBUG 1 --- [celiahelp] [nio-8080-exec-7] o.s.security.web.FilterChainProxy : Securing GET /api/incidencias- Las páginas públicas no requieren token (
index.html,create.html,login.html). incidencias.htmlverifica si hay token válido antes de cargar.- Si no hay token → redirige a
login.html.
const token = localStorage.getItem('token');
if (!token) {
window.location.href = 'login.html';
}📸 Imagen sugerida: Intento de acceso directo a incidencias.html sin login → redirige.
fetch('/api/incidencias', {
headers: { 'Authorization': 'Bearer ' + localStorage.getItem('token') }
});fetch('/api/incidencias', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ titulo, descripcion, ... })
});Especifica el perfil profesional que debe simular la IA.
Ejemplo:
Eres un técnico de sistemas especializado en redes Linux y automatización con Bash.
Indica con claridad qué quieres que haga la IA.
Ejemplo:
Necesito generar un script que monitorice los servicios del sistema y envíe una alerta si alguno deja de funcionar.
Describe el entorno, sistema o situación específica.
Ejemplo:
Sistema operativo Debian 12. Servicios a monitorizar: apache2 y mysql. El sistema tiene instalado mail para notificaciones por correo.
Detalla qué debe y qué no debe hacer la IA. Incluye herramientas permitidas, versiones, límites técnicos, etc.
Ejemplo:
- Usar solo comandos nativos de Bash
- No instalar software adicional
- Compatible con cron
Define cómo debe entregarte la respuesta: código, tabla, JSON, lista, etc.
Ejemplo:
- Script en Bash con comentarios explicativos
- Instrucciones claras para ejecutarlo y añadirlo a cron
Si puedes, ofrece un modelo o plantilla a seguir. GPT aprende por imitación.
Ejemplo:
Como este script:
if ! pgrep apache2; then
systemctl restart apache2
echo "Apache reiniciado" | mail -s "Alerta Apache" admin@midominio.com
fi



