271 lines
5.8 KiB
Markdown
271 lines
5.8 KiB
Markdown
|
|
# 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 | ✅ |
|
||
|
|
|
||
|
|
### 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
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 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 |
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Testing
|
||
|
|
|
||
|
|
### Resumen de Tests
|
||
|
|
|
||
|
|
| Tipo | Cantidad | Cobertura |
|
||
|
|
|------|----------|-----------|
|
||
|
|
| Domain Tests | 30 | Entidades, Value Objects, Services |
|
||
|
|
| Application Tests | 66 | Commands, Queries, Validators |
|
||
|
|
| Integration Tests | 5 | GraphQL API completa |
|
||
|
|
| Angular Unit Tests | 24 | Services, Pipes |
|
||
|
|
| E2E Tests (Playwright) | 20 | Flujos de usuario |
|
||
|
|
| **Total** | **145** | |
|
||
|
|
|
||
|
|
### Ejecutar Tests
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Backend
|
||
|
|
dotnet test
|
||
|
|
|
||
|
|
# Frontend
|
||
|
|
cd src/frontend
|
||
|
|
ng test --watch=false
|
||
|
|
|
||
|
|
# E2E
|
||
|
|
npx playwright test
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 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/` |
|
||
|
|
| OWASP Checklist | `/docs/OWASP_CHECKLIST.md` |
|
||
|
|
| Manual Despliegue | `/docs/DEPLOYMENT.md` |
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 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*
|