Este repositorio contiene la solución a la prueba técnica de Java...
solo contiene el back, el front por consola se encuentra en otro repositorio.
- Que sea Web API (Java)
- El Front sera por Consola
- Contenga sus respectivas pruebas unitarias
- Que se aplique POO
- Aplicar conocimientos de SOLID
- Arquitetura Hexagonal
.
└── src
├── main
│ ├── java
│ │ └── com
│ │ └── example
│ │ ├── SpringBootMain.java
│ │ ├── Domain
│ │ │ ├── Model
│ │ │ │ ├── UserModel.java
│ │ │ │ └── PostModel.java
│ │ │ ├── Exceptions
│ │ │ │ ├── AbstractDomainException.java
│ │ │ │ └── Impls
│ │ │ │ ├── UserModelException.java
│ │ │ │ └── PostModelException.java
│ │ │ └── Repositories
│ │ │ ├── PostDomainRepository.java
│ │ │ └── UserDomainRepository.java
│ │ ├── Application
│ │ │ ├── Commands
│ │ │ │ ├── CreatePostCommand.java
│ │ │ │ ├── FindByUsernameCommand.java
│ │ │ │ ├── FindByUsernameFollowingEagerCommand.java
│ │ │ │ └── FollowUserCommand.java
│ │ │ ├── DTOs
│ │ │ │ ├── CreatePostDTO.java
│ │ │ │ ├── PostDTO.java
│ │ │ │ └── UserDTO.java
│ │ │ ├── Exceptions
│ │ │ │ ├── AbstractApplicationException.java
│ │ │ │ └── Impls
│ │ │ │ ├── AlreadyFollowingException.java
│ │ │ │ ├── UsernameIsNullOrBlankException.java
│ │ │ │ └── UserNotFoundException.java
│ │ │ ├── Handlers
│ │ │ │ ├── CreatePostCommandHandler.java
│ │ │ │ ├── FindByUsernameCommandHandler.java
│ │ │ │ ├── FindByUsernameFollowingEagerCommandHandler.java
│ │ │ │ └── FollowUserCommandHandler.java
│ │ │ └── Services
│ │ │ ├── UserApplicationServiceImpl
│ │ │ ├── PostApplicationServiceImpl.java
│ │ │ └── Interfaces
│ │ │ ├── PostApplicationService.java
│ │ │ └── UserApplicationService.java
│ │ │
│ │ └── Infrastructure
│ │ ├── Adapter
│ │ │ ├── Input
│ │ │ | └── REST
│ │ │ | ├── PostController.java
│ │ │ | ├── UserController.java
│ │ │ | └── DTOs
│ │ │ | ├── CreatePostRequest.java
│ │ │ | └── FollowUserRequest.java
│ │ │ └── Output
│ │ │ ├── InMemoryPostRepository.java
│ │ │ └── InMemoryUserRepository.java
│ │ ├── Config
│ │ │ └── SpringBoot
│ │ │ ├── Beans.java
│ │ │ └── CustomExceptionHandler.java
│ │ └── Exceptions
│ │ ├── AbstractInfrastructureException.java
│ │ └── REST.java
│ │ └── MyResponseStatusException.java
│ └── resources
│ └── application.yml
└── test
└── java
└── com
└── example
├── Suites.java
├── Domain
│ └── Model
│ ├── PostModelTest.java
│ └── UserModelTest.java
├── Application
| ├── DTOs
| | ├── CreatePostDTOTest.java
| | ├── PostDTOTest.java
| | └── UserDTOTest.java
| ├── Handlers
| | ├── CreatePostCommandHandlerTest.java
| | ├── FindByUsernameCommandHandlerTest.java
| | ├── FindByUsernameFollowingEagerCommandHandlerTest.java
| | └── FollowUserCommandHandlerTest.java
| └── Services
| ├── PostApplicationServiceImplTest.java
| └── UserApplicationServiceImplTest.java
├── Domain
| └── Model
| ├── PostModelTest.java
| └── UserModelTest.java
└── Infrastructure
└── Adapter
├── Input
| └── REST
| ├── PostControllerTest.java
| └── UserControllerTest.java
├── Output
| ├── InMemoryPostRepositoryTest.java
| └── InMemoryUserRepositoryTest.java
└── Config
└── SpringBoot
├── BeansTest.java
└── CustomExceptionHandlerTest.java
Uno de los principales requerimientos era que sea Web API, esto lo hago con Spring Boot...
- Arquitectura Hexagonal
- SOLID
- Pruebas Unitarias con 100% de Cobertura ( +100 tests )
- Exception Handling (Excepciones limitadas son las que se exponen)
- Beans de Spring son declarados en
Infrastucture
- Etc
- un
Adapter.INPUT
recibe la petición del cliente - el
Adapter.INPUT
se crea unCommand
muy especifico dependiendo de la petición (dentro de los metodos) - el
Adapter.INPUT
le pasa elCommand
creado a su respectivoCommandHandler
- el
CommandHandler
se encarga de llamar alService
de/Application
correspondiente - el
Service
de/Application
se encarga de llamar a su respectivoRepository
de/Domain
(depemde de una abstracción (es una interfaz)) - el
Repository
llamado sera una implementación de un "puerto" o "interfaz de salida" que se encuentra en/Domain
, esta implementación se encuentra en/Infrastructure
PD:
CommandHandler
es un wrapper de un caso de uso, es decir este llama a un metodo especifico de unService
- un
Service
deApplication
es un caso de uso, este tiene interaccion con losAdapter.INPUT
atravez deCommandHandler
, no directamente.
TODO: Agregar diagrama de flujo
- Clone el repositorio
- Abrelo en un IDE
- Ejectua la clase
SpringBootMain.java
- Ya tienes el back ejecutandose!!
- Ahora continuar con el front (Consola)