<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Matheus Viana</title>
    <description>The latest articles on DEV Community by Matheus Viana (@moviandev).</description>
    <link>https://dev.to/moviandev</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F370066%2F30e28a83-d8f9-4b3f-a392-94875f5bd442.jpeg</url>
      <title>DEV Community: Matheus Viana</title>
      <link>https://dev.to/moviandev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/moviandev"/>
    <language>en</language>
    <item>
      <title>Migração NodeJS por .Net Core (Considerações)</title>
      <dc:creator>Matheus Viana</dc:creator>
      <pubDate>Mon, 25 Jan 2021 21:44:47 +0000</pubDate>
      <link>https://dev.to/moviandev/migracao-nodejs-por-net-core-consideracoes-375b</link>
      <guid>https://dev.to/moviandev/migracao-nodejs-por-net-core-consideracoes-375b</guid>
      <description>&lt;p&gt;Bom, em dezembro de 2020 fiz uma mudança em minha vida mudança qual inclui uma nova stack de trabalho. Eu sempre vi linguagens de programação como ferramentas onde todas seguem uma ideia parecida e você tem que aprender somente a sintaxe, ao sair de um ambiente 100% Javascript a primeira boa impressão é a organização que o framework .net traz para o c# e segundo a produtividade que é alcançada com o VisualStudio. Não faz muito tempo que estou nessa stack logo não tenho muito o que comentar. Mais para o meio do ano pretendo fazer outro post mais estruturado e contendo mais considerações.&lt;/p&gt;

&lt;p&gt;Nesse meio tempo para quem está disposto a seguir com .net core eu vou deixar alguns cursos que estou fazendo e já acabei:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.udemy.com/course/csharp-tutorial-for-beginners/"&gt;C# Basics for Beginners: Learn C# Fundamentals by Coding&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.udemy.com/course/csharp-intermediate-classes-interfaces-and-oop/"&gt;C# Intermediate: Classes, Interfaces and OOP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.udemy.com/course/csharp-advanced/"&gt;C# Advanced Topics: Prepare for Technical Interviews&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Cursos da Alura:

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://cursos.alura.com.br/formacao-c-sharp-orientacao-objetos"&gt;C# e orientação a objetos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cursos.alura.com.br/course/webapp-com-aspnet-core-2"&gt;ASP.NET Core parte 1: Um e-Commerce com MVC e EF Core&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cursos.alura.com.br/formacao-dotnet"&gt;ASP.NET Core REST APIs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>dotnet</category>
      <category>node</category>
      <category>learn</category>
    </item>
    <item>
      <title>Criar paginação para um App feito com NodeJS</title>
      <dc:creator>Matheus Viana</dc:creator>
      <pubDate>Sun, 03 May 2020 13:23:54 +0000</pubDate>
      <link>https://dev.to/moviandev/criar-paginacao-para-um-app-feito-com-nodejs-4o72</link>
      <guid>https://dev.to/moviandev/criar-paginacao-para-um-app-feito-com-nodejs-4o72</guid>
      <description>&lt;p&gt;Hey,&lt;/p&gt;

&lt;p&gt;Estou inspirado desde da semana passada em criar um blog pessoal para mim, onde vou falar de tecnologia e outras coisas, e como todo bom blog temos uma paginação para não termos uma bad UX, estou utilizando a seguinte stack no backend:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;NodeJS;&lt;/li&gt;
&lt;li&gt;Docker;&lt;/li&gt;
&lt;li&gt;MongoDB;&lt;/li&gt;
&lt;li&gt;Jest para testar meu código.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bom, para o Mongo estou usando o ODM Mongoose. Let's code.&lt;/p&gt;

