🎯 Ecosistema 100% Funcional con 4 Microservicios Integrados - API Gateway que orquesta Component-1 (SIA Colegios), Component-2-1 (Profesores), Component-2-2 (Calificaciones) y Component-4 (Autenticación) con 35 endpoints disponibles.
🌐 API Gateway (Node.js + GraphQL) - Puerto 9000
├── 🎓 Component-1 (SIA Colegios) - Puerto 8083
│ ├── 🔧 Django 4.2.9 + Django REST Framework │ └── 🗄️ PostgreSQL SIA - Puerto 5433
├── 🔒 Component-4 (Authentication) - Puerto 8082
│ ├── 🔧 Go + Gin + JWT + OAuth2
│ └── 🗄️ PostgreSQL Auth - Puerto 5432
├── 👨🏫 Component-2-1 (Profesores & Asignaturas) - Puerto 8080 │ ├── 🔧 Java Spring Boot + GraphQL
│ └── 🗄️ MongoDB Profesores - Puerto 27018
└── 📊 Component-2-2 (Calificaciones) - Puerto 8081
├── 🔧 Java Spring Boot + GraphQL
└── 🗄️ MongoDB Calificaciones - Puerto 27019
- Docker y Docker Compose instalados
- Puertos 9000, 8080, 8081, 8082, 8083, 5432, 5433, 27018, 27019 disponibles
# 1. Clonar el repositorio
git clone [URL_DEL_REPOSITORIO]
cd API_Gateway/api-gateway-main
# 2. Iniciar todo el ecosistema
docker-compose up -d
# 3. Verificar que todos los servicios están ejecutándose
docker-compose ps
# 4. Probar conectividad básica
curl -X POST http://localhost:9000/graphql \
-H "Content-Type: application/json" \
-d '{"query": "query { cursos { count } holaMundo1 holaMundo2 }"}'# Usar el script automatizado para desarrollo
./start-dev.shEl Sistema de Información Académica maneja cursos y estudiantes con datos precargados de 18 cursos (desde 1-A hasta 11-B) y 36 estudiantes.
| Endpoint | Tipo | Descripción | Parámetros |
|---|---|---|---|
cursos | Query | Listar cursos con filtros y paginación | search?, ordering?, page? |
curso | Query | Obtener curso específico por ID | id! |
cursoEstudiantes | Query | Estudiantes de un curso específico | id! |
crearCurso | Mutation | Crear nuevo curso | input: {nombre!, codigo!} |
actualizarCurso | Mutation | Actualizar curso completamente | id!, input: {nombre!, codigo!} |
actualizarCursoParcial | Mutation | Actualizar curso parcialmente | id!, nombre?, codigo? |
eliminarCurso | Mutation | Eliminar curso | id! |
| Endpoint | Tipo | Descripción | Parámetros |
|---|---|---|---|
estudiantes | Query | Listar estudiantes con filtros y paginación | search?, ordering?, page? |
estudiante | Query | Obtener estudiante específico por ID | id! |
estudiantesPorCurso | Query | Estudiantes filtrados por código de curso | codigo! |
crearEstudiante | Mutation | Crear nuevo estudiante | input: EstudianteInput! |
actualizarEstudiante | Mutation | Actualizar estudiante completamente | id!, input: EstudianteInput! |
actualizarEstudianteParcial | Mutation | Actualizar estudiante parcialmente | id!, campos opcionales |
eliminarEstudiante | Mutation | Eliminar estudiante | id! |
Crear Curso:
mutation {
crearCurso(input: {
nombre: "Doce A"codigo: "12-A"
}) {
idnombrecodigo
}
}Listar Cursos con Filtros:
query {
cursos(search: "A", ordering: "nombre", page: 1) {
countnextpreviousresults {
idnombrecodigoestudiantes {
idnombreCompletodocumento
}
}
}
}Crear Estudiante:
mutation {
crearEstudiante(input: {
nombreCompleto: "Ana María Rodríguez"documento: "1234567890"fechaNacimiento: "2010-05-15"acudiente: "Carlos Rodríguez"curso: "1"
}) {
idnombreCompletodocumentocurso {
nombrecodigo
}
}
}Actualizar Estudiante Parcialmente:
mutation {
actualizarEstudianteParcial(
id: "5"acudiente: "Nuevo Acudiente"curso: "2"
) {
idnombreCompletoacudientecurso {
nombrecodigo
}
}
}| Endpoint | Tipo | Descripción | Requiere Token |
|---|---|---|---|
loginUser | Mutation | Login con email/password | ❌ |
registerUser | Mutation | Registro de nuevo usuario | ❌ |
userProfile | Query | Obtener perfil del usuario | ✅ |
getGoogleLoginUrl | Query | URL para OAuth2 Google | ❌ |
Email: test@example.com
Password: password123Login:
mutation {
loginUser(input: {
email: "test@example.com"password: "password123"
}) {
tokenmessage
}
}Perfil de Usuario:
# Header: Authorization: Bearer [TOKEN_JWT]query {
userProfile {
messageuser_id
}
}| Endpoint | Tipo | Descripción | Parámetros |
|---|---|---|---|
profesores | Query | Listar todos los profesores | - |
crearProfesor | Mutation | Crear nuevo profesor | nombre, documento, area |
actualizarProfesor | Mutation | Actualizar profesor existente | id, nombre?, documento?, area? |
eliminarProfesor | Mutation | Eliminar profesor | id |
asignaturas | Query | Listar todas las asignaturas | - |
crearAsignatura | Mutation | Crear nueva asignatura | nombre |
actualizarAsignatura | Mutation | Actualizar asignatura | id, nombre |
asignarProfesorAAsignatura | Mutation | Asignar profesor a asignatura | profesorId, asignaturaId |
desasignarProfesorDeAsignatura | Mutation | Desasignar profesor | profesorId, asignaturaId |
Crear Profesor:
mutation {
crearProfesor(
nombre: "Dr. María García"documento: "CC87654321"area: "Matemáticas"
) {
idnombredocumentoarea
}
}Actualizar Asignatura:
mutation {
actualizarAsignatura(
id: "65a1b2c3d4e5f6789012345"nombre: "Álgebra Lineal Avanzada"
) {
idnombreprofesorIds
}
}| Endpoint | Tipo | Descripción | Parámetros |
|---|---|---|---|
calificaciones | Query | Listar calificaciones (con filtros) | estudianteId?, asignaturaId?, cursoId?, periodo? |
registrarCalificacion | Mutation | Registrar nueva calificación | estudianteId, asignaturaId, cursoId, periodo, nota, observaciones? |
actualizarCalificacion | Mutation | Actualizar calificación | id, nota?, observaciones? |
eliminarCalificacion | Mutation | Eliminar calificación | id |
Registrar Calificación Completa:
mutation {
registrarCalificacion(
estudianteId: "est-12345"asignaturaId: "65a1b2c3d4e5f6789012346"cursoId: "11-A"periodo: "2025-1"nota: 4.5observaciones: "Excelente desempeño en el examen"
) {
idestudianteIdnotaobservaciones
}
}| Endpoint | Tipo | Descripción |
|---|---|---|
holaMundo1 | Query | Health check Component-2-1 |
holaMundo2 | Query | Health check Component-2-2 |
- Descargar:
API_Gateway_Tests_DEFINITIVO_COMPLETO.postman_collection.json - Importar en Postman
- Configurar variable de entorno
base_url:http://localhost:9000
📁 API Gateway - Ecosistema Completo (35 endpoints)
├── 🔒 1. Autenticación (4 endpoints)
│ ├── Login Usuario
│ ├── Registro Usuario │ ├── Perfil Usuario (requiere token)
│ └── URL Login Google
├── 🎓 2. SIA Colegios - Cursos (7 endpoints)
│ ├── Listar Cursos (con filtros)
│ ├── Obtener Curso por ID
│ ├── Estudiantes de Curso
│ ├── Crear Curso
│ ├── Actualizar Curso Completo
│ ├── Actualizar Curso Parcial
│ └── Eliminar Curso
├── 👨🎓 3. SIA Colegios - Estudiantes (8 endpoints)
│ ├── Listar Estudiantes (con filtros)
│ ├── Obtener Estudiante por ID
│ ├── Estudiantes por Código de Curso
│ ├── Crear Estudiante
│ ├── Actualizar Estudiante Completo
│ ├── Actualizar Estudiante Parcial
│ ├── Transferir Estudiante de Curso
│ └── Eliminar Estudiante
├── 👨🏫 4. Profesores & Asignaturas (9 endpoints)
│ ├── Listar Profesores
│ ├── Crear Profesor
│ ├── Actualizar Profesor
│ ├── Eliminar Profesor
│ ├── Listar Asignaturas
│ ├── Crear Asignatura
│ ├── Actualizar Asignatura
│ ├── Asignar Profesor a Asignatura
│ └── Desasignar Profesor de Asignatura
├── 📊 5. Calificaciones (5 endpoints)
│ ├── Listar Calificaciones (con filtros)
│ ├── Registrar Calificación
│ ├── Actualizar Calificación
│ ├── Eliminar Calificación
│ └── Calificaciones por Periodo
└── 🛠️ 6. Utilidades (2 endpoints)
├── Health Check MS Profesores
└── Health Check MS Calificaciones
- 🔑 Ejecutar LOGIN para obtener token JWT
- 🎓 Crear curso y guardar ID
- 👨🎓 Crear estudiante asignado al curso
- 👨🏫 Crear profesor y guardar ID
- 📚 Crear asignatura y guardar ID
- 🔗 Asignar profesor a asignatura
- 📊 Registrar calificación usando los IDs anteriores
- ✏️ Probar actualizaciones (curso, estudiante, profesor, asignatura, calificación)
- 🔄 Probar transferencia de estudiante entre cursos
- 🗑️ Limpiar datos (eliminar calificación, estudiante, profesor, curso)
La colección maneja automáticamente:
jwt_token: Token de autenticacióncurso_id: ID del último curso creadoestudiante_id: ID del último estudiante creadoprofesor_id: ID del último profesor creadoasignatura_id: ID de la última asignatura creadacalificacion_id: ID de la última calificación registrada
// config.js
GX_SIA_URL=http://component-1:8000 // SIA ColegiosGX_MS1_URL=http://component-2-1:8080/graphql // ProfesoresGX_MS2_URL=http://component-2-2:8081/graphql // Calificaciones GX_AUTH_URL=http://component-4:8080 // Autenticación| Servicio | Base de Datos | Puerto | Uso | Datos Precargados |
|---|---|---|---|---|
| Component-1 | PostgreSQL | 5433 | Cursos y estudiantes | 18 cursos, 36 estudiantes |
| Component-4 | PostgreSQL | 5432 | Usuarios y autenticación | Usuario de prueba |
| Component-2-1 | MongoDB | 27018 | Profesores y asignaturas | - |
| Component-2-2 | MongoDB | 27019 | Calificaciones | - |
// Headers para endpoints protegidos
Authorization: Bearer[TOKEN_JWT]// El token se incluye automáticamente en el contexto GraphQL// y está disponible en todos los resolvers# Verificar todos los contenedores están ejecutándose
docker-compose ps
# Ver logs de un servicio específico
docker-compose logs api-gateway
docker-compose logs component-1
docker-compose logs component-4
docker-compose logs component-2-1
docker-compose logs component-2-2
# Reiniciar servicios si hay problemas
docker-compose restart# Verificar SIA Colegiosquery { cursos { count } }
# Verificar conectividad Component-2-1query { holaMundo1 }
# Verificar conectividad Component-2-2 query { holaMundo2 }
# Ver todas las queries disponiblesquery {
__schema {
queryType {
fields {
namedescription
}
}
}
}Error: "Cannot query field"
- ✅ Solución: Verificar que todos los contenedores estén ejecutándose
- ✅ Comando:
docker-compose restart
Error: "Authentication failed"
- ✅ Solución: Ejecutar login primero y verificar que el token se guardó
- ✅ Credenciales:
test@example.com/password123
Error: "Connection refused"
- ✅ Solución: Esperar 30-60 segundos después del
docker-compose up - ✅ Verificar: Los microservicios necesitan tiempo para inicializarse
Error: "Component-1 restarting"
- ✅ Solución: Problema resuelto con comando
["django"]en docker-compose - ✅ Verificar: Logs no deben mostrar errores de locale
🌐 API Gateway GraphQL Playground: http://localhost:9000/graphql
🎓 Component-1 SIA API: http://localhost:8083/api/
🔒 Component-4 Health: http://localhost:8082/health
👨🏫 Component-2-1 GraphQL: http://localhost:8080/graphql 📊 Component-2-2 GraphQL: http://localhost:8081/graphql
- ✅ API Gateway: Operativo en puerto 9000
- ✅ SIA Colegios: Django REST API funcionando en puerto 8083
- ✅ Autenticación: JWT + OAuth2 funcionando
- ✅ CRUD Profesores: Todas las operaciones disponibles
- ✅ CRUD Asignaturas: Incluyendo actualización y desasignación
- ✅ CRUD Calificaciones: Con actualización selectiva mejorada
- ✅ Bases de Datos: 2 PostgreSQL + 2 MongoDB conectadas
- 🆕 SIA Colegios Completo: 15 endpoints para gestión de cursos y estudiantes
- 🆕 Actualización Parcial: Todos los recursos soportan actualización parcial
- 🆕 Filtros Avanzados: Búsqueda, ordenamiento y paginación en SIA
- 🆕 Relaciones Inteligentes: Cursos-Estudiantes con resolvers automáticos
- 🆕 Datos Precargados: 18 cursos (1-A a 11-B) y 36 estudiantes listos
- 🆕 Validación de Datos: Documentos únicos, fechas válidas, referencias correctas
- JWT Authentication: Tokens seguros con Component-4
- Google OAuth2: Integración completa con Google
- Authorization Headers: Protección automática de endpoints
- Input Validation: Validación en todos los niveles
- GraphQL Caching: Optimización de consultas
- Connection Pooling: Gestión eficiente de conexiones DB
- Async/Await: Operaciones no bloqueantes
- Docker Networking: Comunicación optimizada entre servicios
- Paginación: Respuestas optimizadas para grandes datasets
- API Gateway: Node.js 18+ + Express + Apollo GraphQL
- SIA Colegios: Django 4.2.9 + Django REST Framework + PostgreSQL
- Authentication: Go + Gin + JWT + OAuth2 + PostgreSQL
- Microservices: Java Spring Boot + GraphQL + MongoDB
- Containerization: Docker + Docker Compose
- Testing: Postman + Jest
- ✅ Component-1 (SIA) Integrado con 15 endpoints funcionales
- ✅ Component-4 Integrado sin dañar funcionalidades existentes
- ✅ Todas las operaciones CRUD funcionando correctamente
- ✅ Testing exhaustivo completado exitosamente con 35 endpoints
- ✅ Documentación completa actualizada
- ✅ Ecosistema listo para producción
El ecosistema de microservicios está 100% operativo con las siguientes capacidades:
- 🎓 Sistema de Información Académica completo con cursos y estudiantes
- 🔒 Autenticación robusta con JWT y OAuth2
- 👨🏫 Gestión completa de profesores y asignaturas
- 📊 Sistema de calificaciones con funcionalidades avanzadas
- 🧪 Suite de testing completa con Postman (35 endpoints)
- 📚 Documentación exhaustiva y actualizada
- 🚀 Deployment automatizado con Docker
Todos los objetivos cumplidos exitosamente con 4 microservicios integrados, 35 endpoints disponibles y funcionalidad completa preservada.