Student Enrollment System - .NET/Angular
Go to file
Andrés Eduardo García Márquez a7dde52e02 feat(adapters): add driven and driving adapters
Driven Adapters (Persistence):
- AppDbContext with EF Core configurations
- Repository implementations (Student, Subject, Professor, Enrollment)
- UnitOfWork pattern for transactions
- DataLoaders for GraphQL N+1 optimization
- Database seeding with 5 professors and 10 subjects
- EF Core migrations for SQL Server

Driving Adapters (API):
- GraphQL API with HotChocolate
- Query and Mutation types
- Type definitions for all entities
- GraphQLErrorFilter for domain exceptions

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-07 22:59:38 -05:00
src/backend feat(adapters): add driven and driving adapters 2026-01-07 22:59:38 -05:00
.gitignore chore: add initial project configuration 2026-01-07 22:58:56 -05:00
README.md chore: add initial project configuration 2026-01-07 22:58:56 -05:00

README.md

Sistema de Registro de Estudiantes

Sistema web para gestionar inscripciones de estudiantes en materias con restricciones de créditos y profesores.

Stack Tecnológico

Capa Tecnología
Backend .NET 10, C#
API GraphQL (HotChocolate)
Frontend Angular 21, TypeScript
Base de Datos SQL Server 2022
ORM Entity Framework Core
UI Angular Material

Reglas de Negocio

  • 10 materias, cada una vale 3 créditos
  • 5 profesores, cada uno imparte 2 materias
  • Estudiantes pueden inscribir máximo 3 materias (9 créditos)
  • Restricción: Un estudiante NO puede tener materias con el mismo profesor

Características del Sistema

Funcionalidades

  • CRUD completo de estudiantes
  • Inscripción/cancelación de materias con validación de reglas
  • Visualización de compañeros de clase por materia
  • Interfaz responsive con Angular Material

Calidad y Robustez

  • Manejo de errores: Mensajes amigables para usuarios + logging detallado para desarrolladores
  • Monitoreo de conectividad: Verificación cada 5 segundos con overlay bloqueante si se pierde conexión
  • Validación: FluentValidation en backend + validación reactiva en frontend
  • Arquitectura: Clean Architecture + CQRS + Ports & Adapters

DevOps

  • Docker Compose: Despliegue optimizado con un solo comando (./start.sh)
  • Health Check: Endpoint /health con verificación de base de datos
  • Diagramas UML: 8 diagramas PlantUML documentando la arquitectura

Requisitos Previos

Inicio Rápido

Paso 1: Clonar e ir al directorio

git clone <repo-url>
cd Interrapidisimo

Paso 2: Iniciar SQL Server con Docker

docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=Your_password123" \
  -p 1433:1433 --name sqlserver -d mcr.microsoft.com/mssql/server:2022-latest

Esperar ~10 segundos a que inicie completamente.

Paso 3: Configurar y ejecutar Backend

cd src/backend

# 1. Instalar herramienta EF Core (solo primera vez)
dotnet tool install --global dotnet-ef
# Si ya está instalada, ignorar el mensaje

# 2. Restaurar dependencias
dotnet restore

# 3. Crear base de datos y aplicar migraciones
dotnet ef database update -p Adapters/Driven/Persistence -s Host
# NOTA: El mensaje "HostAbortedException" es NORMAL - indica que las migraciones se completaron

# 4. Liberar puerto si está ocupado (opcional)
fuser -k 5000/tcp 2>/dev/null

# 5. Ejecutar API
dotnet run --project Host

API GraphQL: http://localhost:5000/graphql

Paso 4: Verificar que funciona

En otra terminal:

# Consultar materias (debe retornar 10)
curl -s http://localhost:5000/graphql -X POST \
  -H "Content-Type: application/json" \
  -d '{"query":"{ subjects { id name credits } }"}' | jq .

