# Entregables - Prueba Técnica Senior .NET/Angular **Proyecto:** Sistema de Registro de Estudiantes **Empresa:** Inter Rapidísimo **Cargo:** Desarrollador Master .NET/Angular --- ## Resumen Ejecutivo Sistema web completo para gestión de inscripciones de estudiantes con las siguientes características: - **Backend:** .NET 10, GraphQL (HotChocolate), Clean Architecture - **Frontend:** Angular 21, Standalone Components, Signals - **Base de Datos:** SQL Server con EF Core - **Seguridad:** OWASP compliant, rate limiting, query complexity - **Testing:** 145 tests automatizados - **Despliegue:** Docker + Kubernetes (k3s) --- ## Estructura del Proyecto ``` / ├── src/ │ ├── backend/ # .NET 10 API GraphQL │ │ ├── Domain/ # Entidades, Value Objects, Ports │ │ ├── Application/ # Commands, Queries, DTOs │ │ ├── Adapters/ # GraphQL API, Persistence │ │ └── Host/ # Entry point, DI │ └── frontend/ # Angular 21 SPA ├── tests/ # Tests automatizados ├── docs/ # Documentación └── deploy/ # Docker + k3s ``` --- ## Funcionalidades Implementadas ### Requisitos Funcionales | # | Requisito | Estado | |---|-----------|--------| | 1 | CRUD completo de estudiantes | ✅ | | 2 | Inscripción en materias (max 3) | ✅ | | 3 | Visualización de compañeros de clase | ✅ | | 4 | Restricción de profesor único | ✅ | | 5 | 10 materias, 5 profesores | ✅ | | 6 | 3 créditos por materia | ✅ | | 7 | Validación de inscripciones | ✅ | | 8 | UI responsiva | ✅ | | 9 | Manejo de errores | ✅ | | 10 | Autenticación JWT | ✅ | | 11 | Flujo de activación de estudiantes | ✅ | | 12 | Control de acceso por roles (Admin/Student) | ✅ | ### Reglas de Negocio - ✅ Máximo 3 materias por estudiante (9 créditos) - ✅ No repetir profesor en inscripciones - ✅ Validación en Domain Layer (pura, testeable) - ✅ Mensajes de error descriptivos ### Sistema de Autenticación - ✅ **JWT** con HMAC-SHA256 - ✅ **Flujo de Activación:** Admin crea estudiante → Código de activación → Estudiante activa cuenta - ✅ **Roles:** Admin (gestión completa) / Student (dashboard personal) - ✅ **Recuperación:** Código de recuperación generado en activación - ✅ **Seguridad:** PBKDF2-SHA256 para hashing de contraseñas --- ## Arquitectura ### Clean Architecture ``` Host → Adapters → Application → Domain ``` - **Domain:** Entidades puras, sin dependencias - **Application:** Casos de uso con CQRS - **Adapters:** GraphQL API + EF Core - **Host:** Composición y DI ### Patrones Implementados | Patrón | Uso | |--------|-----| | CQRS | Separación Commands/Queries | | Repository | Abstracción de persistencia | | Ports & Adapters | Inversión de dependencias | | DataLoader | Evitar N+1 en GraphQL | | Specification | Consultas reutilizables | ### Diagramas de Arquitectura Todos los diagramas están disponibles en `/docs/architecture/diagrams/` en formatos PNG y SVG. | # | Diagrama | Archivo | Descripción | |---|----------|---------|-------------| | 1 | **Casos de Uso** | `01-use-cases` | Actores (Estudiante, Admin), funcionalidades del sistema, reglas de negocio | | 2 | **Modelo de Dominio** | `02-domain-model` | Entidades (User, Student, Professor, Subject, Enrollment), Value Objects, Domain Services | | 3 | **Secuencia Inscripción** | `03-sequence-enrollment` | Flujo completo de inscripción con JWT, validaciones y persistencia | | 4 | **Componentes** | `04-components` | Arquitectura Clean Architecture: Frontend Angular 21, Backend .NET 10, GraphQL | | 5 | **Entidad-Relación** | `05-entity-relationship` | Modelo de base de datos: tablas, relaciones, restricciones | | 6 | **Estados** | `06-state-enrollment` | Estados de cuenta (activación) e inscripciones (0-9 créditos) | | 7 | **Despliegue** | `07-deployment` | Infraestructura K3s: Nginx, ASP.NET Core, SQL Server, Traefik Ingress | | 8 | **C4 Contexto** | `08-c4-context` | Vista de alto nivel: actores, sistema, sistemas externos | #### Requisitos de la Prueba Técnica Cubiertos | Requisito | Diagrama(s) | |-----------|-------------| | CRUD de estudiantes | 01, 04 | | Programa de créditos | 02, 06 | | 10 materias, 3 créditos c/u | 02, 05 | | Máximo 3 materias (9 créditos) | 01, 02, 03, 06 | | 5 profesores, 2 materias c/u | 02, 05 | | No repetir profesor | 01, 02, 03, 05 | | Ver compañeros de clase | 01, 04 | --- ## Testing ### Resumen de Tests | Tipo | Cantidad | Cobertura | |------|----------|-----------| | Domain Tests | 30 | Entidades, Value Objects, Services | | Application Tests | 98 | Commands, Queries, Validators, **Auth** | | Integration Tests | 5 | GraphQL API completa | | Angular Unit Tests | 24 | Services, Pipes | | E2E Tests (Playwright) | 97 | Flujos de usuario completos | | **Total** | **254** | | ### Tests E2E por Categoría | Categoría | Tests | Descripción | |-----------|-------|-------------| | Autenticación | 15 | Login, registro, reset password, logout | | Control de Acceso | 16 | Roles Admin/Student, guards, protección rutas | | Reglas de Negocio | 16 | Max 3 materias, mismo profesor, inscribir/cancelar | | Flujo Activación | 18 | Creación estudiante, código, activación cuenta | | CRUD Estudiantes | 6 | Crear, listar, validaciones | | Inscripciones | 7 | Navegar, inscribir, cancelar | | Compañeros | 7 | Listar, navegar | | Otros | 12 | Estados UI, edge cases | ### Tests Backend de Auth (Nuevos) | Handler | Tests | Casos Cubiertos | |---------|-------|-----------------| | LoginCommand | 6 | Credenciales válidas/inválidas, normalización, lastLogin | | RegisterCommand | 8 | Registro exitoso, usuario duplicado, validaciones, recovery code | | ResetPasswordCommand | 8 | Reset válido/inválido, validaciones, hashing | | ActivateAccountCommand | 10 | Activación, expiración, username duplicado, JWT | ### Ejecutar Tests ```bash # Backend - Todos dotnet test tests/Application.Tests dotnet test tests/Domain.Tests dotnet test tests/Integration.Tests # Backend - Solo Auth dotnet test tests/Application.Tests --filter "FullyQualifiedName~Auth" # Frontend Unit Tests cd src/frontend && ng test --watch=false # E2E - Todos cd src/frontend && npx playwright test # E2E - Por categoría npx playwright test auth.spec.ts npx playwright test role-access.spec.ts npx playwright test enrollment-restrictions.spec.ts npx playwright test activation.spec.ts ``` --- ## Seguridad (OWASP) | Control | Implementación | |---------|----------------| | Input Validation | FluentValidation + Regex | | SQL Injection | EF Core parametrizado | | XSS Prevention | Sanitización en validators | | Security Headers | CSP, HSTS, X-Frame-Options | | Rate Limiting | 100 req/min (fixed window) | | Query Complexity | Depth 5, Cost 100 | | Logging | Serilog (sin datos sensibles) | --- ## Documentación | Documento | Ubicación | |-----------|-----------| | README principal | `/README.md` | | Arquitectura Backend | `/docs/entregables/02-diseno/arquitectura/` | | Modelo de Dominio | `/docs/entregables/02-diseno/modelo-dominio/` | | Diseño BD | `/docs/entregables/02-diseno/base-datos/` | | Esquema GraphQL | `/docs/entregables/02-diseno/esquema-graphql/` | | ADRs | `/docs/architecture/decisions/` | | **Diagramas UML** | `/docs/architecture/diagrams/` | | OWASP Checklist | `/docs/OWASP_CHECKLIST.md` | | Manual Despliegue | `/docs/DEPLOYMENT.md` | ### Diagramas Incluidos ``` docs/architecture/diagrams/ ├── 01-use-cases.png # Casos de uso ├── 02-domain-model.png # Modelo de dominio ├── 03-sequence-enrollment.png # Secuencia inscripción ├── 04-components.png # Arquitectura componentes ├── 05-entity-relationship.png # Diagrama E-R ├── 06-state-enrollment.png # Estados inscripción ├── 07-deployment.png # Despliegue K3s └── 08-c4-context.png # Contexto C4 ``` --- ## Despliegue ### Docker ```bash cd deploy/docker docker-compose up -d --build ``` ### Kubernetes (k3s) ```bash cd deploy/k3s ./deploy.sh all ``` ### URLs | Servicio | URL | |----------|-----| | Frontend | http://localhost:80 | | API GraphQL | http://localhost:5000/graphql | | Playground | http://localhost:5000/graphql | --- ## Competencias Demostradas ### Arquitectura y Diseño - ✅ Clean Architecture con separación de capas - ✅ Principios SOLID aplicados - ✅ Domain-Driven Design (DDD lite) - ✅ CQRS para separación de concerns ### Backend (.NET) - ✅ .NET 10 con C# 13 - ✅ GraphQL con HotChocolate - ✅ EF Core con Fluent API - ✅ FluentValidation - ✅ DataLoaders para N+1 ### Frontend (Angular) - ✅ Angular 21 con Standalone Components - ✅ Signals para estado reactivo - ✅ Apollo Client para GraphQL - ✅ Angular Material UI - ✅ Lazy Loading ### DevOps - ✅ Docker multi-stage builds - ✅ Kubernetes manifests - ✅ Health checks - ✅ Horizontal Pod Autoscaler ### Testing - ✅ Unit tests con alta cobertura - ✅ Integration tests - ✅ E2E tests con Playwright - ✅ Mocking de dependencias ### Seguridad - ✅ OWASP Top 10 compliance - ✅ Input validation - ✅ Rate limiting - ✅ Security headers --- ## Cómo Ejecutar ### Desarrollo Local ```bash # Backend cd src/backend/Host dotnet run # Frontend cd src/frontend npm install ng serve ``` ### Con Docker ```bash cd deploy/docker docker-compose up -d ``` ### Tests ```bash # Todos los tests backend dotnet test # Tests frontend cd src/frontend && ng test # E2E cd src/frontend && npx playwright test ``` --- ## Decisiones Técnicas Ver ADRs completos en `/docs/architecture/decisions/`: 1. **ADR-001:** Clean Architecture - Testabilidad y mantenibilidad 2. **ADR-002:** GraphQL vs REST - Flexibilidad en queries 3. **ADR-003:** Signals vs RxJS - Simplicidad en estado local 4. **ADR-004:** Validación 3 capas - Defensa en profundidad --- *Desarrollado como prueba técnica para Inter Rapidísimo*