(\ (\
( • •)
━∪∪━━━━
ᵇʸ ᴬˡᵉᶠᵘᵉⁿᵗᵉˢ
Solución integral para la gestión de tareas desarrollada para el proceso técnico de Stefanini (Brasilia). Este proyecto demuestra la implementación de arquitecturas modernas, principios de Clean Code y una esteira de CI/CD automatizada.
Se ha implementado una Arquitectura Hexagonal (Ports & Adapters) combinada con DDD (Domain-Driven Design) para garantizar el desacoplamiento total de la lógica de negocio.
- Domain Layer: Entidades puras y contratos de interfaces (Ports).
- Application Layer: Servicios de orquestación y casos de uso.
- Infrastructure Layer: Adaptadores para SQL Server (JPA), Clientes API (WebClient) y Documentación (OpenAPI).
Interfaz vanguardista utilizando el motor Zoneless y Signals para una reactividad de alto rendimiento.
- Standalone Components: Eliminación de NgModules para un bundle más ligero.
- Tailwind CSS: Diseño responsivo con estética de producto comercial (SaaS).
- Vite Proxy: Configuración de comunicación transparente con el backend.
- Lenguajes: Java 21, TypeScript.
- Frameworks: Spring Boot 3.5, Angular 20.
- Persistencia: MS SQL Server 2022 + Flyway (Migrations).
- DevOps: GitHub Actions, Docker, Docker Compose.
- Calidad: JUnit 5, Mockito, MockMvc, AssertJ.
☕︎ ˖ Verifique que las dependencias están instaladas en su entorno de trabajo/teste.
-
Clone o repositório:
git clone https://github.com/ale-fuentes-ar/stefanini-task-manager.git
cd stefanini-task-manager -
Requisitos Previos
- Docker & Docker Desktop.
- JDK 21.
- Node.js 20+.
-
Infraestructura (Docker) Levanta la base de datos SQL Server y servicios secundarios:
docker-compose up -d
-
Ejecución Backend
cd backend ./mvnw spring-boot:runAPI disponible en:
http://localhost:8081| Swagger:/swagger-ui/index.html -
Ejecución Frontend
cd frontend npm install npm startApp disponible en:
http://localhost:4200
En cumplimiento con los requisitos de Stefanini, se documenta el uso de IA durante el desarrollo:
- Herramienta: ChatGPT/Claude (Modelo GPT-4o).
- Uso: Asistencia en la definición de la estructura hexagonal, generación de boilerplate para migraciones SQL y configuración del pipeline de GitHub Actions para SQL Server.
- Validación: Cada fragmento de código fue revisado, refactorizado para cumplir con SOLID y testeado manualmente para asegurar la integridad del sistema.
Se utilizó GitFlow estrictamente para la gestión de ramas:
main: Versión estable de producción.develop: Integración continua.feature/*: Desarrollo de funcionalidades aisladas (CRUD, UI, CI/CD).
- Arquitectura (Hexagonal / Ports & Adapters): Diagrama de alto nivel que muestra las capas y adaptadores principales del proyecto.
graph TD
subgraph Frontend
A[Angular Frontend]
end
subgraph Backend
direction TB
C[Controllers / REST API]
S["Application Services (Use Cases)"]
D["Domain (Entities & Ports)"]
I[Infrastructure Adapters]
R["Repositories (JPA / SQL)"]
end
subgraph External
DB[(SQL Server)]
F[Flyway Migrations]
SW["Swagger / OpenAPI"]
end
A -->|HTTP JSON| C
C --> S
S --> D
D --> I
I --> R
R --> DB
F --> R
C -->|Docs| SW
classDef infra fill:#f9f,stroke:#333,stroke-width:1px;
class I,R,DB,F infra;
- Flujo de datos (ej. crear una tarea): Secuencia desde la UI hasta la persistencia y respuesta.
sequenceDiagram
participant FE as Frontend (Angular)
participant API as REST Controller
participant APP as Application Service
participant DOM as Domain (Entity/Port)
participant REP as Repository (JPA)
participant DB as SQL Server
FE->>API: POST /tasks {taskDto}
API->>APP: mapToCommand(taskDto)
APP->>DOM: executeCreate(command)
DOM->>REP: save(entity)
REP->>DB: INSERT task
DB-->>REP: generated id
REP-->>DOM: entity with id
DOM-->>APP: domain event / dto
APP-->>API: response dto (201 Created)
API-->>FE: 201 Created (Location + body)
- CI github: Secuencia ao publicar codigo nas branch main e develop.
graph TD
%% Definición de Estilos (Clases)
classDef trigger fill:#1E293B,stroke:#0F172A,stroke-width:2px,color:#FFFFFF;
classDef runner fill:#F8FAFC,stroke:#CBD5E1,stroke-width:2px,color:#0F172A;
classDef infra fill:#C2410C,stroke:#9A3412,stroke-width:2px,color:#FFFFFF;
classDef maven fill:#1E40AF,stroke:#1E3A8A,stroke-width:2px,color:#FFFFFF;
classDef success fill:#15803D,stroke:#14532D,stroke-width:2px,color:#FFFFFF;
classDef failure fill:#B91C1C,stroke:#7F1D1D,stroke-width:2px,color:#FFFFFF;
classDef decision fill:#374151,stroke:#111827,stroke-width:2px,color:#FFFFFF;
%% Nodos y Flujo
Start([Push / Pull Request]):::trigger --> Trigger{Branch?}:::decision
Trigger -->|main / develop / feature/*| Runner[GitHub Hosted Runner: Ubuntu]:::runner
subgraph GitHubRunner[Entorno Virtual - GitHub Runner]
direction TB
SetupJDK[Set up JDK 21 Temurin]:::maven
Perms[Chmod +x mvnw]:::maven
subgraph DockerServices[Servicios de Infraestructura - Docker]
SQL[(MS SQL Server 2022)]:::infra
HealthCheck{Health Check: sqlcmd}:::decision
SQL --- HealthCheck
end
subgraph MavenCycle[Ciclo de Maven]
CreateDB[docker exec: CREATE DATABASE stefaninidb]:::maven
Build[./mvnw package]:::maven
Tests[./mvnw test]:::maven
end
end
%% Conexiones
Runner --> SetupJDK
SetupJDK --> Perms
Perms --> HealthCheck
HealthCheck -->|Healthy| CreateDB
CreateDB --> Build
Build --> Tests
%% Resultado Final
Tests --> Result{Status?}:::decision
Result -->|Success| Green[Check Verde: Merge OK]:::success
Result -->|Failure| Red[Check Rojo: Notificar Error]:::failure