# Crear un estudiante
curl -s http://localhost:5000/graphql -X POST \
  -H "Content-Type: application/json" \
  -d '{"query":"mutation { createStudent(input: {name: \"Test User\", email: \"test@example.com\"}) { student { id name email } } }"}' | jq .

Paso 5: Frontend (opcional)

cd src/frontend

# Instalar dependencias (usar --legacy-peer-deps por compatibilidad)
npm install --legacy-peer-deps

# Iniciar servidor de desarrollo
npx ng serve

App Angular: http://localhost:4200

Nota: Si ng no está instalado globalmente, usar npx ng serve

Datos de Ejemplo

La migración incluye datos iniciales:

Profesor Materias
Dr. García Matemáticas I, Matemáticas II
Dra. López Física I, Física II
Ing. Martínez Programación I, Programación II
Ing. Rodríguez Base de Datos I, Base de Datos II
Ing. Sánchez Redes I, Redes II

Arquitectura

Clean Architecture + CQRS + Ports & Adapters

┌─────────────────────────────────────────┐
│              HOST                       │
│       (DI, Configuration)               │
└────────────────┬────────────────────────┘
                 │
┌────────────────▼────────────────────────┐
│            ADAPTERS                     │
│   Driving: GraphQL    Driven: EF Core   │
└────────────────┬────────────────────────┘
                 │
┌────────────────▼────────────────────────┐
│           APPLICATION                   │
│   Commands / Queries / Validators       │
└────────────────┬────────────────────────┘
                 │
┌────────────────▼────────────────────────┐
│             DOMAIN                      │
│   Entities / Value Objects / Ports      │
└─────────────────────────────────────────┘

Estructura del Proyecto

/
├── src/
│   ├── backend/
│   │   ├── Domain/                  # Entities, ValueObjects, Ports, Services
│   │   ├── Application/             # Commands, Queries, DTOs, Validators
│   │   ├── Adapters/
│   │   │   ├── Driving/Api/         # GraphQL (HotChocolate)
│   │   │   └── Driven/Persistence/  # EF Core, Repositories, DataLoaders
│   │   └── Host/                    # Entry point, DI, Configuration
│   └── frontend/
│       ├── src/app/                 # Core, Shared, Features
│       └── e2e/                     # Playwright E2E tests
├── tests/
│   ├── Domain.Tests/                # Entity, ValueObject, Service tests
│   ├── Application.Tests/           # Command, Query, Validator tests
│   └── Integration.Tests/           # End-to-end flow tests
├── docs/
│   ├── entregables/                 # 01-analisis, 02-diseno, 03-configuracion
│   └── architecture/decisions/      # ADRs
├── database/
│   ├── stored-procedures/
│   └── views/
└── deploy/
    ├── docker/
    ├── k3s/                         # Kubernetes manifests
    └── scripts/

Comandos Útiles

Backend

cd src/backend

# Build y ejecución
dotnet build
dotnet run --project Host
dotnet watch run --project Host    # Hot reload

# Tests
dotnet test

# Migraciones EF Core
dotnet ef migrations add <Nombre> -p Adapters/Driven/Persistence -s Host
dotnet ef database update -p Adapters/Driven/Persistence -s Host
dotnet ef migrations list -p Adapters/Driven/Persistence -s Host

Frontend

cd src/frontend

npx ng serve                          # Desarrollo
npx ng build --configuration prod     # Producción
npx ng test                           # Tests unitarios
npx ng lint                           # Linting

Docker

# Ver contenedor SQL Server
docker ps | grep sqlserver

# Logs
docker logs sqlserver

# Reiniciar
docker restart sqlserver

# Conectar con sqlcmd
docker exec -it sqlserver /opt/mssql-tools18/bin/sqlcmd \
  -S localhost -U sa -P "Your_password123" -C

API GraphQL

Queries

# Listar estudiantes
query {
  students {
    id
    name
    email
    totalCredits
    enrollments { subjectId }
  }
}

