{"componentChunkName":"component---src-templates-blog-post-js","path":"/kotlin-javalin-exposed-fuel/","result":{"data":{"markdownRemark":{"html":"<h2 id=\"Introducao\" style=\"position:relative;\">Introdução<a href=\"#Introducao\" aria-label=\"Introducao permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>A linguagem <strong>Kotlin</strong> é um projeto criado em 2011 pela <strong>JetBrains</strong>, a criadora de IDEs como <strong>IntelliJ</strong>, <strong>Web Storm</strong> e etc., e ganhou fama após ter sido adotado como linguagem oficial para desenvolvimento <strong>Android</strong>. Misturando conceitos das linguagens <strong>Scala</strong> e <strong>Java</strong> o <strong>Kotlin</strong> se torna uma linguagem muito versátil e descomplicada, principalmente para o desenvolvimento mobile no <strong>Android</strong> onde antes era desenvolvido unicamente com <strong>Java</strong> e tinha algumas complicações que o desenvolvedor tinha que adaptar, como manipulação de Threads e implementação interfaces anônimas.</p>\n<p>Mas o <strong>Kotlin</strong> não se limita exclusivamente ao desenvolvimento mobile podendo também ser utilizado para desenvolvimento Web e nesse artigo iremos explorar como criar uma aplicação inteira do zero, desde a criação do projeto, modelagem de domínio, implementação de regras de negócio, persistência de dados, integração com outras aplicações, configuração de endpoints e rotas, testes unitários e start da aplicação.</p>\n<p>Junto com o <strong>Kotlin</strong> será usado o Framework <strong>Javalin</strong>, esse framework tem como característica ser muito leve e pode ser usado tanto com a linguagem <strong>Java</strong> quanto com <strong>Kotlin</strong>, fora o <strong>Javalin</strong> será usado o <strong>Exposed</strong> que é um Framework ORM (Object Relational Mapper) da JetBrains para a comunicação com o banco de dados e manipulação dos dados. Como esse projeto irá fazer integração com outra aplicação via protocolo HTTP será usada lib <strong>Fuel</strong> que é um projeto para fazer o client HTTP.</p>\n<p>Pra finalizar também será usado <strong>Swagger</strong> para documentação das APIs.</p>\n<h2 id=\"O-Projeto\" style=\"position:relative;\">O Projeto<a href=\"#O-Projeto\" aria-label=\"O Projeto permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>O projeto consiste em fazer buscas de <strong>Amiibo</strong> por nome. Pra quem não sabe <strong>Amiibos</strong> são estatuetas ou cartões que representam diversos personagens da <strong>Nintendo</strong>, como Mario, Link, Donkey Kong e etc. A aplicação irá fazer uma consulta no endpoint <a href=\"https://www.amiiboapi.com/api/amiibo\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">https://www.amiiboapi.com/api/amiibo</a> que é uma url para fazer as consultas dos <strong>Amiibos</strong>. A aplicação fará um <strong>GET</strong> e irá tratar a resposta e exibirá para o usuário, um problema que existe é que esse endpoint é um pouco lento e isso pode causar impactos para o usuário que irá fazer consulta na nossa API, para resolver isso iremos salvar os dados em um banco de dados da nossa aplicação, então quando uma pesquisa for feita primeiramente será consultado a base da aplicação e depois a consulta será feita no endpoint externo se não existir no banco de dados.</p>\n<h2 id=\"Criando-o-projeto-com-IntelliJ\" style=\"position:relative;\">Criando o projeto com IntelliJ<a href=\"#Criando-o-projeto-com-IntelliJ\" aria-label=\"Criando o projeto com IntelliJ permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Criar um projeto com <strong>Kotlin</strong> não e complicado bastando criar a estrutura de arquivos mas para facilitar é possível criar pelo <strong>IntelliJ</strong> ou pelo <strong>Eclipse</strong>, as duas formas estão listadas abaixo.</p>\n<p><a href=\"https://www.jetbrains.com/help/idea/create-your-first-kotlin-app.html#92ef4a93\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">IntelliJ</a></p>\n<p><a href=\"https://kotlinlang.org/docs/eclipse.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Eclipse</a></p>\n<p>E agora adicionando as dependências que serão usadas no projeto no arquivo <code class=\"language-text\">build.gradle.kts</code></p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token function\">import</span> org.jetbrains.kotlin.gradle.tasks.KotlinCompile\n\nval exposedVersion <span class=\"token operator\">=</span> <span class=\"token string\">\"0.31.1\"</span>\nval hikariCpVersion <span class=\"token operator\">=</span> <span class=\"token string\">\"4.0.3\"</span>\nval javalinVersion <span class=\"token operator\">=</span> <span class=\"token string\">\"3.8.0\"</span>\nval swagger <span class=\"token operator\">=</span> <span class=\"token string\">\"2.0.9\"</span>\nval swaggerUI <span class=\"token operator\">=</span> <span class=\"token string\">\"3.24.3\"</span>\nval classgraph <span class=\"token operator\">=</span> <span class=\"token string\">\"4.8.69\"</span>\nval jackson <span class=\"token operator\">=</span> <span class=\"token string\">\"2.12.3\"</span>\nval mysql <span class=\"token operator\">=</span> <span class=\"token string\">\"8.0.25\"</span>\nval slf4j <span class=\"token operator\">=</span> <span class=\"token string\">\"1.7.28\"</span>\nval fuel <span class=\"token operator\">=</span> <span class=\"token string\">\"2.3.1\"</span>\nval gson <span class=\"token operator\">=</span> <span class=\"token string\">\"2.8.5\"</span>\n\nplugins <span class=\"token punctuation\">{</span>\n    kotlin<span class=\"token punctuation\">(</span><span class=\"token string\">\"jvm\"</span><span class=\"token punctuation\">)</span> version <span class=\"token string\">\"1.5.10\"</span>\n    application\n<span class=\"token punctuation\">}</span>\n\ngroup <span class=\"token operator\">=</span> <span class=\"token string\">\"com.amiibo.search\"</span>\nversion <span class=\"token operator\">=</span> <span class=\"token string\">\"1.0-SNAPSHOT\"</span>\n\nrepositories <span class=\"token punctuation\">{</span>\n    mavenCentral<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\ndependencies <span class=\"token punctuation\">{</span>\n\n    //Javalin Server\n    implementation<span class=\"token punctuation\">(</span><span class=\"token string\">\"io.javalin:javalin:<span class=\"token variable\">$javalinVersion</span>\"</span><span class=\"token punctuation\">)</span>\n\n    //Swagger\n    implementation<span class=\"token punctuation\">(</span><span class=\"token string\">\"io.swagger.core.v3:swagger-core:<span class=\"token variable\">$swagger</span>\"</span><span class=\"token punctuation\">)</span>\n    implementation<span class=\"token punctuation\">(</span><span class=\"token string\">\"org.webjars:swagger-ui:<span class=\"token variable\">$swaggerUI</span>\"</span><span class=\"token punctuation\">)</span>\n    implementation<span class=\"token punctuation\">(</span><span class=\"token string\">\"io.github.classgraph:classgraph:<span class=\"token variable\">$classgraph</span>\"</span><span class=\"token punctuation\">)</span>\n\n    implementation<span class=\"token punctuation\">(</span><span class=\"token string\">\"com.fasterxml.jackson.module:jackson-module-kotlin:<span class=\"token variable\">$jackson</span>\"</span><span class=\"token punctuation\">)</span>\n\n    //Database\n    implementation<span class=\"token punctuation\">(</span><span class=\"token string\">\"org.jetbrains.exposed:exposed-core:<span class=\"token variable\">$exposedVersion</span>\"</span><span class=\"token punctuation\">)</span>\n    implementation<span class=\"token punctuation\">(</span><span class=\"token string\">\"org.jetbrains.exposed:exposed-jdbc:<span class=\"token variable\">$exposedVersion</span>\"</span><span class=\"token punctuation\">)</span>\n    implementation<span class=\"token punctuation\">(</span><span class=\"token string\">\"org.jetbrains.exposed:exposed-java-time:<span class=\"token variable\">$exposedVersion</span>\"</span><span class=\"token punctuation\">)</span>\n\n    implementation<span class=\"token punctuation\">(</span><span class=\"token string\">\"com.zaxxer:HikariCP:<span class=\"token variable\">$hikariCpVersion</span>\"</span><span class=\"token punctuation\">)</span>\n\n    implementation<span class=\"token punctuation\">(</span><span class=\"token string\">\"mysql:mysql-connector-java:<span class=\"token variable\">$mysql</span>\"</span><span class=\"token punctuation\">)</span>\n\n    //Logging\n    implementation<span class=\"token punctuation\">(</span> <span class=\"token string\">\"org.slf4j:slf4j-simple:<span class=\"token variable\">$slf4j</span>\"</span><span class=\"token punctuation\">)</span>\n\n    //HTTP Client Fuel\n    //core\n    implementation<span class=\"token punctuation\">(</span><span class=\"token string\">\"com.github.kittinunf.fuel:fuel:<span class=\"token variable\">$fuel</span>\"</span><span class=\"token punctuation\">)</span>\n    //packages\n    implementation<span class=\"token punctuation\">(</span><span class=\"token string\">\"com.github.kittinunf.fuel:fuel-gson:<span class=\"token variable\">$fuel</span>\"</span><span class=\"token punctuation\">)</span>\n    implementation<span class=\"token punctuation\">(</span><span class=\"token string\">\"com.google.code.gson:gson:<span class=\"token variable\">$gson</span>\"</span><span class=\"token punctuation\">)</span>\n\n    testImplementation<span class=\"token punctuation\">(</span>kotlin<span class=\"token punctuation\">(</span><span class=\"token string\">\"test\"</span><span class=\"token punctuation\">))</span>\n<span class=\"token punctuation\">}</span>\n\ntasks.test <span class=\"token punctuation\">{</span>\n    useJUnitPlatform<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\ntasks.withType<span class=\"token operator\">&lt;</span>KotlinCompile<span class=\"token operator\">></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    kotlinOptions.jvmTarget <span class=\"token operator\">=</span> <span class=\"token string\">\"1.8\"</span>\n<span class=\"token punctuation\">}</span>\n\ntasks.jar <span class=\"token punctuation\">{</span>\n    manifest <span class=\"token punctuation\">{</span>\n        attributes<span class=\"token punctuation\">[</span><span class=\"token string\">\"Main-Class\"</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token string\">\"MainKt\"</span>\n    <span class=\"token punctuation\">}</span>\n    configurations<span class=\"token punctuation\">[</span><span class=\"token string\">\"compileClasspath\"</span><span class=\"token punctuation\">]</span>.forEach <span class=\"token punctuation\">{</span> file: File -<span class=\"token operator\">></span>\n        from<span class=\"token punctuation\">(</span>zipTree<span class=\"token punctuation\">(</span>file.absoluteFile<span class=\"token punctuation\">))</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\napplication <span class=\"token punctuation\">{</span>\n    mainClass.set<span class=\"token punctuation\">(</span><span class=\"token string\">\"MainKt\"</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h2 id=\"Modelando-o-dominio\" style=\"position:relative;\">Modelando o domínio<a href=\"#Modelando-o-dominio\" aria-label=\"Modelando o dominio permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Com a estrutura do projeto pronta agora iremos fazer o <strong>core</strong> da aplicação, o objeto que deve ser transacionado pela aplicação. Lendo a API do <strong>AmiiboAPI</strong> temos o seguinte retorno para uma busca com sucesso:</p>\n<div class=\"gatsby-highlight\" data-language=\"json\"><pre class=\"language-json\"><code class=\"language-json\"><span class=\"token punctuation\">{</span>\n\t<span class=\"token property\">\"amiibo\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\n\t\t<span class=\"token punctuation\">{</span>\n\t\t\t<span class=\"token property\">\"amiiboSeries\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Super Smash Bros.\"</span><span class=\"token punctuation\">,</span>\n\t\t\t<span class=\"token property\">\"character\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Mario\"</span><span class=\"token punctuation\">,</span>\n\t\t\t<span class=\"token property\">\"gameSeries\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Super Mario\"</span><span class=\"token punctuation\">,</span>\n\t\t\t<span class=\"token property\">\"head\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"00000000\"</span><span class=\"token punctuation\">,</span>\n\t\t\t<span class=\"token property\">\"image\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"https://raw.githubusercontent.com/N3evin/AmiiboAPI/master/images/icon_00000000-00000002.png\"</span><span class=\"token punctuation\">,</span>\n\t\t\t<span class=\"token property\">\"name\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Mario\"</span><span class=\"token punctuation\">,</span>\n\t\t\t<span class=\"token property\">\"release\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n\t\t\t\t<span class=\"token property\">\"au\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"2014-11-29\"</span><span class=\"token punctuation\">,</span>\n\t\t\t\t<span class=\"token property\">\"eu\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"2014-11-28\"</span><span class=\"token punctuation\">,</span>\n\t\t\t\t<span class=\"token property\">\"jp\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"2014-12-06\"</span><span class=\"token punctuation\">,</span>\n\t\t\t\t<span class=\"token property\">\"na\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"2014-11-21\"</span>\n\t\t\t<span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n\t\t\t<span class=\"token property\">\"tail\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"00000002\"</span><span class=\"token punctuation\">,</span>\n\t\t\t<span class=\"token property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Figure\"</span>\n\t\t<span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n\t\t<span class=\"token punctuation\">{</span>\n\t\t\t<span class=\"token property\">\"amiiboSeries\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Super Mario Bros.\"</span><span class=\"token punctuation\">,</span>\n\t\t\t<span class=\"token property\">\"character\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Mario\"</span><span class=\"token punctuation\">,</span>\n\t\t\t<span class=\"token property\">\"gameSeries\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Super Mario\"</span><span class=\"token punctuation\">,</span>\n\t\t\t<span class=\"token property\">\"head\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"00000000\"</span><span class=\"token punctuation\">,</span>\n\t\t\t<span class=\"token property\">\"image\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"https://raw.githubusercontent.com/N3evin/AmiiboAPI/master/images/icon_00000000-00340102.png\"</span><span class=\"token punctuation\">,</span>\n\t\t\t<span class=\"token property\">\"name\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Mario\"</span><span class=\"token punctuation\">,</span>\n\t\t\t<span class=\"token property\">\"release\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n\t\t\t\t<span class=\"token property\">\"au\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"2015-03-21\"</span><span class=\"token punctuation\">,</span>\n\t\t\t\t<span class=\"token property\">\"eu\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"2015-03-20\"</span><span class=\"token punctuation\">,</span>\n\t\t\t\t<span class=\"token property\">\"jp\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"2015-03-12\"</span><span class=\"token punctuation\">,</span>\n\t\t\t\t<span class=\"token property\">\"na\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"2015-03-20\"</span>\n\t\t\t<span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n\t\t\t<span class=\"token property\">\"tail\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"00340102\"</span><span class=\"token punctuation\">,</span>\n\t\t\t<span class=\"token property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Figure\"</span>\n\t\t<span class=\"token punctuation\">}</span>\n\t<span class=\"token punctuation\">]</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Temos muitas informações mas nem todas queremos exibir pro usuário que chama a nossa API, então fazendo um resumo dos dados retornado pela <strong>AmiiboAPI</strong> é possível extrar esse domínio:</p>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre class=\"language-kotlin\"><code class=\"language-kotlin\"><span class=\"token keyword\">data</span> <span class=\"token keyword\">class</span> <span class=\"token function\">Amiibo</span><span class=\"token punctuation\">(</span>\n    <span class=\"token keyword\">val</span> amiiboSeries<span class=\"token operator\">:</span> String<span class=\"token punctuation\">,</span>\n    <span class=\"token keyword\">val</span> name<span class=\"token operator\">:</span> String<span class=\"token punctuation\">,</span>\n    <span class=\"token keyword\">val</span> gameSeries<span class=\"token operator\">:</span> String<span class=\"token punctuation\">,</span>\n    <span class=\"token keyword\">val</span> type<span class=\"token operator\">:</span> String<span class=\"token punctuation\">,</span>\n    <span class=\"token keyword\">val</span> imageUrl<span class=\"token operator\">:</span> String\n<span class=\"token punctuation\">)</span></code></pre></div>\n<p>Aqui usamos a estrutura <code class=\"language-text\">data class</code> que é uma estrutura existente no <strong>Kotlin</strong> para trafegar dados na aplicação e implementa alguns métodos que são úteis como <code class=\"language-text\">equals() toString() hashCode()</code> entre outros que auxiliam na manipulação desses objetos na aplicação, ele é relativo ao projeto Lombok que é muito usado em aplicações Java.</p>\n<h2 id=\"Criando-casos-de-uso\" style=\"position:relative;\">Criando casos de uso<a href=\"#Criando-casos-de-uso\" aria-label=\"Criando casos de uso permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Com o domínio modelado e disponível na aplicação é necessário aplicar a lógica de negócio que queremos que seja executada, é nessa parte do código que vive o coração da aplicação e é chamado de <strong>casos de uso</strong> de uma aplicação.</p>\n<p>Essa aplicação a primeiro momento irá somente executar buscas então iremos nomear a classe de serviço com o nome <strong>SearchAmiibo</strong> e faremos da seguinte forma:</p>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre class=\"language-kotlin\"><code class=\"language-kotlin\"><span class=\"token keyword\">class</span> <span class=\"token function\">SearchAmiibo</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">private</span> <span class=\"token keyword\">val</span> repository<span class=\"token operator\">:</span> Repository<span class=\"token punctuation\">,</span> <span class=\"token keyword\">private</span> <span class=\"token keyword\">val</span> api<span class=\"token operator\">:</span> Api<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\n\n    <span class=\"token keyword\">fun</span> <span class=\"token function\">searchAmiiboByName</span><span class=\"token punctuation\">(</span>amiiboName<span class=\"token operator\">:</span> String<span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> List<span class=\"token operator\">&lt;</span>Amiibo<span class=\"token operator\">></span><span class=\"token operator\">?</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token function\">TODO</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Not implemented yet\"</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Dois pontos importantes do código acima, primeiro é necessário criar esses elementos que estão sendo usados pela classe <strong>SearchAmiibo</strong>, o <strong>Repository</strong> e a <strong>Api</strong> e segundo que definimos um método chamado <em>searchAmiiboByName</em> que recebe o nome do <strong>Amiibo</strong> para fazer a busca e pode retornar um lista de <strong>Amiibos</strong>.</p>\n<p>Um detalhe pode ser visto pelo uso do operador <code class=\"language-text\">?</code> do <strong>Kotlin</strong> que é um operador <code class=\"language-text\">null-safe</code> para evitar erros do tipo NullPointerException.</p>\n<p>Antes de criar uma implementação de <strong>Repository</strong> e <strong>Api</strong> vamos criar as suas interfaces, os contratos que queremos que um <strong>Repository</strong> e uma <strong>Api</strong> façam na aplicação, a implementação delas virá depois.</p>\n<p>Começando pelo <strong>Repository</strong>:</p>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre class=\"language-kotlin\"><code class=\"language-kotlin\"><span class=\"token keyword\">interface</span> Repository <span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">fun</span> <span class=\"token function\">findByAmiiboName</span><span class=\"token punctuation\">(</span>amiiboName<span class=\"token operator\">:</span> String<span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> List<span class=\"token operator\">&lt;</span>Amiibo<span class=\"token operator\">></span><span class=\"token operator\">?</span>\n\n    <span class=\"token keyword\">fun</span> <span class=\"token function\">insertAmiibo</span><span class=\"token punctuation\">(</span>amiibo<span class=\"token operator\">:</span> Amiibo<span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> Amiibo<span class=\"token operator\">?</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Esse <strong>Repository</strong> expõe o contrato que será responsável por buscar um <strong>Amiibo</strong> pelo seu nome e inserir um.</p>\n<p>E agora pela <strong>Api</strong>:</p>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre class=\"language-kotlin\"><code class=\"language-kotlin\"><span class=\"token keyword\">interface</span> Api <span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">fun</span> <span class=\"token function\">searchAmiiboByName</span><span class=\"token punctuation\">(</span>amiiboName<span class=\"token operator\">:</span> String<span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> List<span class=\"token operator\">&lt;</span>Amiibo<span class=\"token operator\">></span><span class=\"token operator\">?</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>A <strong>Api</strong> por sua vez só tem uma responsabilidade que é buscar um <strong>Amiibo</strong> externamente.</p>\n<p>Com isso podemos nos concentrar na regra de negócio e conseguimos fazer a regra de negócio sem se preocupar com a implementação agora:</p>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre class=\"language-kotlin\"><code class=\"language-kotlin\"><span class=\"token keyword\">class</span> <span class=\"token function\">SearchAmiibo</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">private</span> <span class=\"token keyword\">val</span> repository<span class=\"token operator\">:</span> Repository<span class=\"token punctuation\">,</span> <span class=\"token keyword\">private</span> <span class=\"token keyword\">val</span> api<span class=\"token operator\">:</span> Api<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">private</span> <span class=\"token keyword\">val</span> logger<span class=\"token operator\">:</span> Logger <span class=\"token operator\">=</span> LoggerFactory<span class=\"token punctuation\">.</span><span class=\"token function\">getLogger</span><span class=\"token punctuation\">(</span>SearchAmiibo<span class=\"token operator\">::</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">.</span>java<span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">fun</span> <span class=\"token function\">searchAmiiboByName</span><span class=\"token punctuation\">(</span>amiiboName<span class=\"token operator\">:</span> String<span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> List<span class=\"token operator\">&lt;</span>Amiibo<span class=\"token operator\">></span><span class=\"token operator\">?</span> <span class=\"token punctuation\">{</span>\n\n        logger<span class=\"token punctuation\">.</span><span class=\"token function\">info</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"INIT SEARCH FOR AN AMIIBO OR IT WILL TRY FETCH ON EXTERNAL SERVICE\"</span><span class=\"token punctuation\">)</span>\n\n        repository<span class=\"token punctuation\">.</span><span class=\"token function\">findByAmiiboName</span><span class=\"token punctuation\">(</span>amiiboName<span class=\"token punctuation\">)</span><span class=\"token operator\">?</span><span class=\"token punctuation\">.</span><span class=\"token function\">takeIf</span> <span class=\"token punctuation\">{</span> amiiboList <span class=\"token operator\">-></span> <span class=\"token operator\">!</span>amiiboList<span class=\"token punctuation\">.</span><span class=\"token function\">isNullOrEmpty</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">}</span>\n            <span class=\"token operator\">?</span><span class=\"token punctuation\">.</span><span class=\"token function\">let</span> <span class=\"token punctuation\">{</span> amiiboList <span class=\"token operator\">-></span>\n                <span class=\"token keyword\">return</span> amiiboList\n            <span class=\"token punctuation\">}</span> <span class=\"token operator\">?:</span> api<span class=\"token punctuation\">.</span><span class=\"token function\">searchAmiiboByName</span><span class=\"token punctuation\">(</span>amiiboName<span class=\"token punctuation\">)</span><span class=\"token operator\">?</span><span class=\"token punctuation\">.</span><span class=\"token function\">let</span> <span class=\"token punctuation\">{</span> amiiboList<span class=\"token operator\">:</span> List<span class=\"token operator\">&lt;</span>Amiibo<span class=\"token operator\">></span> <span class=\"token operator\">-></span>\n\n            amiiboList<span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span> <span class=\"token punctuation\">{</span> amiibo<span class=\"token operator\">:</span> Amiibo <span class=\"token operator\">-></span>\n                repository<span class=\"token punctuation\">.</span><span class=\"token function\">insertAmiibo</span><span class=\"token punctuation\">(</span>amiibo<span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">}</span>\n\n            <span class=\"token keyword\">return</span> amiiboList\n\n        <span class=\"token punctuation\">}</span> <span class=\"token operator\">?:</span> <span class=\"token keyword\">throw</span> <span class=\"token function\">AmiiboNotFoundException</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Amiibo <span class=\"token interpolation variable\">$amiiboName</span> not found\"</span><span class=\"token punctuation\">)</span>\n\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>No código acima podemos ver alguns utilitários do <strong>Kotlin</strong> que nos ajudam a construir um código mais legível, fluente e declarativo como <code class=\"language-text\">takeIf</code>, <code class=\"language-text\">let</code> e o <code class=\"language-text\">?:</code> chamado de <em>Elvis operator</em>.</p>\n<p>O <code class=\"language-text\">takeIf</code> é uma forma idiomática que o <strong>Kotlin</strong> possui onde seria equivalente ao <em>if</em> de outras linguagens onde dada uma condição sendo verdadeira será repassada, o <code class=\"language-text\">let</code> está sendo usado após a chamada <em>repository.findByAmiiboName(amiiboName)?</em> que usa o <code class=\"language-text\">?</code> como tratativa <em>null-safe</em> para passar para o <code class=\"language-text\">let</code> o resultado somente se o resultado do método não for nulo, o <code class=\"language-text\">let</code> irá executar o bloco de código recebendo o valor passado e retornando o mesmo que nesse caso é a lista de <strong>Amiibo</strong> se existir no banco.</p>\n<p>Já o <em>Elvis operator</em> <code class=\"language-text\">?:</code> é um operador condicional que executará o código à direita se o código à esquerda for <code class=\"language-text\">null</code> então se a chamada no <strong>Repository</strong> não trouxer dados será executada a chamada para a <strong>Api</strong> que também pode falhar e devolver <code class=\"language-text\">null</code> e nesse caso o <em>Elvis operator</em> irá executar o último bloco que é o lançamento de uma <strong>Exception</strong> customizada. Por fim temos uma feature interessante do Kotlin que é a maneira mais simples como é possível interpolar <strong>Strings</strong> com uso do operador <code class=\"language-text\">$</code></p>\n<p>Para efeitos didáticos segue o código da <strong>Exception</strong> criada:</p>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre class=\"language-kotlin\"><code class=\"language-kotlin\"><span class=\"token keyword\">class</span> <span class=\"token function\">AmiiboNotFoundException</span><span class=\"token punctuation\">(</span>message<span class=\"token operator\">:</span> String<span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token function\">Exception</span><span class=\"token punctuation\">(</span>message<span class=\"token punctuation\">)</span></code></pre></div>\n<h2 id=\"Implementando-repositorio\" style=\"position:relative;\">Implementando repositório<a href=\"#Implementando-repositorio\" aria-label=\"Implementando repositorio permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Aqui veremos como implementar o <strong>Repository</strong>, até o momento no projeto existe a interface <strong>Repository</strong> que serve como uma porta e agora é necessário implementar um adaptador. Nesse exemplo será usado o <strong>Exposed</strong> que é um framework <strong>ORM</strong>, isso significa que é necessário mapear no projeto as classes que representam as tabelas no banco de dados. O <strong>Exposed</strong> é um projeto da <strong>JetBrains</strong> e nos ajuda a mapear o banco de dados do lado da aplicação, fora que frameworks <strong>ORM</strong> expõe APIs para melhor manipulação dos dados e segurança contra ataques do tipo SQLInjection entre outros.</p>\n<p>No projeto iremos criar a pasta <code class=\"language-text\">repository.exposed.entity</code> e iremos criar a <strong>AmiiboEntity</strong>:</p>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre class=\"language-kotlin\"><code class=\"language-kotlin\"><span class=\"token keyword\">object</span> AmiiboEntity <span class=\"token operator\">:</span> <span class=\"token function\">Table</span><span class=\"token punctuation\">(</span>name <span class=\"token operator\">=</span> <span class=\"token string\">\"Amiibo\"</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">val</span> id <span class=\"token operator\">=</span> <span class=\"token function\">integer</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"id\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">autoIncrement</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">val</span> amiiboSeries <span class=\"token operator\">=</span> <span class=\"token function\">varchar</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"amiiboSeries\"</span><span class=\"token punctuation\">,</span> <span class=\"token number\">60</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">val</span> name <span class=\"token operator\">=</span> <span class=\"token function\">varchar</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"name\"</span><span class=\"token punctuation\">,</span> <span class=\"token number\">60</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">val</span> gameSeries <span class=\"token operator\">=</span> <span class=\"token function\">varchar</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"gameSeries\"</span><span class=\"token punctuation\">,</span> <span class=\"token number\">60</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">val</span> imageUrl <span class=\"token operator\">=</span> <span class=\"token function\">varchar</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"imageUrl\"</span><span class=\"token punctuation\">,</span> <span class=\"token number\">255</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">val</span> type <span class=\"token operator\">=</span> <span class=\"token function\">varchar</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"type\"</span><span class=\"token punctuation\">,</span> <span class=\"token number\">20</span><span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">override</span> <span class=\"token keyword\">val</span> primaryKey <span class=\"token operator\">=</span> <span class=\"token function\">PrimaryKey</span><span class=\"token punctuation\">(</span>id<span class=\"token punctuation\">,</span> name <span class=\"token operator\">=</span> <span class=\"token string\">\"ID_AMIIBO_KEY\"</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Para que esse classe possa ser usada em conjunto com o <strong>Exposed</strong> é necessário herdar a classe <strong>Table</strong>, onde informamos o nome da tabela no banco de dados. Em cada atributo que é equivalente a cada coluna no banco de dados é possível definir o tipo e o seu tamanho, o último ponto importante é que definimos o campo <code class=\"language-text\">id</code> como sendo <code class=\"language-text\">auto increment</code> e sobrescrevemos a classe <strong>PrimaryKey</strong> onde informado que o atributo <code class=\"language-text\">id</code> será a <strong>Primary Key</strong> e informamos o nome dela, se não for informado o <strong>Exposed</strong> se encarregará de criar um nome.</p>\n<p>Um ponto bom para explicar do <strong>Kotlin</strong> é a declaração <em>object</em> para a criação da classe <strong>AmiiboEntity</strong>, esse tipo de declaração auxilia o desenvolvedor quando for necessário criar classes apenas uma vez, <a href=\"https://kotlinlang.org/docs/object-declarations.html#object-declarations-overview\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Singletons</a>, e no <strong>Kotlin</strong> basta usar a declaração <em>object</em> para isso.</p>\n<p>Com a <strong>Entity</strong> definida será criada a classe que irá implementar a <em>interface</em> <strong>Repository</strong>:</p>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre class=\"language-kotlin\"><code class=\"language-kotlin\"><span class=\"token keyword\">object</span> ExposedAmiiboRepository <span class=\"token operator\">:</span> Repository <span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">private</span> <span class=\"token keyword\">val</span> logger<span class=\"token operator\">:</span> Logger <span class=\"token operator\">=</span> LoggerFactory<span class=\"token punctuation\">.</span><span class=\"token function\">getLogger</span><span class=\"token punctuation\">(</span>ExposedSuperheroRepository<span class=\"token operator\">::</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">.</span>java<span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">override</span> <span class=\"token keyword\">fun</span> <span class=\"token function\">findByAmiiboName</span><span class=\"token punctuation\">(</span>amiiboName<span class=\"token operator\">:</span> String<span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> List<span class=\"token operator\">&lt;</span>Amiibo<span class=\"token operator\">></span><span class=\"token operator\">?</span> <span class=\"token punctuation\">{</span>\n\n        logger<span class=\"token punctuation\">.</span><span class=\"token function\">info</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"[FIND AMIIBO BY NAME ON DATABASE]\"</span><span class=\"token punctuation\">)</span>\n\n        <span class=\"token keyword\">return</span> transaction <span class=\"token punctuation\">{</span>\n            <span class=\"token function\">addLogger</span><span class=\"token punctuation\">(</span>StdOutSqlLogger<span class=\"token punctuation\">)</span>\n\n            AmiiboEntity<span class=\"token punctuation\">.</span><span class=\"token function\">select</span> <span class=\"token punctuation\">{</span> AmiiboEntity<span class=\"token punctuation\">.</span>name eq amiiboName <span class=\"token punctuation\">}</span><span class=\"token operator\">?</span><span class=\"token punctuation\">.</span><span class=\"token function\">map</span> <span class=\"token punctuation\">{</span> row <span class=\"token operator\">-></span>\n                AmiiboEntity<span class=\"token punctuation\">.</span><span class=\"token function\">toAmiibo</span><span class=\"token punctuation\">(</span>row<span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">}</span><span class=\"token punctuation\">.</span><span class=\"token function\">toList</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">override</span> <span class=\"token keyword\">fun</span> <span class=\"token function\">insertAmiibo</span><span class=\"token punctuation\">(</span>amiibo<span class=\"token operator\">:</span> Amiibo<span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> Amiibo<span class=\"token operator\">?</span> <span class=\"token punctuation\">{</span>\n\n        logger<span class=\"token punctuation\">.</span><span class=\"token function\">info</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"[INSERT AMIIBO ON DATABASE]\"</span><span class=\"token punctuation\">)</span>\n\n        transaction <span class=\"token punctuation\">{</span>\n            <span class=\"token function\">addLogger</span><span class=\"token punctuation\">(</span>StdOutSqlLogger<span class=\"token punctuation\">)</span>\n\n            AmiiboEntity<span class=\"token punctuation\">.</span><span class=\"token function\">insert</span> <span class=\"token punctuation\">{</span> entity <span class=\"token operator\">-></span>\n                entity<span class=\"token punctuation\">[</span>name<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> amiibo<span class=\"token punctuation\">.</span>name\n                entity<span class=\"token punctuation\">[</span>amiiboSeries<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> amiibo<span class=\"token punctuation\">.</span>amiiboSeries\n                entity<span class=\"token punctuation\">[</span>type<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> amiibo<span class=\"token punctuation\">.</span>type\n                entity<span class=\"token punctuation\">[</span>gameSeries<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> amiibo<span class=\"token punctuation\">.</span>gameSeries\n                entity<span class=\"token punctuation\">[</span>imageUrl<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> amiibo<span class=\"token punctuation\">.</span>imageUrl\n            <span class=\"token punctuation\">}</span><span class=\"token punctuation\">.</span>resultedValues<span class=\"token operator\">?</span><span class=\"token punctuation\">.</span><span class=\"token function\">firstOrNull</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">?:</span> <span class=\"token function\">error</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"No key generated\"</span><span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">}</span>\n\n        <span class=\"token keyword\">return</span> amiibo\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>A classe <strong>ExposedAmiiboRepository</strong> além de implementar a interface <strong>Repository</strong> também é usado a declaração <em>object</em> para ela, nos métodos <em>findByAmiiboName</em> e <em>insertAmiibo</em> usamos o bloco <code class=\"language-text\">transaction</code> do <strong>Exposed</strong> onde como o nome diz é usado no contexto de transações no banco de dados, fora que é usado o método utilitário <em>addLogger</em> para ajudar na visualização de logs.</p>\n<p>Agora olhando um pouco mais detalhadamente para o método <em>findByAmiiboName</em>, dentro do bloco <code class=\"language-text\">transaction</code> é chamado a <strong>AmiiboEntity</strong> que por ser do tipo <strong>Table</strong> possui métodos para acesso ao banco de dados e aqui será usado o método <em>select</em> onde queremos passar um filtro de igualdade e que nesse método é usado para fazer um filtro de igualdade pelo nome do Amiibo no banco. O método <em>select</em> pode não trazer nenhum resultado pois pode não haver nenhum resultado para a pesquisa no banco de dados e por isso é usado o operador <code class=\"language-text\">?</code> para caso não encontre valores interrompe o processamento e não corremos o risco de erros do tipo <strong>NullPointerException</strong>. Mas caso exista o <em>select</em> retorna uma <strong>Query</strong> que conseguimos iterar os resultados com um <code class=\"language-text\">map</code> e para cada resultado criar um <strong>Amiibo</strong> e devolver uma lista de <strong>Amiibos</strong>.</p>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre class=\"language-kotlin\"><code class=\"language-kotlin\">AmiiboEntity<span class=\"token punctuation\">.</span><span class=\"token function\">select</span> <span class=\"token punctuation\">{</span> AmiiboEntity<span class=\"token punctuation\">.</span>name eq amiiboName <span class=\"token punctuation\">}</span><span class=\"token operator\">?</span><span class=\"token punctuation\">.</span><span class=\"token function\">map</span> <span class=\"token punctuation\">{</span> row <span class=\"token operator\">-></span>\n    <span class=\"token function\">Amiibo</span><span class=\"token punctuation\">(</span>\n        amiiboSeries <span class=\"token operator\">=</span> resultRow<span class=\"token punctuation\">[</span>amiiboSeries<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n        name <span class=\"token operator\">=</span> resultRow<span class=\"token punctuation\">[</span>name<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n        gameSeries <span class=\"token operator\">=</span> resultRow<span class=\"token punctuation\">[</span>gameSeries<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n        imageUrl <span class=\"token operator\">=</span> resultRow<span class=\"token punctuation\">[</span>imageUrl<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n        type <span class=\"token operator\">=</span> resultRow<span class=\"token punctuation\">[</span>type<span class=\"token punctuation\">]</span>\n    <span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">.</span><span class=\"token function\">toList</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>Com isso já temos o <strong>Exposed</strong> implementado porém é necessário criar a conexão com o banco de dados e para isso foi criado a pasta <code class=\"language-text\">adapter.repository.exposed.config</code> e a classe <strong>DatabaseFactory</strong> onde além de conectar no banco, que no projeto será o <strong>MySQL</strong>, também usará o <strong>Hikari</strong> para criar um pool de conexões:</p>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre class=\"language-kotlin\"><code class=\"language-kotlin\"><span class=\"token keyword\">class</span> DatabaseFactory <span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">companion</span> <span class=\"token keyword\">object</span> <span class=\"token punctuation\">{</span>\n\n        <span class=\"token keyword\">private</span> <span class=\"token keyword\">val</span> logger<span class=\"token operator\">:</span> Logger <span class=\"token operator\">=</span> LoggerFactory<span class=\"token punctuation\">.</span><span class=\"token function\">getLogger</span><span class=\"token punctuation\">(</span>DatabaseFactory<span class=\"token operator\">::</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">.</span>java<span class=\"token punctuation\">)</span>\n\n        <span class=\"token keyword\">tailrec</span> <span class=\"token keyword\">fun</span> <span class=\"token function\">createHikariDataSourceWithRetry</span><span class=\"token punctuation\">(</span>\n            jdbcUrl<span class=\"token operator\">:</span> String<span class=\"token punctuation\">,</span> username<span class=\"token operator\">:</span> String<span class=\"token punctuation\">,</span> password<span class=\"token operator\">:</span> String<span class=\"token punctuation\">,</span> driverClassName<span class=\"token operator\">:</span> String<span class=\"token punctuation\">,</span>\n            backoffSequenceMs<span class=\"token operator\">:</span> Iterator<span class=\"token operator\">&lt;</span>Long<span class=\"token operator\">></span> <span class=\"token operator\">=</span> defaultBackoffSequenceMs<span class=\"token punctuation\">.</span><span class=\"token function\">iterator</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> HikariDataSource <span class=\"token punctuation\">{</span>\n            <span class=\"token keyword\">try</span> <span class=\"token punctuation\">{</span>\n                <span class=\"token keyword\">val</span> config <span class=\"token operator\">=</span> <span class=\"token function\">HikariConfig</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n                config<span class=\"token punctuation\">.</span>jdbcUrl <span class=\"token operator\">=</span> jdbcUrl\n                config<span class=\"token punctuation\">.</span>username <span class=\"token operator\">=</span> username\n                config<span class=\"token punctuation\">.</span>password <span class=\"token operator\">=</span> password\n                config<span class=\"token punctuation\">.</span>driverClassName <span class=\"token operator\">=</span> driverClassName\n                <span class=\"token keyword\">return</span> <span class=\"token function\">HikariDataSource</span><span class=\"token punctuation\">(</span>config<span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">}</span> <span class=\"token keyword\">catch</span> <span class=\"token punctuation\">(</span>ex<span class=\"token operator\">:</span> Exception<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n                logger<span class=\"token punctuation\">.</span><span class=\"token function\">error</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Failed to create data source <span class=\"token interpolation\"><span class=\"token delimiter variable\">${</span>ex<span class=\"token punctuation\">.</span>message<span class=\"token delimiter variable\">}</span></span>\"</span><span class=\"token punctuation\">)</span>\n                <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>backoffSequenceMs<span class=\"token punctuation\">.</span><span class=\"token function\">hasNext</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">throw</span> ex\n            <span class=\"token punctuation\">}</span>\n            <span class=\"token keyword\">val</span> backoffMillis <span class=\"token operator\">=</span> backoffSequenceMs<span class=\"token punctuation\">.</span><span class=\"token function\">next</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n            logger<span class=\"token punctuation\">.</span><span class=\"token function\">info</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Trying again in <span class=\"token interpolation variable\">$backoffMillis</span> millis\"</span><span class=\"token punctuation\">)</span>\n            Thread<span class=\"token punctuation\">.</span><span class=\"token function\">sleep</span><span class=\"token punctuation\">(</span>backoffMillis<span class=\"token punctuation\">)</span>\n            <span class=\"token keyword\">return</span> <span class=\"token function\">createHikariDataSourceWithRetry</span><span class=\"token punctuation\">(</span>jdbcUrl<span class=\"token punctuation\">,</span> username<span class=\"token punctuation\">,</span> password<span class=\"token punctuation\">,</span> driverClassName<span class=\"token punctuation\">,</span> backoffSequenceMs<span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">}</span>\n\n        <span class=\"token keyword\">private</span> <span class=\"token keyword\">const</span> <span class=\"token keyword\">val</span> maxBackoffMs <span class=\"token operator\">=</span> <span class=\"token number\">16000L</span>\n        <span class=\"token keyword\">private</span> <span class=\"token keyword\">val</span> defaultBackoffSequenceMs <span class=\"token operator\">=</span> <span class=\"token function\">generateSequence</span><span class=\"token punctuation\">(</span><span class=\"token number\">1000L</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token function\">min</span><span class=\"token punctuation\">(</span>it <span class=\"token operator\">*</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> maxBackoffMs<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>A classe <strong>DatabaseFactory</strong> possui apenas uma responsabilidade que é se conectar ao banco de dados delegando ao <strong>Hikari</strong> a criação do <strong>DataSource</strong>, porém existem alguns elementos do <strong>Kotlin</strong> que vale a pena comentar para melhor entendimento de como isso é feito.</p>\n<p>O primeiro ponto é o uso do <code class=\"language-text\">tailrec</code> no método <em>createHikariDataSourceWithRetry</em> onde é uma forma elegante que o <strong>Kotlin</strong> possui para métodos ou funções recursivas, ao invés de ser usado um loop <em>for</em> ou <em>while</em> o <strong>Kolitn</strong> expõe essa palavra reservada <code class=\"language-text\">tailrec</code> onde o compilador é capaz de executar otimizações para recursividade.</p>\n<p>O segundo ponto é a declaração <code class=\"language-text\">companion object</code> que é outra forma de criar <strong>Singletons</strong> e é usado muito quando se quer usar métodos ou atributos que devem se comportar como atributos ou métodos da classe ao invés da instância, o que é equivalente ao modificador <code class=\"language-text\">static</code>do Java, inclusive se for usado a anotação <code class=\"language-text\">@JvmStatic</code> a <strong>JVM</strong> tentará gerar esses campos ou métodos como estáticos.</p>\n<p>Um utilitário muito interessante do <strong>Exposed</strong> é a capacidade dele de gerar as tabelas via código, essa prática não é recomendada em códigos de produção, bastando utilizar o <strong>SchemaUtils</strong> do <strong>Exposed</strong>:</p>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre class=\"language-kotlin\"><code class=\"language-kotlin\"><span class=\"token keyword\">fun</span> <span class=\"token function\">createDatabase</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\n    logger<span class=\"token punctuation\">.</span><span class=\"token function\">info</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"[INIT DATABASE CREATION]\"</span><span class=\"token punctuation\">)</span>\n\n    transaction <span class=\"token punctuation\">{</span>\n\n        <span class=\"token function\">addLogger</span><span class=\"token punctuation\">(</span>StdOutSqlLogger<span class=\"token punctuation\">)</span>\n\n        SchemaUtils<span class=\"token punctuation\">.</span><span class=\"token function\">createMissingTablesAndColumns</span><span class=\"token punctuation\">(</span>AmiiboEntity<span class=\"token punctuation\">)</span>\n\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Com isso pronto basta chamar o método de criação da conexão, nesse caso usaremos no start da aplicação:</p>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre class=\"language-kotlin\"><code class=\"language-kotlin\"><span class=\"token keyword\">fun</span> <span class=\"token function\">main</span><span class=\"token punctuation\">(</span>args<span class=\"token operator\">:</span> Array<span class=\"token operator\">&lt;</span>String<span class=\"token operator\">></span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">val</span> createHikariDataSourceWithRetry <span class=\"token operator\">=</span> DatabaseFactory<span class=\"token punctuation\">.</span><span class=\"token function\">createHikariDataSourceWithRetry</span><span class=\"token punctuation\">(</span>\n        System<span class=\"token punctuation\">.</span><span class=\"token function\">getenv</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"jdbcUrl\"</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">?:</span> <span class=\"token string\">\"jdbc:mysql://localhost:3306/amiibo?createDatabaseIfNotExist=true\"</span><span class=\"token punctuation\">,</span>\n        System<span class=\"token punctuation\">.</span><span class=\"token function\">getenv</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"username\"</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">?:</span> <span class=\"token string\">\"user\"</span><span class=\"token punctuation\">,</span>\n        System<span class=\"token punctuation\">.</span><span class=\"token function\">getenv</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"pass\"</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">?:</span> <span class=\"token string\">\"user\"</span><span class=\"token punctuation\">,</span>\n        System<span class=\"token punctuation\">.</span><span class=\"token function\">getenv</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"driverClassName\"</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">?:</span> <span class=\"token string\">\"com.mysql.cj.jdbc.Driver\"</span>\n    <span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">val</span> connect <span class=\"token operator\">=</span> Database<span class=\"token punctuation\">.</span><span class=\"token function\">connect</span><span class=\"token punctuation\">(</span>createHikariDataSourceWithRetry<span class=\"token punctuation\">)</span>\n    connect<span class=\"token punctuation\">.</span>useNestedTransactions <span class=\"token operator\">=</span> <span class=\"token boolean\">true</span>\n\n    ExposedAmiiboRepository<span class=\"token punctuation\">.</span><span class=\"token function\">createDatabase</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h2 id=\"Adicionando-o-client-HTTP\" style=\"position:relative;\">Adicionando o client HTTP<a href=\"#Adicionando-o-client-HTTP\" aria-label=\"Adicionando o client HTTP permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Aqui será mostrado como implementar a interface <strong>Api</strong> e ela será implementada com a lib <strong>Fuel</strong>, que é um projeto de um client HTTP para realizarmos chamadas HTTP para serviços externos, ele é bem simples e muito completo, permitindo usar várias libs para desserialização podendo o desenvolvedor utilizar a que estiver mais familiarizado, também possui um bom suporte para requests assíncronos.</p>\n<p>Para fazer a request para o serviço externo será executado um <strong>GET</strong> onde quando houver uma resposta positiva será retornado um objeto <em>json</em> com os dados e quando não encontrar dados irá retornar um <strong>erro 404</strong> e um <em>json</em> diferente com a mensagem de erro, iremos começar criando essas classes que só serão usadas para trafegar os dados da API para o domínio da aplicação então será criados objetos com o padrão <strong>DTO</strong>, <strong>Data Transfer Object</strong>, primeiramente o response no caso positivo:</p>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre class=\"language-kotlin\"><code class=\"language-kotlin\"><span class=\"token annotation builtin\">@JsonIgnoreProperties</span><span class=\"token punctuation\">(</span>ignoreUnknown <span class=\"token operator\">=</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">data</span> <span class=\"token keyword\">class</span> <span class=\"token function\">AmiiboWrapper</span><span class=\"token punctuation\">(</span>\n    <span class=\"token keyword\">val</span> amiibo<span class=\"token operator\">:</span> List<span class=\"token operator\">&lt;</span>AmiiboResponse<span class=\"token operator\">></span>\n<span class=\"token punctuation\">)</span>\n\n<span class=\"token annotation builtin\">@JsonIgnoreProperties</span><span class=\"token punctuation\">(</span>ignoreUnknown <span class=\"token operator\">=</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">data</span> <span class=\"token keyword\">class</span> <span class=\"token function\">AmiiboResponse</span><span class=\"token punctuation\">(</span>\n    <span class=\"token keyword\">val</span> amiiboSeries<span class=\"token operator\">:</span> String<span class=\"token punctuation\">,</span>\n    <span class=\"token keyword\">val</span> character<span class=\"token operator\">:</span> String<span class=\"token punctuation\">,</span>\n    <span class=\"token keyword\">val</span> gameSeries<span class=\"token operator\">:</span> String<span class=\"token punctuation\">,</span>\n    <span class=\"token keyword\">val</span> head<span class=\"token operator\">:</span> String<span class=\"token punctuation\">,</span>\n    <span class=\"token keyword\">val</span> image<span class=\"token operator\">:</span> String<span class=\"token punctuation\">,</span>\n    <span class=\"token keyword\">val</span> name<span class=\"token operator\">:</span> String<span class=\"token punctuation\">,</span>\n    <span class=\"token keyword\">val</span> type<span class=\"token operator\">:</span> String\n<span class=\"token punctuation\">)</span></code></pre></div>\n<p>E no caso de resposta de erro:</p>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre class=\"language-kotlin\"><code class=\"language-kotlin\"><span class=\"token annotation builtin\">@JsonIgnoreProperties</span><span class=\"token punctuation\">(</span>ignoreUnknown <span class=\"token operator\">=</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">data</span> <span class=\"token keyword\">class</span> <span class=\"token function\">ResponseError</span><span class=\"token punctuation\">(</span>\n    <span class=\"token keyword\">val</span> code<span class=\"token operator\">:</span> String<span class=\"token punctuation\">,</span>\n    <span class=\"token keyword\">val</span> error<span class=\"token operator\">:</span> String\n<span class=\"token punctuation\">)</span></code></pre></div>\n<p>E agora podemos criar a pasta <code class=\"language-text\">adapter.api.fuel</code> e a classe <strong>FuelClientApi</strong> que irá implementar a <strong>Api</strong>:</p>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre class=\"language-kotlin\"><code class=\"language-kotlin\"><span class=\"token keyword\">object</span> FuelClientApi <span class=\"token operator\">:</span> Api <span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">private</span> <span class=\"token keyword\">val</span> logger<span class=\"token operator\">:</span> Logger <span class=\"token operator\">=</span> LoggerFactory<span class=\"token punctuation\">.</span><span class=\"token function\">getLogger</span><span class=\"token punctuation\">(</span>FuelClientApi<span class=\"token operator\">::</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">.</span>java<span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">private</span> <span class=\"token keyword\">val</span> url<span class=\"token operator\">:</span> String <span class=\"token operator\">=</span> System<span class=\"token punctuation\">.</span><span class=\"token function\">getenv</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"URL_API\"</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">?:</span> <span class=\"token string\">\"https://www.amiiboapi.com/api/amiibo\"</span>\n\n    <span class=\"token keyword\">override</span> <span class=\"token keyword\">fun</span> <span class=\"token function\">searchAmiiboByName</span><span class=\"token punctuation\">(</span>amiiboName<span class=\"token operator\">:</span> String<span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> List<span class=\"token operator\">&lt;</span>Amiibo<span class=\"token operator\">></span><span class=\"token operator\">?</span> <span class=\"token punctuation\">{</span>\n\n        <span class=\"token keyword\">var</span> amiibo<span class=\"token operator\">:</span> List<span class=\"token operator\">&lt;</span>Amiibo<span class=\"token operator\">></span><span class=\"token operator\">?</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">;</span>\n\n        logger<span class=\"token punctuation\">.</span><span class=\"token function\">info</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"TRYING TO FETCH AMIIBO AT THE URL: [<span class=\"token interpolation variable\">$url</span>]\"</span><span class=\"token punctuation\">)</span>\n\n        Fuel<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span>url<span class=\"token punctuation\">,</span> <span class=\"token function\">listOf</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"name\"</span> <span class=\"token keyword\">to</span> amiiboName<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>responseObject<span class=\"token operator\">&lt;</span>AmiiboWrapper<span class=\"token operator\">></span> <span class=\"token punctuation\">{</span> _<span class=\"token punctuation\">,</span> _<span class=\"token punctuation\">,</span> result <span class=\"token operator\">-></span>\n\n            <span class=\"token keyword\">val</span> <span class=\"token punctuation\">(</span>apiResult<span class=\"token punctuation\">,</span> fuelError<span class=\"token punctuation\">)</span> <span class=\"token operator\">=</span> result\n\n            <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>fuelError <span class=\"token operator\">!=</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n                <span class=\"token keyword\">val</span> error<span class=\"token operator\">:</span> ResponseError <span class=\"token operator\">=</span>\n                    <span class=\"token function\">Gson</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>fromJson<span class=\"token operator\">&lt;</span>ResponseError<span class=\"token operator\">></span><span class=\"token punctuation\">(</span>\n                        fuelError<span class=\"token punctuation\">.</span>errorData<span class=\"token punctuation\">.</span><span class=\"token function\">toString</span><span class=\"token punctuation\">(</span>Charsets<span class=\"token punctuation\">.</span>UTF_8<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n                        ResponseError<span class=\"token operator\">::</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">.</span>java\n                    <span class=\"token punctuation\">)</span>\n\n                logger<span class=\"token punctuation\">.</span><span class=\"token function\">error</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Error to process: <span class=\"token interpolation\"><span class=\"token delimiter variable\">${</span>error<span class=\"token punctuation\">.</span>error<span class=\"token delimiter variable\">}</span></span>\"</span><span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">}</span>\n\n            amiibo <span class=\"token operator\">=</span> apiResult<span class=\"token operator\">?</span><span class=\"token punctuation\">.</span>amiibo<span class=\"token operator\">?</span><span class=\"token punctuation\">.</span><span class=\"token function\">map</span> <span class=\"token punctuation\">{</span> amiiboResponse<span class=\"token operator\">:</span> AmiiboResponse <span class=\"token operator\">-></span>\n                <span class=\"token function\">Amiibo</span><span class=\"token punctuation\">(</span>\n                    amiiboSeries <span class=\"token operator\">=</span> amiiboResponse<span class=\"token punctuation\">.</span>amiiboSeries<span class=\"token punctuation\">,</span> name <span class=\"token operator\">=</span> amiiboResponse<span class=\"token punctuation\">.</span>name<span class=\"token punctuation\">,</span>\n                    gameSeries <span class=\"token operator\">=</span> amiiboResponse<span class=\"token punctuation\">.</span>gameSeries<span class=\"token punctuation\">,</span> imageUrl <span class=\"token operator\">=</span> amiiboResponse<span class=\"token punctuation\">.</span>image<span class=\"token punctuation\">,</span> type <span class=\"token operator\">=</span> amiiboResponse<span class=\"token punctuation\">.</span>type\n                <span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">}</span>\n\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\n        <span class=\"token keyword\">return</span> amiibo\n\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Dentro do método <em>searchAmiiboByName</em> é utilizado o método <em>Fuel.get</em> e é passado no primeiro parâmetro a <em>url</em> e no segundo a lista de parâmetros que devem ser passados na <em>url</em>. Utilizamos o método <em>responseObject</em> onde é tipado o response para <strong>AmiiboWrapper</strong>, esse método tem como retorno a <strong>Request</strong>, o <strong>Response</strong> e o <strong>Result</strong>, como os dois primeiros não serão usados pode ser usado o <code class=\"language-text\">_</code> para indicar que esse valor não será usado, mas o <strong>Result</strong> será usado pois ele é um objeto que envelopa tanto o objeto de sucesso quanto o objeto de erro, sendo que um sempre será nulo quando o outro existir.</p>\n<p>Fazendo a desestruturação do retorno <code class=\"language-text\">val (apiResult, fuelError) = result</code> e é feita a checagem se o <code class=\"language-text\">fuelError</code> é nulo, caso não seja é feito a desserialização do <em>json</em> utilizando a <strong>Gson</strong> para o <strong>ResponseError</strong>. Caso o <code class=\"language-text\">fuelError</code> seja nulo será feita a desserialização para o <strong>AmiiboResponse</strong>.</p>\n<p>Vale ressaltar que quando é usado o método <em>responseObject</em> deve ser feita alguma tratativa para que seja esperado a execução do <strong>GET</strong> pois ele é assíncrono então no fim do método foi usado o método <code class=\"language-text\">get()</code> que é da API <strong>Future</strong> do <strong>Java</strong> e que faz com que o método aguarde a execução do código.</p>\n<h2 id=\"Configurando-o-Javalin-e-Swagger\" style=\"position:relative;\">Configurando o Javalin e Swagger<a href=\"#Configurando-o-Javalin-e-Swagger\" aria-label=\"Configurando o Javalin e Swagger permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Para criar o server <strong>HTTP</strong> e subir a aplicação será usado o <strong>Javalin</strong> que é um framework que pode ser usado tanto com <strong>Kotlin</strong> quanto com <strong>Java</strong>, é muito leve e de fácil utilização, junto a ele será usado o projeto <strong>Swagger</strong> para documentação das APIs.</p>\n<p>Para iniciar será feita configuração inicial do <strong>Javalin</strong> e após isso a configuração de rotas e handlers, primeiro será criado a pasta <code class=\"language-text\">application.http</code> e a função <em>startHttpServer</em>:</p>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre class=\"language-kotlin\"><code class=\"language-kotlin\"><span class=\"token keyword\">fun</span> <span class=\"token function\">startHttpServer</span><span class=\"token punctuation\">(</span>port<span class=\"token operator\">:</span> String <span class=\"token operator\">=</span> <span class=\"token string\">\"8080\"</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">val</span> httpPort <span class=\"token operator\">=</span> System<span class=\"token punctuation\">.</span><span class=\"token function\">getenv</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">getOrDefault</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"PORT\"</span><span class=\"token punctuation\">,</span> port<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toInt</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">val</span> apiVersion <span class=\"token operator\">=</span> <span class=\"token string\">\"v1\"</span>\n    <span class=\"token keyword\">val</span> appContext <span class=\"token operator\">=</span> <span class=\"token string\">\"amiibo\"</span>\n\n    Javalin<span class=\"token punctuation\">.</span><span class=\"token function\">create</span> <span class=\"token punctuation\">{</span> config <span class=\"token operator\">-></span>\n        config<span class=\"token punctuation\">.</span>contextPath <span class=\"token operator\">=</span> <span class=\"token string\">\"/<span class=\"token interpolation variable\">$appContext</span>/<span class=\"token interpolation variable\">$apiVersion</span>\"</span>\n        config<span class=\"token punctuation\">.</span>showJavalinBanner <span class=\"token operator\">=</span> <span class=\"token boolean\">false</span>\n        config<span class=\"token punctuation\">.</span><span class=\"token function\">registerPlugin</span><span class=\"token punctuation\">(</span><span class=\"token function\">getConfiguredOpenApiPlugin</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n        config<span class=\"token punctuation\">.</span><span class=\"token function\">enableCorsForAllOrigins</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n        config<span class=\"token punctuation\">.</span>defaultContentType <span class=\"token operator\">=</span> <span class=\"token string\">\"application/json\"</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">.</span><span class=\"token function\">also</span> <span class=\"token punctuation\">{</span> app <span class=\"token operator\">-></span>\n\n        <span class=\"token comment\">//TODO implementar rotas</span>\n\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">.</span><span class=\"token function\">start</span><span class=\"token punctuation\">(</span>httpPort<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">apply</span> <span class=\"token punctuation\">{</span>\n        Runtime<span class=\"token punctuation\">.</span><span class=\"token function\">getRuntime</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">addShutdownHook</span><span class=\"token punctuation\">(</span>Thread <span class=\"token punctuation\">{</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">stop</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>No código acima o primeiro bloco, <em>create</em>, serve para configurar o contexto do <strong>Javalin</strong>, o path, habilitar o <strong>Swagger</strong>, que será visto em seguida, desabilitar o <strong>CORS</strong> e configurar o <em>json</em> como padrão.</p>\n<p>Foi registrado um plugin onde é passado o método <em>getConfiguredOpenApiPlugin()</em>, na pasta <code class=\"language-text\">application.http.openapi</code> será mostrado o que esse método faz:</p>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre class=\"language-kotlin\"><code class=\"language-kotlin\"><span class=\"token keyword\">fun</span> <span class=\"token function\">getConfiguredOpenApiPlugin</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=</span> <span class=\"token function\">OpenApiPlugin</span><span class=\"token punctuation\">(</span>\n    <span class=\"token function\">OpenApiOptions</span><span class=\"token punctuation\">(</span>\n        <span class=\"token function\">Info</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">apply</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token function\">title</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Amiibo\"</span><span class=\"token punctuation\">)</span>\n            <span class=\"token function\">version</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"1.0.0\"</span><span class=\"token punctuation\">)</span>\n            <span class=\"token function\">description</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Amiibo Search API documentation\"</span><span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">apply</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token function\">path</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"/swagger-docs\"</span><span class=\"token punctuation\">)</span>\n        <span class=\"token function\">swagger</span><span class=\"token punctuation\">(</span><span class=\"token function\">SwaggerOptions</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"/swagger-ui\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">title</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Amiibo Search Documentation\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">)</span></code></pre></div>\n<p>No código acima foi utilizado a classe <strong>OpenApiPlugin</strong> do <strong>Javalin</strong> e passamos as informações que irão aparecer na tela do <strong>Swagger</strong> e por fim é configurado path para o json <code class=\"language-text\">/swagger-docs</code> e o path para o <em>ui</em> do <strong>Swagger</strong> <code class=\"language-text\">/swagger-ui</code>.</p>\n<p>Com isso temos o mínimo para iniciar a aplicação mas ainda é necessário adicionar rotas para a aplicação para que ela seja utilizável, mas antes de definir as rotas será definido as handlers que são as funções que serão chamadas pelas rotas e chamarão os casos de uso. Teremos três handlers ao todo, um para a busca de <strong>Amiibo</strong>, um para o <strong>HealthCheck</strong> e outro para manipular os possíveis erros que podem ocorrer e que queremos que seja tratado antes de ser enviado ao usuário que fez a solicitação na <strong>API</strong>.</p>\n<p>Começando pelo handler <strong>HealthCheck</strong> será criado a pasta <code class=\"language-text\">application.http.handler</code> e o arquivo <code class=\"language-text\">HealthCheck.kt</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre class=\"language-kotlin\"><code class=\"language-kotlin\"><span class=\"token keyword\">fun</span> <span class=\"token function\">liveness</span><span class=\"token punctuation\">(</span>ctx<span class=\"token operator\">:</span> Context<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    ctx<span class=\"token punctuation\">.</span><span class=\"token function\">status</span><span class=\"token punctuation\">(</span><span class=\"token number\">200</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">json</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">object</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">val</span> message <span class=\"token operator\">=</span> <span class=\"token string\">\"OK\"</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Que basicamente devolve um status 200 e a mensagem OK.</p>\n<p>O segundo handler é <code class=\"language-text\">AmiiboHandler.kt</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre class=\"language-kotlin\"><code class=\"language-kotlin\"><span class=\"token keyword\">fun</span> <span class=\"token function\">searchAmiibo</span><span class=\"token punctuation\">(</span>ctx<span class=\"token operator\">:</span> Context<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">val</span> amiiboName<span class=\"token operator\">:</span> String <span class=\"token operator\">=</span> ctx<span class=\"token punctuation\">.</span><span class=\"token function\">pathParam</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"amiiboName\"</span><span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">val</span> amiiboByName<span class=\"token operator\">:</span> List<span class=\"token operator\">&lt;</span>Amiibo<span class=\"token operator\">></span><span class=\"token operator\">?</span> <span class=\"token operator\">=</span>\n        <span class=\"token function\">SearchAmiibo</span><span class=\"token punctuation\">(</span>ExposedAmiiboRepository<span class=\"token punctuation\">,</span> FuelClientApi<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">searchAmiiboByName</span><span class=\"token punctuation\">(</span>amiiboName<span class=\"token punctuation\">)</span>\n\n    ctx<span class=\"token punctuation\">.</span><span class=\"token function\">status</span><span class=\"token punctuation\">(</span><span class=\"token number\">200</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">json</span><span class=\"token punctuation\">(</span>amiiboByName<span class=\"token operator\">!!</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Onde a função <em>searchAmiibo</em> recebe o <strong>Context</strong> e extrai do <em>pathParam</em> o nome do <strong>Amiibo</strong> para pesquisar e delega para a classe <strong>SearchAmiibo</strong> o método <em>searchAmiiboByName</em> com o nome do <strong>Amiibo</strong> que devolve uma lista de <strong>Amiibos</strong> que por sua vez devolve ao <strong>Context</strong> o <em>status 200</em> com o <em>json</em> a lista de <strong>Amiibos</strong>.</p>\n<p>Por fim o <code class=\"language-text\">ErrorHandler.kt</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre class=\"language-kotlin\"><code class=\"language-kotlin\"><span class=\"token keyword\">fun</span> <span class=\"token function\">errorHandler</span><span class=\"token punctuation\">(</span>app<span class=\"token operator\">:</span> Javalin<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n\n    app<span class=\"token punctuation\">.</span><span class=\"token function\">exception</span><span class=\"token punctuation\">(</span>AmiiboNotFoundException<span class=\"token operator\">::</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">.</span>java<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> _<span class=\"token punctuation\">,</span> ctx <span class=\"token operator\">-></span>\n        ctx<span class=\"token punctuation\">.</span><span class=\"token function\">json</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">object</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token keyword\">val</span> message <span class=\"token operator\">=</span> <span class=\"token string\">\"Superhero not found\"</span>\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">status</span><span class=\"token punctuation\">(</span><span class=\"token number\">404</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n\n    app<span class=\"token punctuation\">.</span><span class=\"token function\">exception</span><span class=\"token punctuation\">(</span>Exception<span class=\"token operator\">::</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">.</span>java<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> e<span class=\"token punctuation\">,</span> ctx <span class=\"token operator\">-></span>\n        ctx<span class=\"token punctuation\">.</span><span class=\"token function\">json</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">object</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token keyword\">val</span> message <span class=\"token operator\">=</span> e<span class=\"token punctuation\">.</span>message\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">status</span><span class=\"token punctuation\">(</span><span class=\"token number\">500</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Onde a função <em>errorHandler</em> diferentemente das duas anteriores não recebe o <strong>Context</strong> e sim a própria instância do <strong>Javalin</strong> e usa o método <em>exception</em> que registra o que deve ser feito quando uma <strong>Exception</strong> ocorrer na aplicação. Então quando a aplicação lançar uma <strong>AmiiboNotFoundException</strong> irá devolver um <em>status 404</em> e no <em>json</em> um objeto com a mensagem <em>Superhero not found</em> e se ocorrer qualquer outra <strong>Exception</strong> irá retornar o <em>status 500</em> e no <em>body</em> irá mostrar a mensagem de erro da <strong>Exception</strong>.</p>\n<p>Um ponto interessante aqui é que foi feito o uso de uma <strong>classe anônima</strong> através da sintaxe <code class=\"language-text\">object {}</code>.</p>\n<p>Com os handlers criados podemos criar as rotas na pasta <code class=\"language-text\">application.http.route</code> no arquivo <code class=\"language-text\">Routes.kt</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre class=\"language-kotlin\"><code class=\"language-kotlin\"><span class=\"token keyword\">fun</span> <span class=\"token function\">mountRoutes</span><span class=\"token punctuation\">(</span>app<span class=\"token operator\">:</span> Javalin<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n    app<span class=\"token punctuation\">.</span><span class=\"token function\">before</span> <span class=\"token punctuation\">{</span> ctx <span class=\"token operator\">-></span>\n        <span class=\"token keyword\">val</span> host <span class=\"token operator\">=</span> ctx<span class=\"token punctuation\">.</span><span class=\"token function\">header</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Origin\"</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">?:</span> <span class=\"token string\">\"*\"</span>\n        ctx<span class=\"token punctuation\">.</span><span class=\"token function\">header</span><span class=\"token punctuation\">(</span>Header<span class=\"token punctuation\">.</span>ACCESS_CONTROL_ALLOW_ORIGIN<span class=\"token punctuation\">,</span> host<span class=\"token punctuation\">)</span>\n        ctx<span class=\"token punctuation\">.</span><span class=\"token function\">header</span><span class=\"token punctuation\">(</span>Header<span class=\"token punctuation\">.</span>ACCESS_CONTROL_ALLOW_HEADERS<span class=\"token punctuation\">,</span> <span class=\"token string\">\"Authorization, Content-Type, Accept\"</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n\n    app<span class=\"token punctuation\">.</span><span class=\"token function\">routes</span> <span class=\"token punctuation\">{</span>\n        ApiBuilder<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"/health\"</span><span class=\"token punctuation\">,</span> <span class=\"token function\">documented</span><span class=\"token punctuation\">(</span><span class=\"token function\">healthDocumentation</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token operator\">::</span>liveness<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n        ApiBuilder<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token string\">\":amiiboName/search\"</span><span class=\"token punctuation\">,</span> <span class=\"token function\">documented</span><span class=\"token punctuation\">(</span><span class=\"token function\">searchAmiiboDocumentation</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token operator\">::</span>searchAmiibo<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Na função <em>mountRoutes</em> recebemos a instância do <strong>Javalin</strong> e é utilizado o função <em>before</em> para tratativas que ocorrem antes de qualquer <em>request</em> e na função <em>routes</em> é mapeado o verbo HTTP que será usado, nesse caso são dois <strong>GETs</strong>, o path e também foi passado o método <em>documented</em> onde é informado o método para montar esse request no <strong>Swagger</strong>, será visto logo a frente, e a função handler para aquela rota.</p>\n<p>Agora para mostrar as funções que serão usadas pelo <strong>Swagger</strong> será criada no mesmo arquivo que foi criado a função <em>getConfiguredOpenApiPlugin()</em> as funções <em>healthDocumentation</em> e <em>searchAmiiboDocumentation</em>:</p>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre class=\"language-kotlin\"><code class=\"language-kotlin\"><span class=\"token keyword\">const</span> <span class=\"token keyword\">val</span> TAG <span class=\"token operator\">=</span> <span class=\"token string\">\"Amiibo\"</span>\n\n<span class=\"token keyword\">fun</span> <span class=\"token function\">healthDocumentation</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=</span> <span class=\"token function\">document</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">operation</span> <span class=\"token punctuation\">{</span> operation <span class=\"token operator\">-></span>\n    operation<span class=\"token punctuation\">.</span>summary <span class=\"token operator\">=</span> <span class=\"token string\">\"Health Check\"</span>\n    operation<span class=\"token punctuation\">.</span>description <span class=\"token operator\">=</span> <span class=\"token string\">\"\"</span>\n    operation<span class=\"token punctuation\">.</span>operationId <span class=\"token operator\">=</span> <span class=\"token string\">\"health\"</span>\n    operation<span class=\"token punctuation\">.</span><span class=\"token function\">addTagsItem</span><span class=\"token punctuation\">(</span>TAG<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">.</span><span class=\"token function\">json</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"200\"</span><span class=\"token punctuation\">,</span> String<span class=\"token operator\">::</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">.</span>java<span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">fun</span> <span class=\"token function\">searchAmiiboDocumentation</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=</span> <span class=\"token function\">document</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">operation</span> <span class=\"token punctuation\">{</span> operation <span class=\"token operator\">-></span>\n    operation<span class=\"token punctuation\">.</span>summary <span class=\"token operator\">=</span> <span class=\"token string\">\"Search Amiibo\"</span>\n    operation<span class=\"token punctuation\">.</span>operationId <span class=\"token operator\">=</span> <span class=\"token string\">\"searchAmiibo\"</span>\n    operation<span class=\"token punctuation\">.</span>description <span class=\"token operator\">=</span> <span class=\"token string\">\"Search for an amiibo by name\"</span>\n    operation<span class=\"token punctuation\">.</span><span class=\"token function\">addTagsItem</span><span class=\"token punctuation\">(</span>TAG<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">.</span>body<span class=\"token operator\">&lt;</span>Amiibo<span class=\"token operator\">></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">json</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"200\"</span><span class=\"token punctuation\">,</span> Amiibo<span class=\"token operator\">::</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">.</span>java<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">json</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"404\"</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">object</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">val</span> message <span class=\"token operator\">=</span> <span class=\"token string\">\"Superhero not found\"</span>\n    <span class=\"token punctuation\">}</span><span class=\"token operator\">::</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">.</span>java<span class=\"token punctuation\">)</span></code></pre></div>\n<p>Nessas funções são passadas as informações relevantes para aquele request e o <em>body</em> em caso de sucesso e de erro.</p>\n<p>Pra isso tudo funcionar é necessário chamar essas funções lá na função <em>startHttpServer</em>:</p>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre class=\"language-kotlin\"><code class=\"language-kotlin\"><span class=\"token keyword\">fun</span> <span class=\"token function\">startHttpServer</span><span class=\"token punctuation\">(</span>port<span class=\"token operator\">:</span> String <span class=\"token operator\">=</span> <span class=\"token string\">\"8080\"</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">val</span> mustServeOpenAPIDocs<span class=\"token operator\">:</span> Boolean <span class=\"token operator\">=</span> System<span class=\"token punctuation\">.</span><span class=\"token function\">getenv</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">getOrDefault</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"ENABLE_OPEN_API_DOCS\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"true\"</span><span class=\"token punctuation\">)</span><span class=\"token operator\">!!</span>\n        <span class=\"token punctuation\">.</span><span class=\"token function\">toBoolean</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">val</span> httpPort <span class=\"token operator\">=</span> System<span class=\"token punctuation\">.</span><span class=\"token function\">getenv</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">getOrDefault</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"PORT\"</span><span class=\"token punctuation\">,</span> port<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toInt</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">val</span> apiVersion <span class=\"token operator\">=</span> <span class=\"token string\">\"v1\"</span>\n    <span class=\"token keyword\">val</span> appContext <span class=\"token operator\">=</span> <span class=\"token string\">\"amiibo\"</span>\n\n    Javalin<span class=\"token punctuation\">.</span><span class=\"token function\">create</span> <span class=\"token punctuation\">{</span> config <span class=\"token operator\">-></span>\n        config<span class=\"token punctuation\">.</span>contextPath <span class=\"token operator\">=</span> <span class=\"token string\">\"/<span class=\"token interpolation variable\">$appContext</span>/<span class=\"token interpolation variable\">$apiVersion</span>\"</span>\n        config<span class=\"token punctuation\">.</span>showJavalinBanner <span class=\"token operator\">=</span> <span class=\"token boolean\">false</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>mustServeOpenAPIDocs<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            config<span class=\"token punctuation\">.</span><span class=\"token function\">registerPlugin</span><span class=\"token punctuation\">(</span><span class=\"token function\">getConfiguredOpenApiPlugin</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">}</span>\n        config<span class=\"token punctuation\">.</span><span class=\"token function\">enableCorsForAllOrigins</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n        config<span class=\"token punctuation\">.</span>defaultContentType <span class=\"token operator\">=</span> <span class=\"token string\">\"application/json\"</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">.</span><span class=\"token function\">also</span> <span class=\"token punctuation\">{</span> app <span class=\"token operator\">-></span>\n\n        <span class=\"token comment\">//Implementação de rotas</span>\n        <span class=\"token function\">mountRoutes</span><span class=\"token punctuation\">(</span>app<span class=\"token punctuation\">)</span>\n        <span class=\"token comment\">//Implementação de erros</span>\n        <span class=\"token function\">errorHandler</span><span class=\"token punctuation\">(</span>app<span class=\"token punctuation\">)</span>\n\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">.</span><span class=\"token function\">start</span><span class=\"token punctuation\">(</span>httpPort<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">apply</span> <span class=\"token punctuation\">{</span>\n        Runtime<span class=\"token punctuation\">.</span><span class=\"token function\">getRuntime</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">addShutdownHook</span><span class=\"token punctuation\">(</span>Thread <span class=\"token punctuation\">{</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">stop</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Com isso pronto basta chamar a função <em>startHttpServer</em> no main da aplicação:</p>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre class=\"language-kotlin\"><code class=\"language-kotlin\"><span class=\"token keyword\">fun</span> <span class=\"token function\">main</span><span class=\"token punctuation\">(</span>args<span class=\"token operator\">:</span> Array<span class=\"token operator\">&lt;</span>String<span class=\"token operator\">></span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token function\">startHttpServer</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h2 id=\"Adicionando-testes\" style=\"position:relative;\">Adicionando testes<a href=\"#Adicionando-testes\" aria-label=\"Adicionando testes permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Uma das vantagens de uma arquitetura de portas e adaptadores é a facilidade de testar, para ser mais claro essa vantagem será implementado os testes dessa aplicação sem necessidade de usar outra lib de <em>mocks</em> pois basta criar um adaptador que faça esse trabalho.</p>\n<p>Vamos criar então o adaptador para a <strong>Repository</strong>:</p>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre class=\"language-kotlin\"><code class=\"language-kotlin\"><span class=\"token keyword\">object</span> InMemoryDatabase <span class=\"token operator\">:</span> Repository <span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">private</span> <span class=\"token keyword\">val</span> inMemoryDB <span class=\"token operator\">=</span> HashMap<span class=\"token operator\">&lt;</span>String<span class=\"token punctuation\">,</span> Amiibo<span class=\"token operator\">></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">override</span> <span class=\"token keyword\">fun</span> <span class=\"token function\">findAll</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> Set<span class=\"token operator\">&lt;</span>Amiibo<span class=\"token operator\">></span><span class=\"token operator\">?</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> inMemoryDB<span class=\"token punctuation\">.</span>values<span class=\"token punctuation\">.</span><span class=\"token function\">toSet</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">override</span> <span class=\"token keyword\">fun</span> <span class=\"token function\">findByAmiiboName</span><span class=\"token punctuation\">(</span>amiiboName<span class=\"token operator\">:</span> String<span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> List<span class=\"token operator\">&lt;</span>Amiibo<span class=\"token operator\">></span><span class=\"token operator\">?</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> inMemoryDB<span class=\"token punctuation\">.</span><span class=\"token function\">filterValues</span> <span class=\"token punctuation\">{</span> amiibo <span class=\"token operator\">-></span> amiibo<span class=\"token punctuation\">.</span>name <span class=\"token operator\">==</span> amiiboName <span class=\"token punctuation\">}</span><span class=\"token punctuation\">.</span>values<span class=\"token punctuation\">.</span><span class=\"token function\">toList</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">override</span> <span class=\"token keyword\">fun</span> <span class=\"token function\">insertAmiibo</span><span class=\"token punctuation\">(</span>amiibo<span class=\"token operator\">:</span> Amiibo<span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> Amiibo<span class=\"token operator\">?</span> <span class=\"token punctuation\">{</span>\n        inMemoryDB<span class=\"token punctuation\">[</span>amiibo<span class=\"token punctuation\">.</span>name<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> amiibo\n        <span class=\"token keyword\">return</span> amiibo\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Foi simulado o acesso ao banco de dados através de um <code class=\"language-text\">HashMap</code> e isso já basta para cumprir o contrato da <strong>Repository</strong>.</p>\n<p>Agora será criado o adaptador para a <strong>Api</strong>;</p>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre class=\"language-kotlin\"><code class=\"language-kotlin\"><span class=\"token keyword\">object</span> InMemoryApi <span class=\"token operator\">:</span> Api <span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">override</span> <span class=\"token keyword\">fun</span> <span class=\"token function\">searchAmiiboByName</span><span class=\"token punctuation\">(</span>amiiboName<span class=\"token operator\">:</span> String<span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> List<span class=\"token operator\">&lt;</span>Amiibo<span class=\"token operator\">></span><span class=\"token operator\">?</span> <span class=\"token punctuation\">{</span>\n\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>amiiboName <span class=\"token operator\">==</span> <span class=\"token string\">\"mario\"</span> <span class=\"token operator\">||</span> amiiboName <span class=\"token operator\">==</span> <span class=\"token string\">\"luigi\"</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token keyword\">return</span> <span class=\"token keyword\">null</span>\n        <span class=\"token punctuation\">}</span>\n\n        <span class=\"token keyword\">return</span> <span class=\"token function\">listOf</span><span class=\"token punctuation\">(</span>\n            <span class=\"token function\">Amiibo</span><span class=\"token punctuation\">(</span>\n                amiiboSeries <span class=\"token operator\">=</span> <span class=\"token string\">\"Series\"</span><span class=\"token punctuation\">,</span>\n                name <span class=\"token operator\">=</span> amiiboName<span class=\"token punctuation\">,</span>\n                gameSeries <span class=\"token operator\">=</span> <span class=\"token string\">\"Game\"</span><span class=\"token punctuation\">,</span>\n                type <span class=\"token operator\">=</span> <span class=\"token string\">\"Figure\"</span><span class=\"token punctuation\">,</span>\n                imageUrl <span class=\"token operator\">=</span> <span class=\"token string\">\"https://fakeurl.img\"</span>\n            <span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Aqui é feito uma checagem simples para emular que a chamada não funcionou e retornou erro.</p>\n<p>Agora para criar os testes foi criada a classe <strong>SearchAmiiboTest</strong> e implementado os métodos:</p>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre class=\"language-kotlin\"><code class=\"language-kotlin\"><span class=\"token keyword\">class</span> SearchAmiiboTest <span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">val</span> repository <span class=\"token operator\">=</span> InMemoryDatabase\n    <span class=\"token keyword\">private</span> <span class=\"token keyword\">val</span> searchAmiibo <span class=\"token operator\">=</span> <span class=\"token function\">SearchAmiibo</span><span class=\"token punctuation\">(</span>repository<span class=\"token punctuation\">,</span> InMemoryApi<span class=\"token punctuation\">)</span>\n\n    <span class=\"token annotation builtin\">@Test</span>\n    <span class=\"token keyword\">fun</span> `search amiibo <span class=\"token keyword\">by</span> api`<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">val</span> searchAmiiboByName <span class=\"token operator\">=</span> searchAmiibo<span class=\"token punctuation\">.</span><span class=\"token function\">searchAmiiboByName</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"ryu\"</span><span class=\"token punctuation\">)</span>\n\n        <span class=\"token function\">assertTrue</span><span class=\"token punctuation\">(</span>searchAmiiboByName<span class=\"token operator\">?</span><span class=\"token punctuation\">.</span><span class=\"token function\">any</span> <span class=\"token punctuation\">{</span> amiibo<span class=\"token operator\">:</span> Amiibo <span class=\"token operator\">-></span> amiibo<span class=\"token punctuation\">.</span>name <span class=\"token operator\">==</span> <span class=\"token string\">\"ryu\"</span> <span class=\"token punctuation\">}</span><span class=\"token operator\">!!</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"Ryu is found by API\"</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token annotation builtin\">@Test</span>\n    <span class=\"token keyword\">fun</span> `search amiibo <span class=\"token keyword\">by</span> databse`<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        repository<span class=\"token punctuation\">.</span><span class=\"token function\">insertAmiibo</span><span class=\"token punctuation\">(</span>\n            <span class=\"token function\">Amiibo</span><span class=\"token punctuation\">(</span>\n                amiiboSeries <span class=\"token operator\">=</span> <span class=\"token string\">\"Series\"</span><span class=\"token punctuation\">,</span>\n                name <span class=\"token operator\">=</span> <span class=\"token string\">\"mario\"</span><span class=\"token punctuation\">,</span>\n                gameSeries <span class=\"token operator\">=</span> <span class=\"token string\">\"Game\"</span><span class=\"token punctuation\">,</span>\n                type <span class=\"token operator\">=</span> <span class=\"token string\">\"Figure\"</span><span class=\"token punctuation\">,</span>\n                imageUrl <span class=\"token operator\">=</span> <span class=\"token string\">\"https://fakeurl.img\"</span>\n            <span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">)</span>\n\n        <span class=\"token keyword\">val</span> searchAmiiboByName <span class=\"token operator\">=</span> searchAmiibo<span class=\"token punctuation\">.</span><span class=\"token function\">searchAmiiboByName</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"mario\"</span><span class=\"token punctuation\">)</span>\n\n        <span class=\"token function\">assertTrue</span><span class=\"token punctuation\">(</span>searchAmiiboByName<span class=\"token operator\">?</span><span class=\"token punctuation\">.</span><span class=\"token function\">any</span> <span class=\"token punctuation\">{</span> amiibo<span class=\"token operator\">:</span> Amiibo <span class=\"token operator\">-></span> amiibo<span class=\"token punctuation\">.</span>name <span class=\"token operator\">==</span> <span class=\"token string\">\"mario\"</span> <span class=\"token punctuation\">}</span><span class=\"token operator\">!!</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"Mario is found by API\"</span><span class=\"token punctuation\">)</span>\n\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token annotation builtin\">@Test</span>\n    <span class=\"token keyword\">fun</span> `amiibo not found`<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">val</span> assertThrows <span class=\"token operator\">=</span> Assertions<span class=\"token punctuation\">.</span><span class=\"token function\">assertThrows</span><span class=\"token punctuation\">(</span>AmiiboNotFoundException<span class=\"token operator\">::</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">.</span>java<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            searchAmiibo<span class=\"token punctuation\">.</span><span class=\"token function\">searchAmiiboByName</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"luigi\"</span><span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">}</span>\n\n        <span class=\"token function\">assertEquals</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Amiibo luigi not found\"</span><span class=\"token punctuation\">,</span> assertThrows<span class=\"token punctuation\">.</span>message<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Rodando os testes todos passam.</p>\n<p>Um ponto importante e ser analisado é o seguinte, apesar de todos os testes passarem se rodarmos um coverage de código nem tudo estará coberto, para alguns isso pode ser um problema, porém quando é analisado com mais cuidado conseguimos ver que toda a regra de negócio e domínio da aplicação está com cobertura de 100%, o que faz muito sentido pois não queremos testar o <strong>Javalin</strong>, o <strong>Exposed</strong> ou o <strong>Fuel</strong>, eles já possuem testes nos seus próprios projetos, queremos testar a nossa implementação e se aplicação se comporta como definimos nos casos de uso.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 53.987730061349694%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAABYlAAAWJQFJUiTwAAAB2klEQVQoz3WSW5PSQBCF85ushQVyISGZXCYzSSYQEFy8oD5o7aO6pVir//zY3dxKq3w41YGe8+V0T7xi/xP5wxHl/oho8x1j94RR9w137de/xP+9aL4g3R1RvXlGMDzBHn4jpFq9/YV8/wP35Wt4Wf8RSXdA0h4wbw6ImvcYFw8YqR1G+aurxqS7bIvUfUC9fURk38HsHsWjt5+hX37COLHwjK2hCgWVK8SLGDN/iiAKEIrCm+YhgtBHqUu0rkWmMnRU2WesgTYa09kUXuOWaPsV3GqDhqqqDOZZjiBJ4c8X8OOTAtIsSlDUVs6lRUW+AVmpUbcOuukw8UMG9hDociVgflaVRpwpAiYISFIFGKMyDb18jYyAblhDEdASwxB04gfw3GoAqx820ggpGRsDgZxg/wOyh1/OIf4BrqXJMp1DaewNHF+AifwuCdj0SyxUIQkXeSmTVbbF/cyH1/aXHQ7olgNs1yPXRnYU0y4vY7MESDvkNNzj8wmB2V/U5gRkAIubvMcbtL4Bz5fiE5CNNV0A9zhpQpVXVegz8HIpvJu8qqUh6VIlY/OoVyDBOaFuWgExkM+xn32Ta0J3SsmjsIH3wksP5dNJrmPzyGysbCMJedRokQowPyf8A2cSmWMUA8PMAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image lazyload\"\n        alt=\"coverage\"\n        title=\"coverage\"\n        data-src=\"/static/d044efae74c8e38721df8174fb284954/a6d36/kotlin-coverage.png\"\n        data-srcset=\"/static/d044efae74c8e38721df8174fb284954/222b7/kotlin-coverage.png 163w,\n/static/d044efae74c8e38721df8174fb284954/ff46a/kotlin-coverage.png 325w,\n/static/d044efae74c8e38721df8174fb284954/a6d36/kotlin-coverage.png 650w,\n/static/d044efae74c8e38721df8174fb284954/e548f/kotlin-coverage.png 975w,\n/static/d044efae74c8e38721df8174fb284954/3c492/kotlin-coverage.png 1300w,\n/static/d044efae74c8e38721df8174fb284954/05244/kotlin-coverage.png 1752w\"\n        sizes=\"(max-width: 650px) 100vw, 650px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></p>\n<h2 id=\"Subindo-a-aplicacao-e-testando\" style=\"position:relative;\">Subindo a aplicação e testando<a href=\"#Subindo-a-aplicacao-e-testando\" aria-label=\"Subindo a aplicacao e testando permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Agora com tudo pronto podemos iniciar a aplicação e testar os endpoints.</p>\n<p>Se testarmos com um <strong>Amiibo</strong> que não existe teremos o seguinte resultado:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token function\">curl</span> --location --request GET <span class=\"token string\">'http://localhost:8080/amiibo/v1/muahaha/search'</span> <span class=\"token operator\">|</span> json_pp\n<span class=\"token punctuation\">{</span>\n    <span class=\"token string\">\"message\"</span><span class=\"token builtin class-name\">:</span> <span class=\"token string\">\"Amiibo not found\"</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>E se testarmos um válido:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token function\">curl</span> --location --request GET <span class=\"token string\">'http://localhost:8080/amiibo/v1/link/search'</span> <span class=\"token operator\">|</span> json_pp\n<span class=\"token punctuation\">[</span>\n    <span class=\"token punctuation\">{</span>\n        <span class=\"token string\">\"amiiboSeries\"</span><span class=\"token builtin class-name\">:</span> <span class=\"token string\">\"Super Smash Bros.\"</span>,\n        <span class=\"token string\">\"name\"</span><span class=\"token builtin class-name\">:</span> <span class=\"token string\">\"Link\"</span>,\n        <span class=\"token string\">\"gameSeries\"</span><span class=\"token builtin class-name\">:</span> <span class=\"token string\">\"The Legend of Zelda\"</span>,\n        <span class=\"token string\">\"type\"</span><span class=\"token builtin class-name\">:</span> <span class=\"token string\">\"Figure\"</span>,\n        <span class=\"token string\">\"imageUrl\"</span><span class=\"token builtin class-name\">:</span> <span class=\"token string\">\"https://raw.githubusercontent.com/N3evin/AmiiboAPI/master/images/icon_01000000-00040002.png\"</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">]</span></code></pre></div>\n<p>E se olharmos os logs veremos:</p>\n<div class=\"gatsby-highlight\" data-language=\"log\"><pre class=\"language-log\"><code class=\"language-log\">[qtp708613859-40] INFO com.amiibo.search.useCase.SearchAmiibo - INIT SEARCH FOR AN AMIIBO OR IT WILL TRY FETCH ON EXTERNAL SERVICE\n[qtp708613859-40] INFO com.amiibo.search.adapter.repository.exposed.ExposedAmiiboRepository - [FIND AMIIBO BY NAME ON DATABASE]\n[qtp708613859-40] INFO com.amiibo.search.adapter.api.fuel.FuelClientApi - TRYING TO FETCH AMIIBO AT THE URL: [https://www.amiiboapi.com/api/amiibo]\nSQL: SELECT Amiibo.id, Amiibo.amiiboSeries, Amiibo.`name`, Amiibo.gameSeries, Amiibo.imageUrl, Amiibo.`type` FROM Amiibo WHERE Amiibo.`name` = &#39;link&#39;\n[qtp708613859-40] INFO com.amiibo.search.adapter.repository.exposed.ExposedAmiiboRepository - [INSERT AMIIBO ON DATABASE]\nSQL: INSERT INTO Amiibo (amiiboSeries, gameSeries, imageUrl, `name`, `type`) VALUES (&#39;Super Smash Bros.&#39;, &#39;The Legend of Zelda&#39;, &#39;https://raw.githubusercontent.com/N3evin/AmiiboAPI/master/images/icon_01000000-00040002.png&#39;, &#39;Link&#39;, &#39;Figure&#39;)</code></pre></div>\n<p>Repetindo o <em>request</em> ele será visivelmente mais rápido e nos logs veremos:</p>\n<div class=\"gatsby-highlight\" data-language=\"log\"><pre class=\"language-log\"><code class=\"language-log\">[qtp708613859-32] INFO com.amiibo.search.useCase.SearchAmiibo - INIT SEARCH FOR AN AMIIBO OR IT WILL TRY FETCH ON EXTERNAL SERVICE\n[qtp708613859-32] INFO com.amiibo.search.adapter.repository.exposed.ExposedAmiiboRepository - [FIND AMIIBO BY NAME ON DATABASE]\nSQL: SELECT Amiibo.id, Amiibo.amiiboSeries, Amiibo.`name`, Amiibo.gameSeries, Amiibo.imageUrl, Amiibo.`type` FROM Amiibo WHERE Amiibo.`name` = &#39;link&#39;</code></pre></div>\n<h2 id=\"Trocando-o-MySQL-pelo-Mongo\" style=\"position:relative;\">Trocando o MySQL pelo Mongo<a href=\"#Trocando-o-MySQL-pelo-Mongo\" aria-label=\"Trocando o MySQL pelo Mongo permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Como estamos usando uma estratégia que prega facilidade de trocar os adaptadores com baixo acoplamento com frameworks será mostrado como poderemos fazer a troca do adaptador por qualquer outro sem grandes esforços contanto que o contrato seja implementado.</p>\n<p>Será trocado o <strong>MySQL</strong> pelo <strong>MongoDB</strong> noe xemplo a seguir. </p>\n<p>Para isso adicionamos a dependência no arquivo <code class=\"language-text\">build.gradle.kts</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">val mongo <span class=\"token operator\">=</span> <span class=\"token string\">\"3.12.8\"</span>\nimplementation<span class=\"token punctuation\">(</span><span class=\"token string\">\"org.mongodb:mongodb-driver:<span class=\"token variable\">$mongo</span>\"</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>E criamos a pasta <code class=\"language-text\">adapter.repository.mongo.config</code> e o arquivo <strong>MongoFactory</strong>:</p>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre class=\"language-kotlin\"><code class=\"language-kotlin\"><span class=\"token keyword\">object</span> MongoFactory <span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">private</span> <span class=\"token keyword\">val</span> mongoDatabase <span class=\"token operator\">=</span> System<span class=\"token punctuation\">.</span><span class=\"token function\">getenv</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">getOrDefault</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"MONGO_DATABASE\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"amiibo\"</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">private</span> <span class=\"token keyword\">val</span> mongoHost <span class=\"token operator\">=</span> System<span class=\"token punctuation\">.</span><span class=\"token function\">getenv</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">getOrDefault</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"MONGO_HOST\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"mongodb://admin:password@localhost:27017\"</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">private</span> <span class=\"token keyword\">val</span> uri<span class=\"token operator\">:</span> MongoClientURI <span class=\"token operator\">=</span> <span class=\"token function\">MongoClientURI</span><span class=\"token punctuation\">(</span>mongoHost<span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">val</span> database<span class=\"token operator\">:</span> MongoDatabase <span class=\"token operator\">=</span> <span class=\"token function\">MongoClient</span><span class=\"token punctuation\">(</span>uri<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">getDatabase</span><span class=\"token punctuation\">(</span>mongoDatabase<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Nesse arquivo é feita a configuração da conexão com o <strong>Mongo</strong> e agora será feita a implementação da interface <strong>Repository</strong> na classe <strong>MongoAmiiboRepository</strong>:</p>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre class=\"language-kotlin\"><code class=\"language-kotlin\"><span class=\"token keyword\">object</span> MongoAmiiboRepository <span class=\"token operator\">:</span> Repository <span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">private</span> <span class=\"token keyword\">val</span> mongoCollection <span class=\"token operator\">=</span> database<span class=\"token punctuation\">.</span><span class=\"token function\">getCollection</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"amiibo\"</span><span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">override</span> <span class=\"token keyword\">fun</span> <span class=\"token function\">findAll</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> Set<span class=\"token operator\">&lt;</span>Amiibo<span class=\"token operator\">></span><span class=\"token operator\">?</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> mongoCollection<span class=\"token punctuation\">.</span><span class=\"token function\">find</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">map</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token function\">mapToAmiibo</span><span class=\"token punctuation\">(</span>it<span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">.</span><span class=\"token function\">toSet</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">override</span> <span class=\"token keyword\">fun</span> <span class=\"token function\">findByAmiiboName</span><span class=\"token punctuation\">(</span>amiiboName<span class=\"token operator\">:</span> String<span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> List<span class=\"token operator\">&lt;</span>Amiibo<span class=\"token operator\">></span><span class=\"token operator\">?</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> mongoCollection<span class=\"token punctuation\">.</span><span class=\"token function\">find</span><span class=\"token punctuation\">(</span>Filters<span class=\"token punctuation\">.</span><span class=\"token function\">eq</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"name\"</span><span class=\"token punctuation\">,</span> amiiboName<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">map</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token function\">mapToAmiibo</span><span class=\"token punctuation\">(</span>it<span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">.</span><span class=\"token function\">toList</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">override</span> <span class=\"token keyword\">fun</span> <span class=\"token function\">insertAmiibo</span><span class=\"token punctuation\">(</span>amiibo<span class=\"token operator\">:</span> Amiibo<span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> Amiibo<span class=\"token operator\">?</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">val</span> document <span class=\"token operator\">=</span> <span class=\"token function\">Document</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\n        document<span class=\"token punctuation\">.</span><span class=\"token function\">let</span> <span class=\"token punctuation\">{</span> doc <span class=\"token operator\">-></span>\n            doc<span class=\"token punctuation\">.</span><span class=\"token function\">append</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"name\"</span><span class=\"token punctuation\">,</span> amiibo<span class=\"token punctuation\">.</span>name<span class=\"token punctuation\">)</span>\n            doc<span class=\"token punctuation\">.</span><span class=\"token function\">append</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"amiiboSeries\"</span><span class=\"token punctuation\">,</span> amiibo<span class=\"token punctuation\">.</span>amiiboSeries<span class=\"token punctuation\">)</span>\n            doc<span class=\"token punctuation\">.</span><span class=\"token function\">append</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"gameSeries\"</span><span class=\"token punctuation\">,</span> amiibo<span class=\"token punctuation\">.</span>gameSeries<span class=\"token punctuation\">)</span>\n            doc<span class=\"token punctuation\">.</span><span class=\"token function\">append</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"imageUrl\"</span><span class=\"token punctuation\">,</span> amiibo<span class=\"token punctuation\">.</span>imageUrl<span class=\"token punctuation\">)</span>\n            doc<span class=\"token punctuation\">.</span><span class=\"token function\">append</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"type\"</span><span class=\"token punctuation\">,</span> amiibo<span class=\"token punctuation\">.</span>type<span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">}</span>\n\n        mongoCollection<span class=\"token punctuation\">.</span><span class=\"token function\">insertOne</span><span class=\"token punctuation\">(</span>document<span class=\"token punctuation\">)</span>\n        <span class=\"token keyword\">return</span> <span class=\"token function\">mapToAmiibo</span><span class=\"token punctuation\">(</span>document<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">private</span> <span class=\"token keyword\">fun</span> <span class=\"token function\">mapToAmiibo</span><span class=\"token punctuation\">(</span>document<span class=\"token operator\">:</span> Document<span class=\"token punctuation\">)</span> <span class=\"token operator\">=</span> <span class=\"token function\">Amiibo</span><span class=\"token punctuation\">(</span>\n        document<span class=\"token punctuation\">.</span><span class=\"token function\">getString</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"amiiboSeries\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n        document<span class=\"token punctuation\">.</span><span class=\"token function\">getString</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"name\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n        document<span class=\"token punctuation\">.</span><span class=\"token function\">getString</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"gameSeries\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n        document<span class=\"token punctuation\">.</span><span class=\"token function\">getString</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"type\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n        document<span class=\"token punctuation\">.</span><span class=\"token function\">getString</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"imageUrl\"</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Após isso é possível trocar o adaptador onde ele é usado:</p>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre class=\"language-kotlin\"><code class=\"language-kotlin\"><span class=\"token keyword\">fun</span> <span class=\"token function\">searchAmiibo</span><span class=\"token punctuation\">(</span>ctx<span class=\"token operator\">:</span> Context<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">val</span> amiiboName<span class=\"token operator\">:</span> String <span class=\"token operator\">=</span> ctx<span class=\"token punctuation\">.</span><span class=\"token function\">pathParam</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"amiiboName\"</span><span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">val</span> amiiboByName<span class=\"token operator\">:</span> List<span class=\"token operator\">&lt;</span>Amiibo<span class=\"token operator\">></span><span class=\"token operator\">?</span> <span class=\"token operator\">=</span>\n        <span class=\"token function\">SearchAmiibo</span><span class=\"token punctuation\">(</span>MongoAmiiboRepository<span class=\"token punctuation\">,</span> FuelClientApi<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">searchAmiiboByName</span><span class=\"token punctuation\">(</span>amiiboName<span class=\"token punctuation\">)</span>\n\n    ctx<span class=\"token punctuation\">.</span><span class=\"token function\">status</span><span class=\"token punctuation\">(</span><span class=\"token number\">200</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">json</span><span class=\"token punctuation\">(</span>amiiboByName<span class=\"token operator\">!!</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>E podemos testar de novo sem problemas.</p>\n<p>A vantagem é clara, pois não necessitou de grandes mudanças no projeto, os testes não quebraram e com isso podemos trocar livremente os adaptadores sem que o projeto fique preso a uma tecnologia desde sua criação.</p>\n<h2 id=\"Conclusao\" style=\"position:relative;\">Conclusão<a href=\"#Conclusao\" aria-label=\"Conclusao permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Nesse projeto vimos como criar um projeto com <strong>Kotlin</strong> e algumas das facilidades dessa linguagem. Também vimos como usar o <strong>Javalin</strong> e como é fácil a sua configuração e também vimos como usar o <strong>framework ORM Exposed</strong> com o <strong>MySQL</strong> e uma outra opção com <strong>Mongo</strong> e como é fácil trocar as tecnologias quando se usa uma arquitetura de portas e adaptadores e por fim foi mostrado como fazer integrações com outros serviços via <strong>HTTP</strong> com o <strong>Fuel</strong>.</p>\n<p>Vimos também como testar uma aplicação utilizando adaptadores sem a necessidade de <em>mocks</em>, não que <em>mocks</em> sejam um problemas mas por vezes a má utilização dessas libs podem acarretar mais dificuldades do que benefícios nos testes da aplicação.</p>\n<h2 id=\"Codigo-fonte\" style=\"position:relative;\">Código fonte<a href=\"#Codigo-fonte\" aria-label=\"Codigo fonte permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>O código fonte dessa aplicação encontra-se no <a href=\"https://github.com/guilhermegarcia86/amiibo-search\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">GitHub</a></p>","fields":{"slug":"/kotlin-javalin-exposed-fuel/"},"frontmatter":{"date":"14 de junho de 2021","description":"Integrando serviços com Fuel e persistindo com Exposed","title":"Criando uma API com Kotlin e Javalin","tags":["Kotlin","Javalin","Fuel","Exposed","MySQL","Gradle","Swagger","Mongo"],"author":"Guilherme Alves","image":{"id":"5075d9ee-4268-52ff-be3d-bf94a229e1da","publicURL":"/static/f3573387283be1dd1e6b213106409424/capa-kotlin-javalin-exposed-fuel.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAAC4jAAAuIwF4pT92AAACCklEQVQ4y5WUTWsTYRDHF/xEfogGFFFDCBU8xIsGTxELVUxuOQS1CpUihIhgLl6CCPWSqhdfEJI0LbhpDKRpbDQhiSUvDWmSfXZ/7rObJS+2pQ7MzvMyM/uf+c+uwliEbjDSdQzDsPbSOut5mfeZ3ivTDscFnJbsuHPFWawXG6ymSxxp4sRk1vnUnWbaVqvFYDCYRZiqtVFW3qPcjRP8qNrOZvnCVH2s0llaIQSaplk+v3e+UygUyOVy9Ho9G6F8bNW7nFvZQLnzktWvdkLB6SKO+tTVbdqdDqlUimq1aifUx/C/lKo8Su2RyHTQP68xav8kvblNJpO2EEhk5XKZZDJJNBplv1Kh0WxayLvdLsPhcIJQMiylrsPzpWcM3kSs/ZXLV7m2uEgsFiMcDuNyufB6vSwsuLjh83Hb72evtDvDuOIszFwMfrV48HCTSMJ8ySHcu79MKBjC7XYTDAbxeDwEAgEuXbyA76af8OOnfEtn7RYIbYLQIXQkDLIj+FE36HeEyeCBWcqIfD6PqqpWaTs5lU/ZPOlEnNrbNZpbH2SkxT4Oy7NjYoz1ZNlt9Hi9FGdjOUTtxXlQX9lRupgdbKt0S52eTMbFGR1JDmaDKh2oFosMItc5fHLLRmkwQXg2mf5K7MHS9g/or7+Doz+THp45nYXaTiytRD1//58I+efHYZj9MWQ7xuj/AtbkETxAGIpYAAAAAElFTkSuQmCC","aspectRatio":1.4096916299559472,"src":"/static/f3573387283be1dd1e6b213106409424/0823f/capa-kotlin-javalin-exposed-fuel.png","srcSet":"/static/f3573387283be1dd1e6b213106409424/c67b7/capa-kotlin-javalin-exposed-fuel.png 320w,\n/static/f3573387283be1dd1e6b213106409424/d3930/capa-kotlin-javalin-exposed-fuel.png 640w,\n/static/f3573387283be1dd1e6b213106409424/0823f/capa-kotlin-javalin-exposed-fuel.png 1280w,\n/static/f3573387283be1dd1e6b213106409424/17523/capa-kotlin-javalin-exposed-fuel.png 1747w","sizes":"(max-width: 1280px) 100vw, 1280px"}}}},"timeToRead":27}},"pageContext":{"slug":"/kotlin-javalin-exposed-fuel/","previous":{"fields":{"slug":"/nestjs-fastify-typeorm/"},"frontmatter":{"title":"Criando uma aplicação REST com NestJS, Fastify e TypeORM","date":"01 jun, 2021"}},"next":{"fields":{"slug":"/java-iniciante/"},"frontmatter":{"title":"Primeiros passos com Java","date":"06 set, 2021"}}}},"staticQueryHashes":["63159454"]}