&lt;p&gt;Paginação nada mais é do que pularmos uma porção de resultados e podendo configurar um limite para o tanto de resultados que serão pulados por página. Exemplo: &lt;code&gt;pagina=2&amp;amp;limite=10 página 1 = 0 ~ 10, página 2 = 11 ~ 20&lt;/code&gt;.&lt;br&gt;
Observando o exemplo podemos notar que estamos &lt;strong&gt;pulando&lt;/strong&gt; 10 resultados por página, agora vamos codar isso, eu vou pegar um techo de código do projeto que estou fazendo e vou explicar para vocês:&lt;br&gt;
&lt;code&gt;controller.js&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;exports.getAllPosts = async (req, res) =&amp;gt; {
  try {
    // Aqui pegamos pelos query params a página que queremos e como query params
    // vêm em string convertemos para números e caso seja vazio estamos settando para 1

    const pagina = +req.query.page || 1;

    // Aqui estamos pegando o limite informado pelos query params e 
    // convertendo para número caso seja vazio settamos para 10 

    const limite = +req.query.limit || 10;

    // Aqui rola um cálculo maroto, onde subtraimos para pegarmos a página anterior e multiplicamos pelo limite
    // para termos o salto desejado;

    const salto = (pagina - 1) * limite;

    // Aqui fazemos a pesquisa no nosso banco e realizamos a paginação.
    // Skip e Limit que estão no chaining do documento são metodos do Mongoose
    const post = await Post.find().skip(salto).limit(limite);

    res.status(200).json({
      status: 'sucesso',
      post,
    });
  } catch (err) {
    // ...error Handling
  }
};
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Ok, Matheus você nos mostrou como fazer páginação, mas tem como testar essa função que você fez? A resposta curta é sim! &lt;/p&gt;

&lt;p&gt;&lt;code&gt;controller.spec.js&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;describe('GET METHOD', () =&amp;gt; {
  it('Gets page 3 with the limit of 1 result', async () =&amp;gt; {
    const response = await request(app).get('/v1/posts?pagina=3&amp;amp;limite=1');

    expect(response.status).toBe(200);
    expect(response.body.post[0].status).toBe('public');
    expect(response.body.post[0].title).toBe('Teste teste tese teste');
    expect(response.body.post[0].body).toBe(
      'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.',
    );
    expect(response.body.post[0].metaDescription).toBe(
      'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliq',
    );
  });
});
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;E isso é tudo pessoal.&lt;/p&gt;

&lt;p&gt;Qualquer dúvida é só deixar nos comentários que responderei.&lt;/p&gt;

&lt;p&gt;Projeto: &lt;a href="https://github.com/moviandev/blog-backend"&gt;https://github.com/moviandev/blog-backend&lt;/a&gt;&lt;br&gt;
GitHub: &lt;a href="https://github.com/moviandev/"&gt;https://github.com/moviandev/&lt;/a&gt;&lt;br&gt;
LinkedIn: &lt;a href="https://www.linkedin.com/in/matheusviana/"&gt;https://www.linkedin.com/in/matheusviana/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Até a próxima!&lt;/p&gt;

</description>
      <category>node</category>
      <category>javascript</category>
      <category>mongodb</category>
      <category>testing</category>
    </item>
    <item>
      <title>Popular banco de dados MySQL para testes de integração.</title>
      <dc:creator>Matheus Viana</dc:creator>
      <pubDate>Sun, 03 May 2020 01:44:47 +0000</pubDate>
      <link>https://dev.to/moviandev/popular-banco-de-dados-mysql-para-testes-de-integracao-2c2e</link>
      <guid>https://dev.to/moviandev/popular-banco-de-dados-mysql-para-testes-de-integracao-2c2e</guid>
      <description>&lt;p&gt;Hey,&lt;/p&gt;

&lt;p&gt;Escrevo esse artigo para ajudar os outros devs que passaram por uma situação parecida com a que tive no projeto que estou atuando. Dockerizamos todos os nossos testes tanto os de unidade quanto os de integração (Sistêmicos), porém para realizarmos os testes de integração era necessário criarmos e popularmos o banco de dados, pesquisamos em vários fóruns e de todas as formas possiveis e nada foi encontrado, então resolvi fazer uma POC que solucionou nossos problemas e nela foi utilizado:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://nodejs.org/en/"&gt;NodeJS&lt;/a&gt;; &lt;/li&gt;
&lt;li&gt;Package do &lt;a href="https://www.npmjs.com/package/mysql"&gt;MySQL&lt;/a&gt;; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.docker.com/"&gt;Docker&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Antes de começarmos uns pontos a se atentar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tinha um arquivo com todas as Queries SQL para criação do banco e das tabelas, um inserindo dados mockados e outro para derrubar todas as tabelas.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Script em Javascript usando o Package MySQL
&lt;/h2&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const mysql = require('mysql');
const fs = require('fs');

