{"componentChunkName":"component---src-templates-blog-post-js","path":"/nestjs-fastify-typeorm/","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>Nesse artigo iremos criar uma aplicação REST do zero usando o framework <strong>NestJS</strong>, utilizando a linguagem <strong>Typescript</strong>, rodando o <strong>Fastify</strong> e o <strong>TypeORM</strong> para manipulação no banco de dados.</p>\n<p>Iremos usar uma abordagem arquitetural conhecida como Arquitetura Hexagonal que facilita muito o trabalho de desenvolvimento, deixando a aplicação plugável, independente de frameworks e bancos de dados.</p>\n<h2 id=\"Iniciando-o-projeto\" style=\"position:relative;\">Iniciando o projeto<a href=\"#Iniciando-o-projeto\" aria-label=\"Iniciando 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 NestJS é um framework construído em <strong>Typescript</strong> o que trás elementos de programação orientada a objetos <strong>OOP</strong> e programação funcional <strong>FP</strong>, inicialmente ele roda com <strong>Express</strong> mas nesse artigo será mostrado como é fácil alterar para o <strong>Fastify</strong>.</p>\n<p>Para iniciarmos o projeto podemos usar o <em>cli</em> utilitário do <strong>NestJS</strong> para isso:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token function\">npm</span> i -g @nestjs/cli</code></pre></div>\n<p>E com isso temos o <em>cli</em> do <strong>NestJS</strong> instalado de forma global no seu computador. E para criar um projeto novo pode ser usado o comando a seguir:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">nest new cadastro-api</code></pre></div>\n<p>No comando acima é utilizado o comando <strong>nest</strong> seguido de <strong>new</strong> e o nome do projeto que nesse caso será <strong>cadastro-api</strong>.</p>\n<p>Esse projeto será uma aplicação para cadastro de livros e seus autores, onde um autor pode ter vários livros. Mas será exposta somente a inclusão de livros e a aplicação terá inteligência o suficiente para cadastrar o autor caso não exista.</p>\n<p>Com isso o projeto está pronto porém ele por padrão vem com o <strong>Express</strong> e será necessário alterar para o <strong>Fastify</strong>. O <strong>Fastify</strong> que é inspirado tanto no <strong>Hapi</strong> quanto no <strong>Express</strong> é um framework web com foco na produtividade e performance, para adicionar ele no projeto basta executar o comando abaixo:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token function\">npm</span> i --save @nestjs/platform-fastify</code></pre></div>\n<p>E com isso já é instalado o <strong>Fastify</strong> com os módulos para utilização com o <strong>NestJS</strong>.</p>\n<p>E por fim será adicionado o <strong>TypeORM</strong> que faz a integração entre a aplicação e o banco de dados, para esse exemplo usaremos o banco de dados MySQL e para instalar usaremos o comando a seguir:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token function\">npm</span> <span class=\"token function\">install</span> --save @nestjs/typeorm typeorm mysql</code></pre></div>\n<p>E agora temos o projeto com as dependências necessárias para começarmos a parte de construção da aplicação com base na Arquitetura Hexagonal.</p>\n<h2 id=\"Construindo-o-dominio-da-aplicacao\" style=\"position:relative;\">Construindo o domínio da aplicação<a href=\"#Construindo-o-dominio-da-aplicacao\" aria-label=\"Construindo o dominio da aplicacao 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>No modelo de Arquitetura Hexagonal é importante definir primeiramente a camada de domínio pois é partir dela que toda aplicação cresce, é importante também salientar que nesse modelo a camada de domínio não tem acesso as implementações e toda a comunicação é feita a partir de interfaces e adaptadores, por isso esse modelo também é chamado de <em>ports and adapters</em>.</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: 68.09815950920245%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAIAAACgpqunAAAACXBIWXMAAAsSAAALEgHS3X78AAACiklEQVQoz2P4jwz+/ftPCmCAaPj94f2vN68gQn9+/7527dqlq1cvX7sGQtevX7x06d27dyDD////fv/2l4tnYJrBFt5MDLzsbPD7/Vsg7/z58+3t7RNbmie0NAHRxJamjpbmtevWQzTcyY2/YK789+sXmOb//x/WFlyP9T177OjTp0+XrFu/PCninJbISR1xIDqrKbzHw2L2nDkXL1wAuuJ6QfJVD9O/35A0//vz5//fv69evdqwZevKGdPOuBpf0BY9qyEENOKslsgVK9W1RVkzlyy9c/v2vx/ffn14j+RsoOa/f4Hku7dvFq1ctTsp/LKhzHkrtcet1U97mq6HuV3QkzjhZjp30gRgQIB9+Q9FMwSs27JlXkPNFR+rizYaj1qrXi9f8GrxnBezJlwNsLtur7OjOGv2wkWXbtx8sXX93YzIO7lxMM1gmzdu2z6noeayh+kFI7kHtQWvl857tXDWs6ndl9yMr1qpbcxPA2q+cefu2xNHnvY0Pp3YCnM22CXv3ryZu2z5npykS0Yy582UHtQUPmquuOpvd1FP4qi31dzp067duIHqbDDr69WLn44funrt+qatW1fPn3fG2+qChuBZVf5zagLnNISuWKutLMuft3zly+fP///4/uvd2z8f3v/7/YsBEtTXAu1P64g/unj+2/fvi1evXZ6dfMJQ5qiJwhEThZOGMtv9HecuXHj+3LnTZ8/erim46mV+PcL95/OnUJtfLp75pLfp798/QPaVy1fau7r7e7r7uruAqL+7q72jY9PmLaCQ+ffv84Uz73Zu/nBg199vXxlQk/Y/cNj9vX/v3u27d+/cuwdBt2/f/vTpE7JvUaPq719IVOMCCG1AZRD0/z8AmLyMuEAXHjYAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image lazyload\"\n        alt=\"arquitetura hexagonal\"\n        title=\"arquitetura hexagonal\"\n        data-src=\"/static/1e922af124825aa487b80e5bf0f14df2/a6d36/arquitetura-hexagonal.png\"\n        data-srcset=\"/static/1e922af124825aa487b80e5bf0f14df2/222b7/arquitetura-hexagonal.png 163w,\n/static/1e922af124825aa487b80e5bf0f14df2/ff46a/arquitetura-hexagonal.png 325w,\n/static/1e922af124825aa487b80e5bf0f14df2/a6d36/arquitetura-hexagonal.png 650w,\n/static/1e922af124825aa487b80e5bf0f14df2/e548f/arquitetura-hexagonal.png 975w,\n/static/1e922af124825aa487b80e5bf0f14df2/3c492/arquitetura-hexagonal.png 1300w,\n/static/1e922af124825aa487b80e5bf0f14df2/d2c28/arquitetura-hexagonal.png 4000w\"\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<p>Antes de entrar no código vamos entender o domínio dessa aplicação. Essa aplicação irá fazer o cadastro e a consulta de livros, então o domínio principal dessa aplicação é o <strong>Livro</strong>.</p>\n<p>Um livro é composto aqui por um nome e também por um autor, então existe um segundo domínio chamado <strong>Autor</strong> e o autor contém o nome e a lista de livros que aquele autor escreveu. Então temos o seguinte diagrama.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 491px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 44.78527607361963%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAAAsSAAALEgHS3X78AAAA80lEQVQoz42RiWqFUAxE/f9/FHfFFX3uax4nJcXKa+nAoE7GuUmuUxSFTNMkwzDoc55nGcfxm+h33mt47d9lWSSKInG6rpN932XbNnm9XtK2rRYxoz2BBtd1Ff61MLQ8z8XJskzSNNVikiTieZ6a+r7X8CfqulY/9SAINMS6931fHATXdaVpGjnPU47j0NMhgZxMjRHphDD8fOOnjs6UYRh+BdoImNiJ7bKqKn2P41hDrTsOtf0ZCaVjpyxL+Q0Y/6MZtEMCbcQn2dN1XT+I9snLyHrL3CwCI9xJJ5iAhQE0W8ndy9pozuF2/oIFPd8/gZ2/Aeiruqoigv3MAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image lazyload\"\n        alt=\"diagrama classe\"\n        title=\"diagrama classe\"\n        data-src=\"/static/aab8fee7de0d9e1e4d0bc8c5b1464653/13566/diagrama-classe.png\"\n        data-srcset=\"/static/aab8fee7de0d9e1e4d0bc8c5b1464653/222b7/diagrama-classe.png 163w,\n/static/aab8fee7de0d9e1e4d0bc8c5b1464653/ff46a/diagrama-classe.png 325w,\n/static/aab8fee7de0d9e1e4d0bc8c5b1464653/13566/diagrama-classe.png 491w\"\n        sizes=\"(max-width: 491px) 100vw, 491px\"\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<p>Então na raiz do projeto será criado a pasta <em>domain</em> e criaremos duas pastas a <em>livro</em> e a <em>autor</em> e começaremos pelo domínio do <strong>Livro</strong> no arquivo <code class=\"language-text\">livro.ts</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"typescript\"><pre class=\"language-typescript\"><code class=\"language-typescript\"><span class=\"token keyword\">export</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">Livro</span> <span class=\"token punctuation\">{</span>\n\n    name<span class=\"token operator\">:</span> <span class=\"token builtin\">string</span>\n\n    autor<span class=\"token operator\">:</span> Autor\n\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>E em seguida o domínio do <strong>Autor</strong> no arquivo <code class=\"language-text\">autor.ts</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"typescript\"><pre class=\"language-typescript\"><code class=\"language-typescript\"><span class=\"token keyword\">export</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">Autor</span> <span class=\"token punctuation\">{</span>\n\n    id<span class=\"token operator\">:</span> <span class=\"token builtin\">string</span>\n\n    name<span class=\"token operator\">:</span> <span class=\"token builtin\">string</span>\n\n    livros<span class=\"token operator\">:</span> Livro<span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>E já iremos adicionar a nossa <em>porta</em> que será a interface de comunicação e nela iremos definir duas operações, a operação de salvar <code class=\"language-text\">save</code> e outra para buscar todo os livros <code class=\"language-text\">findAll</code> no arquivos <code class=\"language-text\">livro.repository.ts</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"typescript\"><pre class=\"language-typescript\"><code class=\"language-typescript\"><span class=\"token keyword\">export</span> <span class=\"token keyword\">interface</span> <span class=\"token class-name\">LivroRepository</span><span class=\"token punctuation\">{</span>\n\n    <span class=\"token function\">save</span><span class=\"token punctuation\">(</span>livro<span class=\"token operator\">:</span> Livro<span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token builtin\">Promise</span><span class=\"token operator\">&lt;</span>Livro<span class=\"token operator\">></span>\n\n    <span class=\"token function\">findAll</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token builtin\">Promise</span><span class=\"token operator\">&lt;</span>Livro<span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token operator\">></span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>E por fim iremos definir o módulo de domínio no arquivo <code class=\"language-text\">domain.module.ts</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"typescript\"><pre class=\"language-typescript\"><code class=\"language-typescript\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> Module <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'@nestjs/common'</span><span class=\"token punctuation\">;</span>\n\n@<span class=\"token function\">Module</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 keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">DomainModule</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span></code></pre></div>\n<h2 id=\"Casos-de-uso\" style=\"position:relative;\">Casos de uso<a href=\"#Casos-de-uso\" aria-label=\"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>Quando definimos o módulo de domínio, que é o módulo mais ao centro da Arquitetura Hexagonal também criamos os casos de uso para aquele domínio, aqui vive a regra de negócio da aplicação.</p>\n<p>Vamos criar a pasta <em>usecase</em> e vamos criar dois arquivos, um para a regra de inserir um livro <code class=\"language-text\">create-livro-service.ts</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"typescript\"><pre class=\"language-typescript\"><code class=\"language-typescript\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> Livro <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"src/domain/livro/livro\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> LivroRepository <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"src/domain/ports/livro.repository\"</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">CreateLivroService</span><span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">constructor</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">private</span> <span class=\"token keyword\">readonly</span> repository<span class=\"token operator\">:</span> LivroRepository<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">async</span> <span class=\"token function\">create</span><span class=\"token punctuation\">(</span>livroDTO<span class=\"token operator\">:</span> Livro<span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token builtin\">Promise</span><span class=\"token operator\">&lt;</span>Livro<span class=\"token operator\">></span><span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>repository<span class=\"token punctuation\">.</span><span class=\"token function\">save</span><span class=\"token punctuation\">(</span>livroDTO<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>E outra para buscar todos os livros <code class=\"language-text\">find-all-livro-service.ts</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"typescript\"><pre class=\"language-typescript\"><code class=\"language-typescript\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> Livro <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"src/domain/livro/livro\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> LivroRepository <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"src/domain/ports/livro.repository\"</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">FindAllLivroService</span><span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">constructor</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">private</span> <span class=\"token keyword\">readonly</span> repository<span class=\"token operator\">:</span> LivroRepository<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">async</span> <span class=\"token function\">findAll</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token builtin\">Promise</span><span class=\"token operator\">&lt;</span>Livro<span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token operator\">></span><span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>repository<span class=\"token punctuation\">.</span><span class=\"token function\">findAll</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>Um ponto importante que deve ser notado é que nas duas classes foram adicionadas ao construtor a interface <strong>LivroRepository</strong> e com isso é usado um conceito muito importante na Arquitetura Hexagonal que é a <strong>Injeção de Dependências</strong> e com isso desacoplamos o local onde roda a lógica de negócio na aplicação de frameworks ou tecnologias bastando ser criado um adaptador, seja ele usando um framework como no nosso exemplo com <strong>TypeORM</strong> ou com qualquer outro framework ou até mesmo codificando a conexão manualmente com o banco de dados, para a nossa porta <strong>LivroRepository</strong>.</p>\n<p>Outro ponto importante é que como essa aplicação é mais simples os casos de uso são menores mas em aplicações mais complexas fica mais nítido a separação entre regras de negócio e implementações de tecnologias e frameworks. Onde a regra de negócio ficaria bem isolada do restante do código.</p>\n<h2 id=\"Adaptadores\" style=\"position:relative;\">Adaptadores<a href=\"#Adaptadores\" aria-label=\"Adaptadores 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 definição do domínio e dos casos de uso, que compõe o <strong>core</strong> da aplicação está na hora de “plugar” os adaptadores que serão as implementações das <em>portas</em> definidas no domínio.</p>\n<p>Iniciaremos com o adaptador que irá se comunicar com a camada de persistência de dados, será usado o <strong>TypeORM</strong> para isso, que é um <strong>ORM</strong> inspirado no <strong>Hibernate</strong>, <strong>Doctrine</strong> e <strong>Entity Framework</strong> escrito em <strong>Javascript</strong>. Juntamente ao <strong>TypeORM</strong> será usado o banco de dados <strong>MySQL</strong>.</p>\n<p>Para adicionar essas dependências na aplicação basta rodar o comando:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token function\">npm</span> <span class=\"token function\">install</span> --save @nestjs/typeorm typeorm mysql2</code></pre></div>\n<p>Agora criaremos a entidade que representará os dados persistidos no banco de dados. Criamos a pasta <code class=\"language-text\">adapters/repository/typeorm/entity</code> e dentro dela iremos criar o arquivo <code class=\"language-text\">livro.entity.ts</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"typescript\"><pre class=\"language-typescript\"><code class=\"language-typescript\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> Column<span class=\"token punctuation\">,</span> Entity<span class=\"token punctuation\">,</span> ManyToOne<span class=\"token punctuation\">,</span> PrimaryGeneratedColumn <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"typeorm\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> AutorEntity <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"./autor.entity\"</span><span class=\"token punctuation\">;</span>\n\n@<span class=\"token function\">Entity</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">LivroEntity</span> <span class=\"token punctuation\">{</span>\n\n    @<span class=\"token function\">PrimaryGeneratedColumn</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    id<span class=\"token operator\">:</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">;</span>\n\n    @<span class=\"token function\">Column</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>length<span class=\"token operator\">:</span><span class=\"token number\">200</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n    name<span class=\"token operator\">:</span> <span class=\"token builtin\">string</span><span class=\"token punctuation\">;</span>\n\n    @<span class=\"token function\">ManyToOne</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">type</span> <span class=\"token operator\">=></span> AutorEntity<span class=\"token punctuation\">,</span> autor <span class=\"token operator\">=></span> autor<span class=\"token punctuation\">.</span>livros<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> cascade<span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token string\">'insert'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> eager<span class=\"token operator\">:</span> <span class=\"token boolean\">true</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n    autor<span class=\"token operator\">:</span> AutorEntity\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Aqui fizemos uso de <a href=\"https://www.typescriptlang.org/docs/handbook/decorators.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Decorators</a> que é uma feature do <strong>Typescript</strong> que são formas de adicionar <em>metadados</em> em uma classe, atributo ou método, são equivalentes as <em>annotations</em> do <strong>Java</strong> e do <strong>C#</strong>.</p>\n<p>Vamos entender uma a uma das <em>annotations</em> que foram adicionadas na classe <strong>LivroEntity</strong>:</p>\n<ul>\n<li><strong>@Entity()</strong>: É usada para marcar a classe como sendo uma entidade que será administrada pelo <strong>TypeORM</strong> e que reflete uma tabela no banco de dados.</li>\n<li><strong>@PrimaryGeneratedColumn()</strong>: Identifica o atributo que será o <code class=\"language-text\">id</code> e também delega ao <strong>TypeORM</strong> a estratégia de geração do id.</li>\n<li><strong>@Column()</strong>: Usado para mapear as colunas da tabela, nesse caso também é passada o <code class=\"language-text\">length</code> da coluna.</li>\n<li><strong>@ManyToOne()</strong>: Definição de relacionamento com outra entidade, nesse caso a <strong>AutorEntity</strong>, onde deve ser lido como uma relação muitos <strong>LivroEntity</strong> para um <strong>AutorEntity</strong>, também definimos o relacionamento bi-direcional através do atributo <code class=\"language-text\">autor =&gt; autor.livros</code>, a propagação através do <code class=\"language-text\">cascade: [&#39;insert&#39;]</code> onde fica definido que somente o insert irá propagar na entidade <strong>AutorEntity</strong> e por fim o atributo <code class=\"language-text\">eager: true</code> onde queremos explicitamente que quando houver uma busca na entidade <strong>LivroEntity</strong> também fará uma busca na entidade <strong>AutorEntity</strong>. </li>\n</ul>\n<p><em>Obs: a estratégia <code class=\"language-text\">eager</code> deve ser evitada nos casos onde a consulta possa retornar muitos resultados pois pode sobrecarregar o banco de dados e causar lentidões e problemas indesejados.</em></p>\n<p>Agora será mostrado o mapeamento realizado na entidade <strong>AutorEntity</strong> no arquivo <code class=\"language-text\">autor.entity.ts</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"ts\"><pre class=\"language-ts\"><code class=\"language-ts\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> Column<span class=\"token punctuation\">,</span> Entity<span class=\"token punctuation\">,</span> OneToMany<span class=\"token punctuation\">,</span> PrimaryGeneratedColumn <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"typeorm\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> LivroEntity <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"./livro.entity\"</span><span class=\"token punctuation\">;</span>\n\n@<span class=\"token function\">Entity</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">AutorEntity</span> <span class=\"token punctuation\">{</span>\n\n    @<span class=\"token function\">PrimaryGeneratedColumn</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    id<span class=\"token operator\">:</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">;</span>\n\n    @<span class=\"token function\">Column</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> length<span class=\"token operator\">:</span> <span class=\"token number\">100</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n    name<span class=\"token operator\">:</span> <span class=\"token builtin\">string</span><span class=\"token punctuation\">;</span>\n\n    @<span class=\"token function\">OneToMany</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">type</span> <span class=\"token operator\">=></span> LivroEntity<span class=\"token punctuation\">,</span> livro <span class=\"token operator\">=></span> livro<span class=\"token punctuation\">.</span>autor<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> cascade<span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token string\">'remove'</span><span class=\"token punctuation\">]</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n    livros<span class=\"token operator\">:</span> LivroEntity<span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>A única coisa diferente aqui é o <strong>Decorator</strong> <strong>@OneToMany()</strong> onde é definido o relacionamento <strong>One-to-Many</strong> entre <strong>AutorEntity</strong> e <strong>LivroEntity</strong>, a configuração de programação <code class=\"language-text\">cascade: [&#39;remove&#39;]</code> para que quando um <strong>Autor</strong> for removido do banco de dados os <strong>Livros</strong> também sejam removidos.</p>\n<p>O mesmo pode ser representado pelo diagrama de modelo entidade relacionamento:</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 449px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 63.190184049079754%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAAAsSAAALEgHS3X78AAACCUlEQVQ4y5WTy2vUUBTG519zIyiCj6U70YWtC91YF9bXSnwsalEXiszCFi1IwRGLgiuLOysIQpnSYcZpJpPcZJJJcm8yeUw+z7kzoVWRsYEv59ycm1/Od5LU8jxHmmYYpSmS0d/i62k2qf9rT0Z15nCs8WnmUY5n1tMptMbrFxtfsfDsA648eY+5pbeYf9TApeUGzj9cx/3Xn/Ftx8C15x+xWP+Ei1SfW2pozS+/w7kH69hqGprLDjTw3tomzt59gzN3XuHY9Zc4vriCEzdWcORqHZefbmDze0vD+UEn6fqpm6tap2+t4uhCHV9+dPaB46JA34/QNAcwggR7Q6XV49yXaNk+nKFEGAyRJAmKLEWejXQs8gwqCn+fYUFJJBW6Rg+u5yOUMUlRPoRh9uH6Afqegj9w4AgbI4ImcYxYSQjbxsB1CZTuAzlRSqFvmgjDEDFvJgXUEd8wDEK0RYS2KbBrWDC9kBxJmOSqK3y0LRcyoY4PAhnQtyxIKbUtFsOFEJBRBEEj2Ok5aO5Z6LghjYLG4kkdW7aHKD4ArPyXZaljpYJmOx6PJznXKWcV03UlfgeVXf3ZVIvDKv0jTvSfwGoPd4SSOi8mESV3PlXBzqYznCXuggGGULi9JrDdy/DTkqQYphvDGsRwgox+w/wQQBTo2goXHnew1VI63+1JbHclDIfAXoaYgL8A/zLI6N6MkD0AAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image lazyload\"\n        alt=\"diagrama mer\"\n        title=\"diagrama mer\"\n        data-src=\"/static/62da2da180cd9dfcb3b0b9cf336d70ba/053a9/diagrama-mer.png\"\n        data-srcset=\"/static/62da2da180cd9dfcb3b0b9cf336d70ba/222b7/diagrama-mer.png 163w,\n/static/62da2da180cd9dfcb3b0b9cf336d70ba/ff46a/diagrama-mer.png 325w,\n/static/62da2da180cd9dfcb3b0b9cf336d70ba/053a9/diagrama-mer.png 449w\"\n        sizes=\"(max-width: 449px) 100vw, 449px\"\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<p>Com as entidades configuradas podemos agora criar efetivamente o adaptador que irá implementar a interface <strong>LivroRepository</strong>, segue o conteúdo do arquivo <code class=\"language-text\">livro.repository.typeorm.ts</code> e na sequência será explicado ponto a ponto:</p>\n<div class=\"gatsby-highlight\" data-language=\"ts\"><pre class=\"language-ts\"><code class=\"language-ts\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> Injectable<span class=\"token punctuation\">,</span> Logger <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"@nestjs/common\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> InjectRepository <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"@nestjs/typeorm\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> Autor <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"src/domain/autor/autor\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> Livro <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"src/domain/livro/livro\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> LivroRepository <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"src/domain/ports/livro.repository\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> Repository <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"typeorm\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> AutorEntity <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"./entity/autor.entity\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> LivroEntity <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"./entity/livro.entity\"</span><span class=\"token punctuation\">;</span>\n\n@<span class=\"token function\">Injectable</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">LivroRepositoryTypeORM</span> <span class=\"token keyword\">implements</span> <span class=\"token class-name\">LivroRepository</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">private</span> <span class=\"token keyword\">readonly</span> logger <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Logger</span><span class=\"token punctuation\">(</span>LivroRepositoryTypeORM<span class=\"token punctuation\">.</span>name<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">constructor</span><span class=\"token punctuation\">(</span>@<span class=\"token function\">InjectRepository</span><span class=\"token punctuation\">(</span>LivroEntity<span class=\"token punctuation\">)</span> <span class=\"token keyword\">private</span> <span class=\"token keyword\">readonly</span> livroEntityRepository<span class=\"token operator\">:</span> Repository<span class=\"token operator\">&lt;</span>LivroEntity<span class=\"token operator\">></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">async</span> <span class=\"token function\">save</span><span class=\"token punctuation\">(</span>livro<span class=\"token operator\">:</span> Livro<span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token builtin\">Promise</span><span class=\"token operator\">&lt;</span>Livro<span class=\"token operator\">></span> <span class=\"token punctuation\">{</span>\n\n        <span class=\"token keyword\">const</span> livroEntity<span class=\"token operator\">:</span> LivroEntity <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">mapToLivroEntity</span><span class=\"token punctuation\">(</span>livro<span class=\"token punctuation\">)</span>\n\n        <span class=\"token keyword\">const</span> livroSaved<span class=\"token operator\">:</span> LivroEntity <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>livroEntityRepository<span class=\"token punctuation\">.</span><span class=\"token function\">save</span><span class=\"token punctuation\">(</span>livroEntity<span class=\"token punctuation\">)</span>\n\n        <span class=\"token keyword\">return</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">mapToLivro</span><span class=\"token punctuation\">(</span>livroSaved<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">async</span> <span class=\"token function\">findAll</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token builtin\">Promise</span><span class=\"token operator\">&lt;</span>Livro<span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token operator\">></span> <span class=\"token punctuation\">{</span>\n\n        <span class=\"token keyword\">const</span> livroEntityArray<span class=\"token operator\">:</span> LivroEntity<span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>livroEntityRepository<span class=\"token punctuation\">.</span><span class=\"token function\">find</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\n        <span class=\"token keyword\">const</span> livroArray<span class=\"token operator\">:</span> Livro<span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> livroEntityArray<span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>livroEntity<span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n            <span class=\"token keyword\">return</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">mapToLivro</span><span class=\"token punctuation\">(</span>livroEntity<span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token keyword\">return</span> livroArray<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">private</span> <span class=\"token function\">mapToLivroEntity</span><span class=\"token punctuation\">(</span>livro<span class=\"token operator\">:</span> Livro<span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> LivroEntity <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">let</span> livroEntity<span class=\"token operator\">:</span> LivroEntity <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">LivroEntity</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        livroEntity<span class=\"token punctuation\">.</span>name <span class=\"token operator\">=</span> livro<span class=\"token punctuation\">.</span>name\n\n        <span class=\"token keyword\">let</span> autorEntity <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">AutorEntity</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n        <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span><span class=\"token operator\">!</span><span class=\"token operator\">!</span>livro<span class=\"token punctuation\">.</span>autor<span class=\"token punctuation\">.</span>id<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n            autorEntity<span class=\"token punctuation\">.</span>id <span class=\"token operator\">=</span> <span class=\"token function\">Number</span><span class=\"token punctuation\">(</span>livro<span class=\"token punctuation\">.</span>autor<span class=\"token punctuation\">.</span>id<span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">}</span>\n        autorEntity<span class=\"token punctuation\">.</span>name <span class=\"token operator\">=</span> livro<span class=\"token punctuation\">.</span>autor<span class=\"token punctuation\">.</span>name\n\n        livroEntity<span class=\"token punctuation\">.</span>autor <span class=\"token operator\">=</span> autorEntity\n\n        <span class=\"token keyword\">return</span> livroEntity\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">private</span> <span class=\"token function\">mapToLivro</span><span class=\"token punctuation\">(</span>livroEntity<span class=\"token operator\">:</span> LivroEntity<span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> Livro<span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">let</span> livro<span class=\"token operator\">:</span> Livro <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Livro</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n        \n        livro<span class=\"token punctuation\">.</span>name <span class=\"token operator\">=</span> livroEntity<span class=\"token punctuation\">.</span>name\n\n        <span class=\"token keyword\">let</span> autor<span class=\"token operator\">:</span> Autor <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Autor</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\n        autor<span class=\"token punctuation\">.</span>name <span class=\"token operator\">=</span> livroEntity<span class=\"token punctuation\">.</span>autor<span class=\"token punctuation\">.</span>name\n\n        livro<span class=\"token punctuation\">.</span>autor <span class=\"token operator\">=</span> autor\n\n        <span class=\"token keyword\">return</span> livro\n    <span class=\"token punctuation\">}</span>\n    \n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>O primeiro ponto é que essa classe foi marcada com o <strong>Decorator</strong> <strong>@Injectable()</strong>, isso significa que a injeção de dependências ficará sob a responsabilidade do <strong>NestJS</strong>.</p>\n<p>O segundo ponto é que essa classe implementa a interface <strong>LivroRepository</strong> e com isso somos obrigados a definir uma implementação para s métodos <em>save</em> e <em>findAll</em>.</p>\n<p>Um ponto ponto muito interessante de entender é o trecho a seguir de código, onde o construtor utiliza um <strong>Decorator</strong> diferente que vem do próprio <strong>TypeORM</strong>:</p>\n<div class=\"gatsby-highlight\" data-language=\"ts\"><pre class=\"language-ts\"><code class=\"language-ts\"><span class=\"token keyword\">constructor</span><span class=\"token punctuation\">(</span>@<span class=\"token function\">InjectRepository</span><span class=\"token punctuation\">(</span>LivroEntity<span class=\"token punctuation\">)</span> <span class=\"token keyword\">private</span> <span class=\"token keyword\">readonly</span> livroEntityRepository<span class=\"token operator\">:</span> Repository<span class=\"token operator\">&lt;</span>LivroEntity<span class=\"token operator\">></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span></code></pre></div>\n<p>Essa é uma forma que podemos usar o <strong>TypeORM</strong> para fazer a injeção de um <strong>Repository</strong> que é uma interface que nos auxilia com os métodos para manipulação dos dados da Entidade.</p>\n<p>Contamos com ajuda de dois métodos que fazem a transformação dos dados que receberemos, pois iremos receber objetos do domínio da aplicação e queremos transformá-los em entidades e vice e versa, então os métodos <code class=\"language-text\">mapToLivroEntity</code> e <code class=\"language-text\">mapToLivro</code> fazem isso e conseguimos tanto salvar um <strong>LivroEntity</strong> no banco de dados quanto recuperar um <strong>Livro</strong> do nosso domínio para ser exibido.</p>\n<p>E por fim é configurado a conexão entre o <strong>TypeORM</strong>, o <strong>MySQL</strong> e o <strong>NestJS</strong>. Iremos criar a pasta <code class=\"language-text\">adapters/repository/typeorm/config</code> e dentro dela criaremos o arquivo <code class=\"language-text\">typeorm-config.module.ts</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"ts\"><pre class=\"language-ts\"><code class=\"language-ts\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> Module <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"@nestjs/common\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> TypeOrmModule <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"@nestjs/typeorm\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> AutorEntity <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"../entity/autor.entity\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> LivroEntity <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"../entity/livro.entity\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> LivroRepositoryTypeORM <span class=\"token keyword\">from</span> <span class=\"token string\">\"../livro.repository.typeorm\"</span><span class=\"token punctuation\">;</span>\n\n\n@<span class=\"token function\">Module</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n    imports<span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\n        TypeOrmModule<span class=\"token punctuation\">.</span><span class=\"token function\">forRoot</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n            <span class=\"token string\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"mysql\"</span><span class=\"token punctuation\">,</span>\n            <span class=\"token string\">\"host\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"localhost\"</span><span class=\"token punctuation\">,</span>\n            <span class=\"token string\">\"port\"</span><span class=\"token operator\">:</span> <span class=\"token number\">3306</span><span class=\"token punctuation\">,</span>\n            <span class=\"token string\">\"username\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"user\"</span><span class=\"token punctuation\">,</span>\n            <span class=\"token string\">\"password\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"user\"</span><span class=\"token punctuation\">,</span>\n            <span class=\"token string\">\"database\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"bookstore\"</span><span class=\"token punctuation\">,</span>\n            <span class=\"token string\">\"entities\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token string\">\"dist/**/*.entity{.ts,.js}\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n            <span class=\"token string\">\"synchronize\"</span><span class=\"token operator\">:</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">,</span>\n            <span class=\"token string\">\"autoLoadEntities\"</span><span class=\"token operator\">:</span> <span class=\"token boolean\">true</span>\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n        TypeOrmModule<span class=\"token punctuation\">.</span><span class=\"token function\">forFeature</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span>LivroEntity<span class=\"token punctuation\">,</span> AutorEntity<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n    providers<span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>LivroRepositoryTypeORM<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n    exports<span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>LivroRepositoryTypeORM<span class=\"token punctuation\">]</span>\n\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">TypeOrmConfigModule</span> <span class=\"token punctuation\">{</span> <span class=\"token punctuation\">}</span></code></pre></div>\n<p>É bom salientar que o <strong>NestJS</strong> trabalha muito bem com a ideia de módulos e por isso foi a estratégia abordada nesse projeto, então temos agora o módulo <strong>TypeOrmConfigModule</strong> em que as classes do adaptador <strong>TypeORM</strong> são “amarradas” e agora vamos entender também parte a parte da definição desse módulo:</p>\n<div class=\"gatsby-highlight\" data-language=\"ts\"><pre class=\"language-ts\"><code class=\"language-ts\">TypeOrmModule<span class=\"token punctuation\">.</span><span class=\"token function\">forRoot</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n    <span class=\"token string\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"mysql\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string\">\"host\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"localhost\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string\">\"port\"</span><span class=\"token operator\">:</span> <span class=\"token number\">3306</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string\">\"username\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"user\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string\">\"password\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"user\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string\">\"database\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"bookstore\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string\">\"entities\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token string\">\"dist/**/*.entity{.ts,.js}\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string\">\"synchronize\"</span><span class=\"token operator\">:</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string\">\"autoLoadEntities\"</span><span class=\"token operator\">:</span> <span class=\"token boolean\">true</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>Essa é uma configuração que o <strong>TypeORm</strong> pede para configurar o driver de conexão correto para o banco, as credenciais de acesso, a porta e o nome do banco que será conectado.</p>\n<p>E também possui as seguintes propriedades que merecem um destaque especial:</p>\n<ul>\n<li>entities: É passado o padrão de nomenclatura do arquivo que o <strong>TypeORM</strong> deve observar para reconhecer como sendo uma entidade de banco de dados.</li>\n<li>synchronize: Passando <code class=\"language-text\">true</code> nesse atributo as tabelas são criadas automáticamente. Não é uma boa opção pensando em um código em produção, para isso existem as <strong>Migrations</strong> que não será abordada nesse artigo mas pode ser visto <a href=\"https://docs.nestjs.com/migration-guide\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">aqui</a>.</li>\n<li>autoLoadEntities: Se for informado <code class=\"language-text\">true</code> automaticamente serão carregadas todas as entidades que forem encontradas pelo <strong>TypeORM</strong>.</li>\n</ul>\n<p>Em contraponto à configuração <code class=\"language-text\">autoLoadEntities</code> pode ser informado uma a uma cada entidade com a configuração: </p>\n<div class=\"gatsby-highlight\" data-language=\"ts\"><pre class=\"language-ts\"><code class=\"language-ts\">TypeOrmModule<span class=\"token punctuation\">.</span><span class=\"token function\">forFeature</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span>LivroEntity<span class=\"token punctuation\">,</span> AutorEntity<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>Por fim temos o seguinte trecho de código:</p>\n<div class=\"gatsby-highlight\" data-language=\"ts\"><pre class=\"language-ts\"><code class=\"language-ts\">providers<span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>LivroRepositoryTypeORM<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\nexports<span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>LivroRepositoryTypeORM<span class=\"token punctuation\">]</span></code></pre></div>\n<p>Onde é definido que nesse módulo será provido a implementação <strong>LivroRepositoryTypeORM</strong> e que ela também será usada fora do módulo e ficará disponível para o <strong>NestJS</strong> usar na injeção de dependência.</p>\n<h2 id=\"Controller\" style=\"position:relative;\">Controller<a href=\"#Controller\" aria-label=\"Controller 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>Nessa seção será mostrado como será usado tudo o que foi feito até o momento para expor um controller REST e para isso iremos criar um adaptador na pasta <code class=\"language-text\">src/adapters/controller/rest/config/config-service.module.ts</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"ts\"><pre class=\"language-ts\"><code class=\"language-ts\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> DynamicModule<span class=\"token punctuation\">,</span> Module <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"@nestjs/common\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> TypeOrmConfigModule <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"src/adapters/repository/typeorm/config/typeorm-config.module\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> LivroRepositoryTypeORM <span class=\"token keyword\">from</span> <span class=\"token string\">\"src/adapters/repository/typeorm/livro.repository.typeorm\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> CreateLivroService <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"src/usecase/create-livro-service\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> FindAllLivroService <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"src/usecase/find-all-livro-service\"</span><span class=\"token punctuation\">;</span>\n\n@<span class=\"token function\">Module</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n    imports<span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>TypeOrmConfigModule<span class=\"token punctuation\">]</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">ConfigServiceModule</span><span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">static</span> <span class=\"token constant\">FIND_ALL_LIVRO_SERVICE</span><span class=\"token operator\">:</span> <span class=\"token builtin\">string</span> <span class=\"token operator\">=</span> <span class=\"token string\">'FindAllLivroService'</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">static</span> <span class=\"token constant\">CREATE_LIVRO_SERVICE</span><span class=\"token operator\">:</span> <span class=\"token builtin\">string</span> <span class=\"token operator\">=</span> <span class=\"token string\">'CreateLivroService'</span><span class=\"token punctuation\">;</span>\n  \n    <span class=\"token keyword\">static</span> <span class=\"token function\">register</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> DynamicModule <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token keyword\">module</span><span class=\"token operator\">:</span> ConfigServiceModule<span class=\"token punctuation\">,</span>\n            providers<span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\n                <span class=\"token punctuation\">{</span>\n                    inject<span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>LivroRepositoryTypeORM<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n                    provide<span class=\"token operator\">:</span> ConfigServiceModule<span class=\"token punctuation\">.</span><span class=\"token constant\">CREATE_LIVRO_SERVICE</span><span class=\"token punctuation\">,</span>\n                    <span class=\"token function-variable function\">useFactory</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">(</span>livroRepository<span class=\"token operator\">:</span> LivroRepositoryTypeORM<span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">CreateLivroService</span><span class=\"token punctuation\">(</span>livroRepository<span class=\"token punctuation\">)</span>\n                <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n                <span class=\"token punctuation\">{</span>\n                    inject<span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>LivroRepositoryTypeORM<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n                    provide<span class=\"token operator\">:</span> ConfigServiceModule<span class=\"token punctuation\">.</span><span class=\"token constant\">FIND_ALL_LIVRO_SERVICE</span><span class=\"token punctuation\">,</span>\n                    <span class=\"token function-variable function\">useFactory</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">(</span>livroRepository<span class=\"token operator\">:</span> LivroRepositoryTypeORM<span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">FindAllLivroService</span><span class=\"token punctuation\">(</span>livroRepository<span class=\"token punctuation\">)</span>\n                <span class=\"token punctuation\">}</span>\n            <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n            exports<span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>ConfigServiceModule<span class=\"token punctuation\">.</span><span class=\"token constant\">FIND_ALL_LIVRO_SERVICE</span><span class=\"token punctuation\">,</span> ConfigServiceModule<span class=\"token punctuation\">.</span><span class=\"token constant\">CREATE_LIVRO_SERVICE</span><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>No trecho acima tem muitas coisas interessantes acontecendo e vamos entender cada uma delas.</p>\n<p>Primeiramente importamos o módulo <strong>TypeOrmConfigModule</strong> pois aqui é onde incluiremos a injeção do adaptador do <strong>TypeORM</strong>:</p>\n<div class=\"gatsby-highlight\" data-language=\"ts\"><pre class=\"language-ts\"><code class=\"language-ts\">@<span class=\"token function\">Module</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n    imports<span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>TypeOrmConfigModule<span class=\"token punctuation\">]</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>Logo em seguida é definido duas variáveis com os nomes <strong>FIND_ALL_LIVRO_SERVICE</strong> e <strong>CREATE_LIVRO_SERVICE</strong> elas serão usadas para fazer o que seria relativo a <em>annotation</em> <strong>@Qualifier</strong> que é usada no <strong>Java</strong> em que podemos usar para qualificarmos uma instância para ser injetada via um nome:</p>\n<div class=\"gatsby-highlight\" data-language=\"ts\"><pre class=\"language-ts\"><code class=\"language-ts\"><span class=\"token keyword\">static</span> <span class=\"token constant\">FIND_ALL_LIVRO_SERVICE</span><span class=\"token operator\">:</span> <span class=\"token builtin\">string</span> <span class=\"token operator\">=</span> <span class=\"token string\">'FindAllLivroService'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">static</span> <span class=\"token constant\">CREATE_LIVRO_SERVICE</span><span class=\"token operator\">:</span> <span class=\"token builtin\">string</span> <span class=\"token operator\">=</span> <span class=\"token string\">'CreateLivroService'</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Na sequência é feito uso do <strong>DynamicModule</strong> do <strong>NestJS</strong> onde podemos criar <em>providers</em> dinâmicamente passando o que deve ser injetado, nesse caso o <strong>LivroRepositoryTypeORM</strong>, um provider que será o nome pelo o qual iremos injetar a instância onde formos usar, podendo ser <strong>CREATE_LIVRO_SERVICE</strong> ou <strong>FIND_ALL_LIVRO_SERVICE</strong> no nosso exemplo e um método chamado <em>useFactory</em> que é um método que irá “fabricar” a instância desejada passando a dependência correta:</p>\n<div class=\"gatsby-highlight\" data-language=\"ts\"><pre class=\"language-ts\"><code class=\"language-ts\">    <span class=\"token keyword\">static</span> <span class=\"token function\">register</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> DynamicModule <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token keyword\">module</span><span class=\"token operator\">:</span> ConfigServiceModule<span class=\"token punctuation\">,</span>\n            providers<span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\n                <span class=\"token punctuation\">{</span>\n                    inject<span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>LivroRepositoryTypeORM<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n                    provide<span class=\"token operator\">:</span> ConfigServiceModule<span class=\"token punctuation\">.</span><span class=\"token constant\">CREATE_LIVRO_SERVICE</span><span class=\"token punctuation\">,</span>\n                    <span class=\"token function-variable function\">useFactory</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">(</span>livroRepository<span class=\"token operator\">:</span> LivroRepositoryTypeORM<span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">CreateLivroService</span><span class=\"token punctuation\">(</span>livroRepository<span class=\"token punctuation\">)</span>\n                <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n                <span class=\"token punctuation\">{</span>\n                    inject<span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>LivroRepositoryTypeORM<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n                    provide<span class=\"token operator\">:</span> ConfigServiceModule<span class=\"token punctuation\">.</span><span class=\"token constant\">FIND_ALL_LIVRO_SERVICE</span><span class=\"token punctuation\">,</span>\n                    <span class=\"token function-variable function\">useFactory</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">(</span>livroRepository<span class=\"token operator\">:</span> LivroRepositoryTypeORM<span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">FindAllLivroService</span><span class=\"token punctuation\">(</span>livroRepository<span class=\"token punctuation\">)</span>\n                <span class=\"token punctuation\">}</span>\n            <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n            exports<span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>ConfigServiceModule<span class=\"token punctuation\">.</span><span class=\"token constant\">FIND_ALL_LIVRO_SERVICE</span><span class=\"token punctuation\">,</span> ConfigServiceModule<span class=\"token punctuation\">.</span><span class=\"token constant\">CREATE_LIVRO_SERVICE</span><span class=\"token punctuation\">]</span>\n        <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span></code></pre></div>\n<p>E por fim é exportado as duas <em>strings</em> que são usadas para nomear os <em>providers</em> que serão injetados:</p>\n<div class=\"gatsby-highlight\" data-language=\"ts\"><pre class=\"language-ts\"><code class=\"language-ts\">exports<span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>ConfigServiceModule<span class=\"token punctuation\">.</span><span class=\"token constant\">FIND_ALL_LIVRO_SERVICE</span><span class=\"token punctuation\">,</span> ConfigServiceModule<span class=\"token punctuation\">.</span><span class=\"token constant\">CREATE_LIVRO_SERVICE</span><span class=\"token punctuation\">]</span></code></pre></div>\n<p>Com essa configuração feita iremos criar o <strong>Controller</strong>:</p>\n<div class=\"gatsby-highlight\" data-language=\"ts\"><pre class=\"language-ts\"><code class=\"language-ts\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> Body<span class=\"token punctuation\">,</span> Controller<span class=\"token punctuation\">,</span> Get<span class=\"token punctuation\">,</span> Inject<span class=\"token punctuation\">,</span> Post <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"@nestjs/common\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> Livro <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"src/domain/livro/livro\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> CreateLivroService <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"src/usecase/create-livro-service\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> FindAllLivroService <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"src/usecase/find-all-livro-service\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> ConfigServiceModule <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"../config/config-service.module\"</span><span class=\"token punctuation\">;</span>\n\n@<span class=\"token function\">Controller</span><span class=\"token punctuation\">(</span><span class=\"token string\">'livro'</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">LivroController</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">constructor</span><span class=\"token punctuation\">(</span>@<span class=\"token function\">Inject</span><span class=\"token punctuation\">(</span>ConfigServiceModule<span class=\"token punctuation\">.</span><span class=\"token constant\">CREATE_LIVRO_SERVICE</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">private</span> <span class=\"token keyword\">readonly</span> createLivroService<span class=\"token operator\">:</span> CreateLivroService<span class=\"token punctuation\">,</span>\n                @<span class=\"token function\">Inject</span><span class=\"token punctuation\">(</span>ConfigServiceModule<span class=\"token punctuation\">.</span><span class=\"token constant\">FIND_ALL_LIVRO_SERVICE</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">private</span> <span class=\"token keyword\">readonly</span> findAllLivroService<span class=\"token operator\">:</span> FindAllLivroService<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span>\n\n    @<span class=\"token function\">Get</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">public</span> <span class=\"token function\">findAll</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token builtin\">Promise</span><span class=\"token operator\">&lt;</span>Livro<span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token operator\">></span><span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>findAllLivroService<span class=\"token punctuation\">.</span><span class=\"token function\">findAll</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n\n    @<span class=\"token function\">Post</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">public</span> <span class=\"token function\">createLivro</span><span class=\"token punctuation\">(</span>@<span class=\"token function\">Body</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> livro<span class=\"token operator\">:</span> Livro<span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token builtin\">Promise</span><span class=\"token operator\">&lt;</span>Livro<span class=\"token operator\">></span><span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>createLivroService<span class=\"token punctuation\">.</span><span class=\"token function\">create</span><span class=\"token punctuation\">(</span>livro<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Os <strong>Decorators</strong> usados são de dois tipos e primeiramente vamos ver os que são usados para expor a <strong>API REST</strong>:</p>\n<ul>\n<li><strong>@Controller(‘livro’)</strong>: <strong>Decorator</strong> usado para indicar que essa classe será usada como um <em>endpoint</em>, é passado uma string para informar qual será o path, no exemplo foi passado a string <em>livro</em> então o path será <em>/livro</em>.</li>\n<li><strong>@Get()</strong>: Usado para indicar o verbo HTTP GET, no exemplo só passamos um GET na raiz <em>/livro</em> mas caso fosse necessário é possível configurar <em>path</em>, <em>query params</em> e <em>path params</em>.</li>\n<li><strong>@Post()</strong>: Também usado na raiz <em>/livro</em> para indicar que é possível enviar um <strong>POST</strong> no endpoint.</li>\n<li><strong>@Body()</strong>: Usado no método de <strong>POST</strong> e informa qual o <em>body</em> deve ser aceito por esse endpoint, no exemplo esse <em>endpoint</em> só irá aceitar requests com o formato do objeto <strong>Livro</strong>.</li>\n</ul>\n<p>Fora isso também temos o <strong>Decorator</strong> <strong>@Inject()</strong> e nele passamos o nome do qualificador que deve ser carregado para que a injeção de dependência seja feita de forma correta.</p>\n<p>Agora temos as duas pontas configuras e para que esse <strong>Controller</strong> esteja disponível para ser usado pela aplicação é necessário expô-lo como um módulo que será usado pelo <strong>NestJS</strong>:</p>\n<div class=\"gatsby-highlight\" data-language=\"ts\"><pre class=\"language-ts\"><code class=\"language-ts\">@<span class=\"token function\">Module</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n    imports<span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>ConfigServiceModule<span class=\"token punctuation\">.</span><span class=\"token function\">register</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n    controllers<span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>LivroController<span class=\"token punctuation\">]</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">ControllerModule</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span></code></pre></div>\n<p>No código acima importamos da classe <strong>ConfigServiceModule</strong> o método <em>register()</em> para que os <em>providers</em> estejam disponíveis e informamos que esse módulo expõe um <strong>Controller</strong> que nesse caso é o <strong>LivroController</strong>.</p>\n<h2 id=\"Application\" style=\"position:relative;\">Application<a href=\"#Application\" aria-label=\"Application 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 encerrar iremos criar a camada de <em>application</em>, é o módulo responsável pela entrada da aplicação. Criaremos o arquivo no path <code class=\"language-text\">src/application/app.module.ts</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"ts\"><pre class=\"language-ts\"><code class=\"language-ts\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> Module <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'@nestjs/common'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> ControllerModule <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'src/adapters/controller/rest/controller.module'</span><span class=\"token punctuation\">;</span>\n\n@<span class=\"token function\">Module</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n  imports<span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>ControllerModule<span class=\"token punctuation\">]</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">AppModule</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span></code></pre></div>\n<p>No código acima basicamente foi criado o módulo <strong>AppModule</strong> e importamos o <strong>ControllerModule</strong> sem necessidade de expor nada além para o funcionamento.</p>\n<p>A última configuração é necessária no arquivo <code class=\"language-text\">main.ts</code> na raiz do projeto, esse é o arquivo que será executado pelo <strong>NestJS</strong> para iniciar a aplicação e é nele que iremos fazer a configuração do <strong>Fastify</strong> e a inserção do módulo <strong>AppModule</strong>:</p>\n<div class=\"gatsby-highlight\" data-language=\"ts\"><pre class=\"language-ts\"><code class=\"language-ts\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> NestFactory <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'@nestjs/core'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> FastifyAdapter<span class=\"token punctuation\">,</span> NestFastifyApplication <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'@nestjs/platform-fastify'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> AppModule <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'./application/app.module'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span> <span class=\"token function\">bootstrap</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> app <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> NestFactory<span class=\"token punctuation\">.</span><span class=\"token generic-function\"><span class=\"token function\">create</span><span class=\"token generic class-name\"><span class=\"token operator\">&lt;</span>NestFastifyApplication<span class=\"token operator\">></span></span></span><span class=\"token punctuation\">(</span>\n    AppModule<span class=\"token punctuation\">,</span>\n    <span class=\"token keyword\">new</span> <span class=\"token class-name\">FastifyAdapter</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">await</span> app<span class=\"token punctuation\">.</span><span class=\"token function\">listen</span><span class=\"token punctuation\">(</span><span class=\"token number\">3000</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token function\">bootstrap</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>r<span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> r<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Alteramos o padrão da função <em>bootstrap</em> e adicionamos a dependência do <strong>Fastify</strong> e é só isso, nenhuma configuração a mais para adicionar o <strong>Fastify</strong> como motor web da aplicação 😊</p>\n<h2 id=\"Rodando-a-aplicacao\" style=\"position:relative;\">Rodando a aplicação<a href=\"#Rodando-a-aplicacao\" aria-label=\"Rodando a aplicacao 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>Antes de rodar a aplicação é necessário ter o MySQL rodando, mas para facilitar esse processo de infraestrutura iremos criar o MySQL pelo docker-compose. Na raiz do projeto basta criar o arquivo <code class=\"language-text\">docker-compose.yml</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"yml\"><pre class=\"language-yml\"><code class=\"language-yml\"><span class=\"token key atrule\">version</span><span class=\"token punctuation\">:</span> <span class=\"token string\">'3'</span>\n<span class=\"token key atrule\">services</span><span class=\"token punctuation\">:</span> \n\n  <span class=\"token key atrule\">mysql</span><span class=\"token punctuation\">:</span>\n    <span class=\"token key atrule\">image</span><span class=\"token punctuation\">:</span> mysql<span class=\"token punctuation\">:</span>8.0.17\n    <span class=\"token key atrule\">cap_add</span><span class=\"token punctuation\">:</span> \n      <span class=\"token punctuation\">-</span> SYS_NICE\n    <span class=\"token key atrule\">environment</span><span class=\"token punctuation\">:</span> \n      <span class=\"token key atrule\">MYSQL_ROOT_PASSWORD</span><span class=\"token punctuation\">:</span> root\n      <span class=\"token key atrule\">MYSQL_USER</span><span class=\"token punctuation\">:</span> user\n      <span class=\"token key atrule\">MYSQL_PASSWORD</span><span class=\"token punctuation\">:</span> user\n      <span class=\"token key atrule\">MYSQL_DATABASE</span><span class=\"token punctuation\">:</span> bookstore\n    <span class=\"token key atrule\">ports</span><span class=\"token punctuation\">:</span> \n      <span class=\"token punctuation\">-</span> <span class=\"token string\">\"3306:3306\"</span>\n    <span class=\"token key atrule\">volumes</span><span class=\"token punctuation\">:</span> \n      <span class=\"token punctuation\">-</span> ./data/cadastro<span class=\"token punctuation\">-</span>api.sql<span class=\"token punctuation\">:</span>/docker<span class=\"token punctuation\">-</span>entrypoint<span class=\"token punctuation\">-</span>initdb.d/cadastro<span class=\"token punctuation\">-</span>api.sql</code></pre></div>\n<p>Adicionamos a imagem do MySQL, definimos as credenciais, portas, database e o volume que deve ser montado no start do container:</p>\n<div class=\"gatsby-highlight\" data-language=\"sql\"><pre class=\"language-sql\"><code class=\"language-sql\"><span class=\"token keyword\">CREATE</span> <span class=\"token keyword\">DATABASE</span> <span class=\"token keyword\">IF</span> <span class=\"token operator\">NOT</span> <span class=\"token keyword\">EXISTS</span> bookstore<span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">GRANT</span> <span class=\"token keyword\">ALL</span> <span class=\"token keyword\">PRIVILEGES</span> <span class=\"token keyword\">ON</span> <span class=\"token operator\">*</span><span class=\"token punctuation\">.</span><span class=\"token operator\">*</span> <span class=\"token keyword\">TO</span> <span class=\"token string\">'user'</span><span class=\"token variable\">@'%'</span> <span class=\"token keyword\">WITH</span> <span class=\"token keyword\">GRANT</span> <span class=\"token keyword\">OPTION</span><span class=\"token punctuation\">;</span>\nFLUSH <span class=\"token keyword\">PRIVILEGES</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">ALTER</span> <span class=\"token keyword\">USER</span> <span class=\"token string\">'user'</span> IDENTIFIED <span class=\"token keyword\">WITH</span> mysql_native_password <span class=\"token keyword\">BY</span> <span class=\"token string\">'user'</span><span class=\"token punctuation\">;</span>\nFLUSH <span class=\"token keyword\">PRIVILEGES</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>E depois rodamos o comando na raiz do projeto:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">docker compose up</code></pre></div>\n<p>E agora para iniciar a aplicação podemos usar o comando a seguir:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token function\">npm</span> run start:dev</code></pre></div>\n<p>E para testar o <em>endpoint</em> podemos fazer um <strong>POST</strong> para inserir um livro com um autor associado:</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 POST <span class=\"token string\">'localhost:3000/livro'</span> <span class=\"token punctuation\">\\</span>\n--header <span class=\"token string\">'Content-Type: application/json'</span> <span class=\"token punctuation\">\\</span>\n--data-raw <span class=\"token string\">'{\n    \"name\": \"Vidas secas\",\n    \"autor\": {\n        \"name\": \"Graciliano Ramos\"\n    }\n}'</span> <span class=\"token operator\">|</span> json_pp</code></pre></div>\n<p>E teremos o resultado:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token punctuation\">{</span>\n    <span class=\"token string\">\"name\"</span><span class=\"token builtin class-name\">:</span> <span class=\"token string\">\"Vidas secas\"</span>,\n    <span class=\"token string\">\"autor\"</span><span class=\"token builtin class-name\">:</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token string\">\"name\"</span><span class=\"token builtin class-name\">:</span> <span class=\"token string\">\"Graciliano Ramos\"</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>E fazendo o <strong>GET</strong>:</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\">'localhost:3000/livro'</span> <span class=\"token punctuation\">\\</span>\n--header <span class=\"token string\">'Content-Type: application/json'</span> <span class=\"token punctuation\">\\</span>\n--data-raw <span class=\"token string\">'{\n    \"name\": \"Vidas secas\",\n    \"autor\": {\n        \"name\": \"Graciliano Ramos\"\n    }\n}'</span> <span class=\"token operator\">|</span> json_pp</code></pre></div>\n<p>Teremos o resultado:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token punctuation\">[</span>\n    <span class=\"token punctuation\">{</span>\n        <span class=\"token string\">\"name\"</span><span class=\"token builtin class-name\">:</span> <span class=\"token string\">\"Vidas secas\"</span>,\n        <span class=\"token string\">\"autor\"</span><span class=\"token builtin class-name\">:</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token string\">\"name\"</span><span class=\"token builtin class-name\">:</span> <span class=\"token string\">\"Graciliano Ramos\"</span>\n        <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">]</span></code></pre></div>\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>Aqui aprendemos como usar o <strong>NestJS</strong> e como ele e o <strong>Typescript</strong> auxiliam o desenvolvedor a criar aplicações usando a tipagem estática do <strong>Typescript</strong> e o sistema de módulos e injeção de dependências do <strong>NestJS</strong>. Também vimos como usar o <strong>TypeORM</strong> para abstrair a comunicação com banco de dados e como conseguimos tirar vantagem de um padrão arquitetural como a Arquitetura Hexagonal para deixar a aplicação focada nas regras de negócio ao invés de ficar acoplada a tecnologias e frameworks.</p>\n<p>Por fim vimos como usar o <strong>Fastify</strong> na aplicação, o que é extremamente simples e transparante quando estamos usando <strong>NestJS</strong>.</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 desse projeto está disponível no <a href=\"https://github.com/guilhermegarcia86/cadastro-api\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Github</a></p>","fields":{"slug":"/nestjs-fastify-typeorm/"},"frontmatter":{"date":"01 de junho de 2021","description":"Utilizando Typescript no backend","title":"Criando uma aplicação REST com NestJS, Fastify e TypeORM","tags":["JavaScript","NestJS","Fastify","TypeORM","Typescript"],"author":"Guilherme Alves","image":{"id":"3a5dd2bf-d0ba-5290-adfd-41c0829292dc","publicURL":"/static/0828c1b91364814de45ddf61e48d43e0/capa-nest-fast-type.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAAC4jAAAuIwF4pT92AAABX0lEQVQ4y6VTQUrDQBTNFbxEzuG2azd6CMGNix5BcJFt6BGy8wDWjSAotdKmomCJaNJA26QmTcpkMvPMTIMmZRpqffD5ww/z/nv/TzTsAc75T66GgIZ9IUgUNe0/CgUBSwIwRsHTUDbQtl1QRfWbPMcRlqMnzIIAZPiotly7wJgMZRNRTBOQ8TOiOAZ9HTTPkLPfCbEVqZOWdUop3l4GcD8/QNJFg8JS1eq2D/+kDf+4jex9Um/G1uSEUGRZhrWpYimqWTGaQ1CuHkaYnl1ifHCI6ekFaH8EcteXwcJoU4ok1bZusERyfY/J0TmWVzfghIBNi61+xeCF3c3ZSst5nstZiJwkiSw6jgPbtrEIw2JQOfJl2vx8KtCiKEKn04FpmjAMA91uF7quo9VqYT6bl2bKjW95RjVCocz3fbiuC8/zZFiWhV6vp7SkUlUj3OmP+ANqW2alLZGF8s2Hvgu+AQiKPmpTyXcIAAAAAElFTkSuQmCC","aspectRatio":1.4096916299559472,"src":"/static/0828c1b91364814de45ddf61e48d43e0/0823f/capa-nest-fast-type.png","srcSet":"/static/0828c1b91364814de45ddf61e48d43e0/c67b7/capa-nest-fast-type.png 320w,\n/static/0828c1b91364814de45ddf61e48d43e0/d3930/capa-nest-fast-type.png 640w,\n/static/0828c1b91364814de45ddf61e48d43e0/0823f/capa-nest-fast-type.png 1280w,\n/static/0828c1b91364814de45ddf61e48d43e0/17523/capa-nest-fast-type.png 1747w","sizes":"(max-width: 1280px) 100vw, 1280px"}}}},"timeToRead":18}},"pageContext":{"slug":"/nestjs-fastify-typeorm/","previous":{"fields":{"slug":"/express-celebrate-joi/"},"frontmatter":{"title":"Validando endpoints com NodeJS","date":"27 abr, 2021"}},"next":{"fields":{"slug":"/kotlin-javalin-exposed-fuel/"},"frontmatter":{"title":"Criando uma API com Kotlin e Javalin","date":"14 jun, 2021"}}}},"staticQueryHashes":["63159454"]}