| Nombre | GitHub | |
|---|---|---|
| Esteban Peña | tatas323@gmail.com |
El proyecto sigue una arquitectura de Clean Architecture con separación clara de responsabilidades:
-
Entrypoint (Controllers): Maneja las solicitudes HTTP y respuestas.
- Ubicación:
src/main/java/twitter/challenge/espenia/entrypoint/ - Componentes:
UserController,TweetController
- Ubicación:
-
Core (Dominio): Contiene la lógica de negocio y modelos de dominio.
- Ubicación:
src/main/java/twitter/challenge/espenia/core/ - Subdirectorios principales:
domain: Entidades principales (User,Tweet)usecase: Servicios y lógica de negociogateway: Interfaces para acceso a datosexception: Excepciones de dominio
- Ubicación:
-
Infraestructura: Implementa mecanismos de persistencia y servicios externos.
- Ubicación:
src/main/java/twitter/challenge/espenia/infra/ - Componentes:
mongodb: Configuración y documentos de MongoDBgateway: Implementaciones de las interfaces del gateway
- Ubicación:
- Las peticiones HTTP llegan a los controladores en la capa Entrypoint
- Los controladores delegan en casos de uso (Core)
- Los casos de uso utilizan gateways para acceder a los datos
- La capa de infraestructura implementa estos gateways para interactuar con MongoDB
El proyecto incluye configuración para despliegue con Docker, facilitando su ejecución en cualquier entorno.
- Docker
- Docker Compose
El proyecto utiliza un enfoque de construcción multi-etapa:
- Etapa de construcción: Compila la aplicación usando JDK 17
- Etapa de ejecución: Ejecuta la aplicación con una imagen liviana
El archivo docker-compose.yml configura:
- Servicio principal: La aplicación Spring Boot
- MongoDB: Base de datos NoSQL para almacenamiento
- Servicio de inicialización: Configura usuarios y colecciones en MongoDB
Para iniciar la aplicación con Docker:
docker-compose up -dPara detener la aplicación:
docker-compose downPara ver los logs:
docker-compose logs -fEl servicio principal utiliza las siguientes variables de entorno que pueden ser modificadas según necesidad:
SCOPE_SUFFIX: Perfil activo (por defecto:prod)MONGODB_URI: URI de conexión a MongoDBMONGODB_DATABASE: Nombre de la base de datosSERVER_PORT: Puerto de la aplicación (por defecto: 8090)
| Dependencia | Versión | Descripción |
|---|---|---|
| Spring Boot | 3.3.5 | La librería base sobre la que se construyen interacciones con el server del BackEnd. |
| MongoDB | Latest | Base de datos NoSQL para almacenamiento de usuarios y tweets. |
| MapStruct | 1.6.3 | Framework para mapeo de objetos entre capas de dominio y persistencia. |
| Lombok | 1.18.30 | Reduce el código repetitivo mediante anotaciones. |
| Spring Validation | 3.3.5 | Validación de datos en los requests. |
- GET /api/users/{id}: Obtiene un usuario por ID
- GET /api/users/username/{username}: Obtiene un usuario por nombre de usuario
- POST /api/users: Crea un nuevo usuario
- PATCH /api/users/{id}: Actualiza un usuario existente
- DELETE /api/users/{id}: Elimina un usuario
- POST /api/tweets: Crea un nuevo tweet
- POST /api/follows/{followerId} : Usuario sigue a otro usaurio
- DELETE /api/follows/{followerId}/{followedId} : Usuario deja de seguir a otro usuario.
- GET /api/follows/following/{userId} : Get devuelve usuarios a los que sigue
- GET /api/follows/followers/{userId} : Get devuelve usuarios que los siguen
- GET /api/timeline/{userId} : trae los (actualmente harcoded 20 tweets PENDING DEV configurable) tweets del user y de los users que sigue. A su vez genera un cache de este timeline, para llamadas proximas (TTL 5 minutos).
La documentación completa de la API está disponible en formato Swagger en docs/specs/swagger.yaml.
Las convenciones utilizadas en el proyecto, como las utilizadas para el código fuente, pull requests o la formación de issues se encuentran en el archivo correspondiente.
El proyecto utiliza GitHub Actions para integración continua. (Actualmente hay issues con CI para test integración ya que usa una base de mongo local y esta dando timeouts, esto se soluciona usando una base embedida en memoria. PENDING DEV )
El flujo de trabajo de CI está definido en .github/workflows/gradle.yml y se ejecuta automáticamente en:
- Push a la rama
main - Pull Requests dirigidas a
main
- Checkout: Obtiene el código fuente
- Setup JDK: Configura Java 17
- Setup Gradle: Configura Gradle con caché para dependencias
- Build: Compila y ejecuta pruebas
Para ejecutar el build localmente antes de hacer push:
./gradlew build