// Aqui usei uma IIFE e uma função anonima, para nenhum metodo desse arquivo seja usado fora dele
(async function() {
  try {
    // Aqui realizamos a conexão com o banco de dados MySQL
    const mysqlConn = await mysql.createConnection({
      host: process.env.MYSQL_HOSTNAME,
      port: process.env.MYSQL_PORT,
      user: process.env.MYSQL_USER,
      password: process.env.MYSQL_PASSWORD,
      database: process.env.MYSQL_DATABASE,
      // Como os arquivos com as queries tinham várias declarações eu settei para true o mesmo 
      multipleStatements: true,
    });

    // Aqui connecto com mysql
    await mysqlConn.connect();

    // Esse primeiro método ele cria o banco de dados caso não exista e cria as tabelas do banco
    const createTablesNDB = async () =&amp;gt; {
      try {
        const tablesNDB = fs.readFileSync(`${__dirname}/database.sql`, 'utf8');
        await mysqlConn.query({ sql: tablesNDB.toString() });
        // Aqui settei um timeout por algum motivo o script estava pulando para o process.exit()
        setTimeout(() =&amp;gt; {
          process.exit();
        }, 1500);
      } catch (err) {
        console.log(err);
      }
    };

    // Nesse método é inserido os dados mockados nas tabelas criadas
    const inserirDados = async () =&amp;gt; {
      try {
        const data = fs.readFileSync(`${__dirname}/_data.sql`, 'utf8');
        await mysqlConn.query({ sql: data.toString() });
        setTimeout(() =&amp;gt; {
          process.exit();
        }, 1500);
      } catch (err) {
        console.log(err);
      }
    };

    // Nesse outro método é dropado todas as tabelas para não haver conflitos de FK, ao rodar o banco novamente e toda vez que forem executados os testes recriar o banco e as tabelas, para não viciarmos nossos testes
    const removerTabelas = async () =&amp;gt; {
      try {
        const dropTables = fs.readFileSync(
          `${__dirname}/_drop.sql`,
          'utf8',
        );
        await mysqlConn.query({ sql: dropTables.toString() });
        setTimeout(() =&amp;gt; {
          process.exit();
        }, 1500);
      } catch (err) {
        console.log(err);
      }
    };

    // Aqui criamos uma CLI simples onde possui 3 subcomandos
    // O process.argv ele é um array com os argumentos passados em um comando que no caso nosso comando seria $ node db.js --[create || insert || drop]
    if (process.argv[2] === '--create') {
      criarTabelaseBD();
    } else if (process.argv[2] === '--insert') {
      inserirDados();
    } else if (process.argv[2] === '--drop') {
      removerTabelas();
    }
  } catch (err) {
    // Aqui logamos todos os erros
    console.error('ERROR &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;', err, 'MESSAGE &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;', err.message);
  }
})();
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Com esse arquivo você pode criar um arquivo &lt;code&gt;.sh&lt;/code&gt; e passar a ordem dos comandos, exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#!/bin/bash

npm test &amp;amp;&amp;amp;
node ./db.js --drop &amp;amp;&amp;amp;
node ./db.js --create &amp;amp;&amp;amp;
node ./db.js --insert &amp;amp;&amp;amp;
npm run test:integration &amp;amp;&amp;amp; 
node ./db.js --drop

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;No seu Dockerfile de testes na linha de &lt;code&gt;CMD&lt;/code&gt; você pode rodar &lt;code&gt;["sh", "./tests.sh"]&lt;/code&gt; que o Docker fará toda mágica para você hehe, não esqueçam de settar o &lt;code&gt;env-file&lt;/code&gt; caso estiver usando &lt;code&gt;docker-compose&lt;/code&gt; e também de settar as variáveis de ambiente no seu arquivo de environment. &lt;/p&gt;

&lt;p&gt;E é isso pessoal, adendo esse código é uma proof of concepts.&lt;/p&gt;

&lt;p&gt;Qualquer dúvida é só deixar nos comentários que eu responderei. &lt;/p&gt;

&lt;p&gt;LinkedIn: &lt;a href="https://www.linkedin.com/in/matheusviana/"&gt;https://www.linkedin.com/in/matheusviana/&lt;/a&gt;&lt;br&gt;
GitHub: &lt;a href="https://github.com/moviandev"&gt;https://github.com/moviandev&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Até a próxima meus camaradas. &lt;/p&gt;

