# 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*
