# Kotlin - Rest Api completa com Spring Boot, Swagger, Mysql e docker #03

Agora chegou o momento de configurarmos o nosso  [Swagger](http://www.swagger.io) !

Primeiro, vamos configurar a dependência no gradle (build.gradle.kts):

```
implementation("io.springfox:springfox-swagger-ui:2.9.2")
implementation("io.springfox:springfox-swagger2:2.9.2")
``` 
 A versão que deu certo por aqui foi a 2.9.2.

Vamos criar o arquivo de configuração do Swagger. Eu criei uma pasta chamada config e o arquivo dentro dela.

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1632335828728/RdtXScfJA.png)

O arquivo de configuração deve ficar assim:

``` 
package com.kotlin.crudexample.config

import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import springfox.documentation.builders.PathSelectors
import springfox.documentation.builders.RequestHandlerSelectors
import springfox.documentation.spi.DocumentationType
import springfox.documentation.spring.web.plugins.Docket
import springfox.documentation.swagger2.annotations.EnableSwagger2

@Configuration
@EnableSwagger2
class SwaggerConfiguration {

    @Bean
    open fun api(): Docket = Docket(DocumentationType.SWAGGER_2)
        .select()
        .apis(RequestHandlerSelectors.basePackage("com.kotlin.crudexample.controller"))
        .paths(PathSelectors.any())
        .build()
}

``` 
Repare que indicamos um caminho para que ele mostre somente os nossos controllers. Você pode também incluir mais informações da Api, ficaria da seguinte maneira:
```
package com.kotlin.crudexample.config

import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import springfox.documentation.builders.ApiInfoBuilder
import springfox.documentation.builders.PathSelectors
import springfox.documentation.builders.RequestHandlerSelectors
import springfox.documentation.service.ApiInfo
import springfox.documentation.service.Contact
import springfox.documentation.spi.DocumentationType
import springfox.documentation.spring.web.plugins.Docket
import springfox.documentation.swagger2.annotations.EnableSwagger2

@Configuration
@EnableSwagger2
class SwaggerConfiguration {

    @Bean
    open fun api(): Docket = Docket(DocumentationType.SWAGGER_2)
        .apiInfo(getApiInfo())
        .select()
        .apis(RequestHandlerSelectors.basePackage("com.kotlin.crudexample.controller"))
        .paths(PathSelectors.any())
        .build()

    private fun getApiInfo(): ApiInfo {
        val contact = Contact("Rafael Moura", "rafaelmoura.dev", "teste@gmail.com")
        return ApiInfoBuilder()
            .title("Api Title")
            .description("Api Definition")
            .version("1.0.0")
            .license("Apache 2.0")
            .licenseUrl("http://www.apache.org/licenses/LICENSE-2.0")
            .contact(contact)
            .build()
    }
}
```

Rode a aplicação e ao acessar  [http://localhost:8081/swagger-ui.html](http://localhost:8081/swagger-ui.html) teremos a nossa documentação.

Ao expandir o product-controller, iremos reparar em todas operações que criamos dentro do controller. Para cada uma, teremos como testar passando um corpo ou parâmetro para filtrar se necessário. Podemos clicar em *try it out* em cada operação e testarmos se tudo está funcionando.

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1632336308874/dSIla5BVu.png)

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1632336536324/UfGwOM0Ew.png)

**É isso!**

Então criamos nossa Api Rest Springboot, utilizando o docker-compose para subirmos um Mysql e mostramos as rotas documentadas com o Swagger!

Agora podemos documentar as funções do Controller. Por exemplo, em getById:

```
@GetMapping("/product/{id}")
@ApiOperation(value = "Get Product by Id", response = Product::class)
fun getById(@PathVariable(value = "id") id: Long): Product = productService.getById(id)
``` 
Assim, no swagger irá exibir o valor para aquele operação:

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1632337043237/2nIpYwW9z.png)

Mão na massa e tente documentar tudo :) 

Nossa serie termina aqui mas irei utilizar esse código para outros posts, como o de *Testes Unitários*.
Fique de olho aqui no blog ;)

O código estará disponível [aqui](https://github.com/rafmoura25/rafaelmoura.dev) no meu github.

Dúvidas, críticas, comentários fiquem a vontade! Espero que tenham curtido e que o conteúdo possa ter contribuído de alguma forma em seus estudos.

Até mais!