# Obtener estudiante por ID
query {
  student(id: 1) {
    id
    name
    email
    totalCredits
  }
}

# Listar materias
query {
  subjects {
    id
    name
    credits
    professorId
  }
}

Mutations

# Crear estudiante
mutation {
  createStudent(input: { name: "Juan Pérez", email: "juan@test.com" }) {
    student { id name email }
  }
}

# Inscribir en materia
mutation {
  enrollStudent(input: { studentId: 1, subjectId: 1 }) {
    enrollment { id }
  }
}

# Cancelar inscripción
mutation {
  unenrollStudent(enrollmentId: 1) {
    success
  }
}

Solución de Problemas

dotnet-ef no encontrado

# Instalar
dotnet tool install --global dotnet-ef

# Agregar al PATH (si es necesario)
export PATH="$PATH:$HOME/.dotnet/tools"

# Verificar instalación
dotnet ef --version

Error de conexión a SQL Server

# Verificar que el contenedor esté corriendo
docker ps | grep sqlserver

# Si no está, iniciarlo
docker start sqlserver

# Verificar conexión
docker exec -it sqlserver /opt/mssql-tools18/bin/sqlcmd \
  -S localhost -U sa -P "Your_password123" -C -Q "SELECT 1"

Puerto 5000 en uso

# Linux: encontrar y matar proceso
fuser -k 5000/tcp

# Alternativa: ver qué usa el puerto
lsof -i :5000
kill -9 <PID>

Error "Invalid object name 'Students'"

Las migraciones no se han aplicado:

cd src/backend
dotnet ef database update -p Adapters/Driven/Persistence -s Host

Error "No migrations were found"

Crear migración inicial:

cd src/backend
dotnet ef migrations add InitialCreate -p Adapters/Driven/Persistence -s Host
dotnet ef database update -p Adapters/Driven/Persistence -s Host

Password incorrecto de SQL Server

Verificar que el password en appsettings.json coincida con el del contenedor Docker:

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=localhost;Database=StudentEnrollment;User Id=sa;Password=Your_password123;TrustServerCertificate=True"
  }
}

Error npm ERESOLVE (conflicto de dependencias)

Si aparecen errores de peer dependencies al instalar el frontend:

cd src/frontend
rm -rf node_modules package-lock.json
npm install --legacy-peer-deps

Error "ng: command not found"

Usar npx en lugar del comando directo:

npx ng serve
npx ng build

Despliegue

Docker Compose (Recomendado)

Despliegue optimizado con un solo comando:

cd deploy/docker
./start.sh

El script:

  1. Limpia contenedores anteriores
  2. Construye imágenes optimizadas con cache
  3. Inicia todos los servicios
  4. Espera hasta que estén listos

URLs después del despliegue:

Comandos útiles:

# Ver logs en tiempo real
docker compose logs -f

# Solo API
docker compose logs -f api

# Reiniciar un servicio
docker compose restart api

# Detener todo
docker compose down

# Rebuild sin cache
docker compose build --no-cache && docker compose up -d

Recursos asignados (optimizado para 12 cores / 15GB RAM):

Servicio CPU RAM
SQL Server 2 cores 2.5 GB
API .NET 4 cores 1.5 GB
Frontend 2 cores 256 MB

Kubernetes (k3s)

cd deploy/k3s
./deploy.sh

Ver DEPLOYMENT.md para instrucciones detalladas.

Documentación

Análisis

Diseño

Configuración

Operaciones

Diagramas UML

Seguridad

  • Input validation con FluentValidation
  • Sanitización contra XSS
  • Security headers (CSP, HSTS, X-Frame-Options)
  • Rate limiting (100 req/min queries, 30 req/min mutations)
  • Query complexity limits (depth: 5, cost: 100)
  • Logging estructurado con Serilog (sin datos sensibles)

Licencia

Prueba técnica - Inter Rapidísimo