# Controller

Criaremos um pacote (controller). Dentro dele criaremos um [UserController](https://github.com/giuliana-bezerra/spring-boot-cleanarch/blob/8901e67d7c3e59dea21418e14f111034c3aba842/src/main/java/br/com/giulianabezerra/springbootcleanarch/infrastructure/controllers/UserController.java#L13) com sua anotação @RestController.

Fazer o import do CreateUserInteractor, juntamente com seu construtor e um método create.

No nosso @PostMapping, trabalharemos com padrão DTO, para que possamos mudar a regra de API, sem mudar a regra de negócio.

Isso é ótimo até mesmo para não fazer informação de negócio que não seja necessária para a API.

Usaremos, portanto, Request e Response.

Criaremos duas classes, onde ambas serão records.

* [CreateUserRequest](https://github.com/giuliana-bezerra/spring-boot-cleanarch/blob/8901e67d7c3e59dea21418e14f111034c3aba842/src/main/java/br/com/giulianabezerra/springbootcleanarch/infrastructure/controllers/CreateUserRequest.java#L3) - Terá username, password e email como parâmetro.
* [CreateUserResponse](https://github.com/giuliana-bezerra/spring-boot-cleanarch/blob/8901e67d7c3e59dea21418e14f111034c3aba842/src/main/java/br/com/giulianabezerra/springbootcleanarch/infrastructure/controllers/CreateUserResponse.java#L3). Terá username e email como parâmetro, (justamente para não retornamos a senha).

E na classe UserController, nosso [endpoint](https://github.com/giuliana-bezerra/spring-boot-cleanarch/blob/8901e67d7c3e59dea21418e14f111034c3aba842/src/main/java/br/com/giulianabezerra/springbootcleanarch/infrastructure/controllers/UserController.java#L24) retornará um CreateUserResponse e vai receber um CreateUserRequest chamada request.

Chamaremos o iteractor para fazermos a operação que a gente precisa. O problema é: o createUserIteractor recebe um User. **Como criar uma forma de converter essa request em um user?**

Dentro do pacote Controller, criaremos um [UserDTOMapper](https://github.com/giuliana-bezerra/spring-boot-cleanarch/blob/8901e67d7c3e59dea21418e14f111034c3aba842/src/main/java/br/com/giulianabezerra/springbootcleanarch/infrastructure/controllers/UserDTOMapper.java#L5), onde terá a mesma lógica do EntityMapper. Terá dois métodos:

1. Recebendo um CreateUserResponse(User user) e retornando esse **new CreateUserResponse** com username e email.
2. Uma função final que retonará um User. Nela receberemos um CreateUserRequest request que será transformada em um **new User**.

Voltando a classe Controller, injetaremos o DTO importando ele e passando dentro do construtor.

Já no endpoint, criaremos um User chamado userBusinessObj, passando o DTOMapper (importado acima) e converter o request para um User.

E a resposta (UserResponse), será um User cahamdo user, utilizando o método createUserInteractor.createUser (a função que está dentro dessa classe), passando o userBusinessObj criado acima.

O que retornaremos por fim, sera o userDtoMapper.toResponde(user).