</description>
      <category>docker</category>
      <category>node</category>
      <category>javascript</category>
      <category>testing</category>
    </item>
    <item>
      <title>Integração continua com Travis-CI, NodeJS/NestJS</title>
      <dc:creator>Matheus Viana</dc:creator>
      <pubDate>Sat, 02 May 2020 02:23:06 +0000</pubDate>
      <link>https://dev.to/moviandev/integracao-continua-com-travis-ci-nodejs-nestjs-1j8h</link>
      <guid>https://dev.to/moviandev/integracao-continua-com-travis-ci-nodejs-nestjs-1j8h</guid>
      <description>&lt;p&gt;Hey, &lt;/p&gt;

&lt;p&gt;Em tempos de Coronavírus eu e o meu amigo e colega de trabalho &lt;a href="https://www.linkedin.com/in/rogeriosantos92/"&gt;Rogério dos Santos&lt;/a&gt; decidimos escrever uma série de artigos para mostrarmos um Backend feito em NodeJS desenvolvido com carinho e boas práticas.  &lt;/p&gt;

&lt;p&gt;Nesse artigo vamos falar um pouco da primeira versão do nosso CI utilizando Travis.&lt;/p&gt;

&lt;h4&gt;
  
  
  Motivação
&lt;/h4&gt;

&lt;p&gt;Sou um desenvolvedor de Software que tem uma paixão enorme pelo que faz. Como gostamos muito da comunidade Javascript/Typescript resolvemos fazer um projeto onde abordaremos boas práticas para produtos, são essas: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;S.O.L.I.D;&lt;/li&gt;
&lt;li&gt;TDD;&lt;/li&gt;
&lt;li&gt;DDD [Domain-driven design];&lt;/li&gt;
&lt;li&gt;Clean Code.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Agora que explicado a nossa motivação let's talk code.&lt;/p&gt;

&lt;p&gt;Actually, ainda não, antes vou falar pouco do Travis. Travis é um serviço de CI que automatiza os testes do seu código. &lt;/p&gt;

&lt;p&gt;Para usar o Travis é simples o que, a meu ver, é excelente. Vou fazer um passo-a-passo para ajudar vocês.&lt;/p&gt;

&lt;h3&gt;
  
  
  Passo 1 - Criando uma conta e instalando Travis no GitHub
&lt;/h3&gt;

&lt;p&gt;Crie uma conta no &lt;a href="https://travis-ci.org/"&gt;Travis&lt;/a&gt; e logo após a criação da sua conta você será redirecionado(a) para a página de getting started, lá você ativará o Travis no repositório desejado ou você pode instalar no seu GitHub inteiro.&lt;/p&gt;

&lt;h3&gt;
  
  
  Passo 2 - Configurando Travis para um App NodeJS
&lt;/h3&gt;

&lt;p&gt;Agora no repositório do projeto crie um arquivo com o nome &lt;code&gt;.travis.yml&lt;/code&gt;&lt;br&gt;
e pode ser aplicada as seguintes configurações:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;language: node_js
node_js:
# Versão do node que é utilizada no projeto.
  - 12

# Script que tem que ser executado antes do antes do script "principal"
before_script:
# Pode ser usado npm ou yarn, escolhemos usar yarn.
  - yarn install

# Script "principal"
script:
# Script de teste encontrado no package.json
  - yarn test
# Script dos testes end-to-end
  - yarn run test:e2e

# Caso necessário você pode settar configurações para serem excutadas depois do script "principal" com a configuração # after_script #
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  Passo 3 - Final Step
&lt;/h3&gt;

&lt;p&gt;Depois de tudo configurado é só dar &lt;code&gt;git push&lt;/code&gt; e ir para &lt;code&gt;https://travis-ci.com/github/usuario/repositorio&lt;/code&gt; para ver sua pipeline executando em toda sua perfeição. &lt;/p&gt;

&lt;p&gt;Projeto: &lt;a href="https://github.com/moviandev/geekLounge"&gt;https://github.com/moviandev/geekLounge&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E é isso pessoal, muito obrigado e até a próxima.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/moviandev/"&gt;GitHub&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.linkedin.com/in/matheusviana/"&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>typescript</category>
      <category>node</category>
      <category>testing</category>
    </item>
  </channel>
</rss>
