# Infrastructure

Criaremos um pacote (infraestructure). Dentro dele teremos dois pacotes: **gateways** e **persistence**.

* Gateway: Criaremos uma classe chamada [UserRepositoryGateway](https://github.com/giuliana-bezerra/spring-boot-cleanarch/blob/8901e67d7c3e59dea21418e14f111034c3aba842/src/main/java/br/com/giulianabezerra/springbootcleanarch/infrastructure/gateways/UserRepositoryGateway.java#L8) e daremos implements com UserGateWay.

Essa classe irá interagir com o Repository do SpringData (aquele que a gente geralmente cria no pacote repositores que extends JpaRepository). Basicamente, daremos um CTRL C + CTRL V. Fazendo uma copia do UserRepository para dentro do pacote **persistence**.

Assim que colocaremos o Repository do SpringData dentro do pacote persistence, poderemos importar ele para dentro da classe UserRepositoryGateway e criaremos um construtor para injetá-lo.

Para que o repository do SpringData não dependa do **User inicial (entidade do banco)**, dentro do pacote Persistence criaremos um UserEntity contendo todas as características do User inicial, e assim poderemos usar anotações tanto do JPA quanto do SpringData.

Então o UserRepository de persistence, não apontará mais para `<User>`, e sim `<UserEntitity>`.

No gateway, precisaremos gerar essa UserEntity a partir de um Usuário de domínio (a classe User inicial).

Para fazermos isso e centralizar esse código, criaremos uma classe Mapper [Veja aqui](https://github.com/giuliana-bezerra/spring-boot-cleanarch/blob/8901e67d7c3e59dea21418e14f111034c3aba842/src/main/java/br/com/giulianabezerra/springbootcleanarch/infrastructure/gateways/UserEntityMapper.java#L6)

**Nele, teremos um método que retornará um UserEntity e um User.**

* [UserEntity](https://github.com/giuliana-bezerra/spring-boot-cleanarch/blob/8901e67d7c3e59dea21418e14f111034c3aba842/src/main/java/br/com/giulianabezerra/springbootcleanarch/infrastructure/gateways/UserEntityMapper.java#L7) - O parâmetro passado, é o User inicial (classe domain).

Como passaremos os atributos no retorno desse método, criaremos um construtor na classe UserEntity. Mas sem o Id, pois ele será gerado automaticamente pelo Banco.

* [User](https://github.com/giuliana-bezerra/spring-boot-cleanarch/blob/8901e67d7c3e59dea21418e14f111034c3aba842/src/main/java/br/com/giulianabezerra/springbootcleanarch/infrastructure/gateways/UserEntityMapper.java#L11) - O parâmetro passado é o UserEntity (do pacote persistence)

E retornaremos um novo User passando os atributos do UserEntity.

\\
