<?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: Gabriel Valin</title>
    <description>The latest articles on DEV Community by Gabriel Valin (@gvt3ch).</description>
    <link>https://dev.to/gvt3ch</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%2F726609%2Fff362dc3-3f8d-4848-9c3f-d062fac1f88e.jpg</url>
      <title>DEV Community: Gabriel Valin</title>
      <link>https://dev.to/gvt3ch</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gvt3ch"/>
    <language>en</language>
    <item>
      <title>Why should you consider Fastify for your Node.JS app</title>
      <dc:creator>Gabriel Valin</dc:creator>
      <pubDate>Mon, 02 Jun 2025 18:02:39 +0000</pubDate>
      <link>https://dev.to/gvt3ch/why-should-you-consider-fastify-for-your-nodejs-app-436a</link>
      <guid>https://dev.to/gvt3ch/why-should-you-consider-fastify-for-your-nodejs-app-436a</guid>
      <description>&lt;p&gt;Nowadays most developers uses express by default to build a new Node.JS app. It's is popular, easy to use and even Nest.JS uses it behind the scenes.&lt;/p&gt;

&lt;p&gt;But if you take a look at the Fastify docs, you’ll see that it works quite differently from Express:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fastify uses fast-json-stringify by Matteo Collina with built-in functions based on schemas for serialize objects too fast&lt;/li&gt;
&lt;li&gt;Fastify uses a radix tree for routing - a compact and optimized tree built during server setup.&lt;/li&gt;
&lt;li&gt;It’s minimalist, with a strong focus on core performance&lt;/li&gt;
&lt;li&gt;Native validation using JSON Schema via Ajv&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Express working as well but for optimization...&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Express uses JSON.stringify for serialize objects&lt;/li&gt;
&lt;li&gt;Linear routing based on route definition&lt;/li&gt;
&lt;li&gt;Minimalist but depends on directly middlewares&lt;/li&gt;
&lt;li&gt;No native validation &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Below, you can see two files with simple implementations using Express and Fastify.I also ran a quick benchmark with Autocannon, and here are the results:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjks1krq96jruhnjl67oa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjks1krq96jruhnjl67oa.png" alt="Image description" width="800" height="161"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7ej2ona5kfiu4ngn3mej.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7ej2ona5kfiu4ngn3mej.png" alt="Image description" width="734" height="792"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Express might feel comfortable, but give Fastify a try at least once.&lt;/p&gt;

&lt;p&gt;Ref:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://fastify.dev/docs/v2.15.x/Documentation/Server/" rel="noopener noreferrer"&gt;https://fastify.dev/docs/v2.15.x/Documentation/Server/&lt;/a&gt;&lt;br&gt;
&lt;a href="https://ankitpandeycu.medium.com/unleashing-the-potential-of-radix-tree-35e6c5d3b49d" rel="noopener noreferrer"&gt;https://ankitpandeycu.medium.com/unleashing-the-potential-of-radix-tree-35e6c5d3b49d&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.npmjs.com/package/fast-json-stringify" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/fast-json-stringify&lt;/a&gt;&lt;br&gt;
&lt;a href="https://fastify.dev/benchmarks/" rel="noopener noreferrer"&gt;https://fastify.dev/benchmarks/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>node</category>
      <category>fastify</category>
      <category>express</category>
      <category>programming</category>
    </item>
    <item>
      <title>Mocking Interface with jest-mock-extended</title>
      <dc:creator>Gabriel Valin</dc:creator>
      <pubDate>Thu, 03 Nov 2022 15:27:16 +0000</pubDate>
      <link>https://dev.to/gvt3ch/mocking-interface-with-jest-mock-extended-15nj</link>
      <guid>https://dev.to/gvt3ch/mocking-interface-with-jest-mock-extended-15nj</guid>
      <description>&lt;h2&gt;
  
  
  Objetivo
&lt;/h2&gt;

&lt;p&gt;Se você está cansado de mockar classes concretas, criar classes ou funções para usar de mock, essas duas funções abaixo vão te ajudar de uma maneira bem inteligente e prática.&lt;/p&gt;

&lt;h2&gt;
  
  
  Situação
&lt;/h2&gt;

&lt;p&gt;Precisamos testar um serviço que vai nos retornar uma lista de usuários.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fluxo do sistema
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxs4rdpq9umcf63v2anxw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxs4rdpq9umcf63v2anxw.png" alt="flowsystem" width="800" height="313"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Testes
&lt;/h2&gt;

&lt;p&gt;Muitas das vezes, criamos algum tipo de módulo/objeto para mockar dependências que seguem um "contrato" que são injetadas em um tipo de serviço. Quando usamos o princípio de Interface Segregation podemos mockar diretamente a &lt;strong&gt;INTERFACE&lt;/strong&gt; usando duas funcionalidades do pacote &lt;em&gt;&lt;strong&gt;jest-mock-extended&lt;/strong&gt;&lt;/em&gt; sem se preocupar com as dependências externas (ex: Repositórios concretos)&lt;/p&gt;

&lt;h2&gt;
  
  
  Exemplo
&lt;/h2&gt;

&lt;p&gt;Aqui temos uma interface que um repositório deve seguir.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { UserDTO } from "../dtos/user";

export interface GetUsers {
    allUsers(): Promise&amp;lt;UserDTO[]&amp;gt;
}

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

&lt;/div&gt;



&lt;p&gt;E no nosso serviço vamos ter uma injeção de dependência seguindo essa interface (sem dizer quem é a classe concreta que representa isso, Inversão de Dependência).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { UserDTO } from "../dtos/user";
import { ServiceProtocol } from "../protocols/service";
import { GetUsers } from "../repos/get-users";

export default class GetAllUsersService implements ServiceProtocol&amp;lt;null, Promise&amp;lt;UserDTO[]&amp;gt;&amp;gt; {
    constructor (private readonly usersRepository: GetUsers) {}

    async perform(): Promise&amp;lt;UserDTO[]&amp;gt; {
        const all = await this.usersRepository.allUsers()
        return all
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Agora nos testes, a mágica =)
&lt;/h2&gt;

&lt;p&gt;Repare que na variável &lt;strong&gt;usersRepository&lt;/strong&gt; estamos utilizando o &lt;strong&gt;MockProxy&lt;/strong&gt; na &lt;strong&gt;interface&lt;/strong&gt; e não na classe concreta e entre os testes estamos falando para que a mesma seja mockada.&lt;/p&gt;

&lt;p&gt;Com isso, não se preocupamos com classe concreta de repositório, apenas com a camada do serviço que precisa ser testada.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import GetAllUsersService from "@/domain/services/get-all-users-service"
import { mock, MockProxy } from 'jest-mock-extended'
import { GetUsers } from "./repos/get-users"

describe('GetAllUsersService', () =&amp;gt; {
    let sut: GetAllUsersService
    let usersRepository: MockProxy&amp;lt;GetUsers&amp;gt;

    beforeAll(() =&amp;gt; {
       usersRepository = mock()
    })

    beforeEach(() =&amp;gt; {
        sut = new GetAllUsersService(usersRepository)
        usersRepository.allUsers.mockResolvedValue([
            {
                name: 'user 1',
                email: 'user 1',
                age: 'user 1',
                departament: 'user 1',
                created_at: new Date(),
                inative: false
            },
        ])
    })

    it('should call allUsers one time', async () =&amp;gt; {
        await sut.perform()

        expect(usersRepository.allUsers).toHaveBeenCalledTimes(1)
    })
})
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Valeu!&lt;/p&gt;

&lt;p&gt;Referências: &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.linkedin.com%2Fin%2Frmanguinho%2F" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.linkedin.com%2Fin%2Frmanguinho%2F" alt="Manguinho" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;CÓDIGO-FONTE: &lt;a href="https://github.com/Gabriel-Valin/clean-arch-express-based" rel="noopener noreferrer"&gt;https://github.com/Gabriel-Valin/clean-arch-express-based&lt;/a&gt;&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>node</category>
      <category>tdd</category>
      <category>tests</category>
    </item>
    <item>
      <title>Builder Pattern w/ Typescript</title>
      <dc:creator>Gabriel Valin</dc:creator>
      <pubDate>Tue, 01 Nov 2022 14:44:06 +0000</pubDate>
      <link>https://dev.to/gvt3ch/builder-pattern-w-typescript-2b95</link>
      <guid>https://dev.to/gvt3ch/builder-pattern-w-typescript-2b95</guid>
      <description>&lt;h2&gt;
  
  
  Ideia
&lt;/h2&gt;

&lt;p&gt;A ideia inicial do Builder Pattern é possibilidade de criar objetos complexos com a maior variação de configurações possíveis, uma alternativa ao pattern Factory Method.&lt;/p&gt;

&lt;h2&gt;
  
  
  Contexto
&lt;/h2&gt;

&lt;p&gt;Temos diversos departamentos em nossa empresa e vamos criar usuários e distribuí-los nos mesmos.&lt;/p&gt;

&lt;p&gt;Como podemos via códificação, criar uma maneira de centralizar essa criação e passar as devidas configurações para diversos usuários? &lt;strong&gt;Builder!!!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Criando tipos e nossa class User.&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export type UserInfo = {
    name: string
    age: number
    departament: string
    salary: number
}

export class User {
    name = ''
    age = 0
    departament = ''
    salary = 0

    create() {
        console.log({
            name: this.name,
            age: this.age,
            departament: this.departament,
            salary: this.salary
        })
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;_&lt;br&gt;
Criando o protocolo que a classe concreta do Builder deverá implementar._&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
import { User } from ".."

export interface UserBuilder {
    setName(name: string): this
    setAge(age: number): this
    setDepartament(departament: string): this
    setSalary(salary: number): this
    getUser(): User
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Criando nossa classe concreta de UserBuilder.&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { User } from ".."
import { UserBuilder } from "../protocols/user-builder-protocol"

export class ConcreteUserBuilder implements UserBuilder {
    user: User

    constructor() {
        this.user = new User()
    }

    setName(name: string): this {
        this.user.name =  name
        return this
    }

    setAge(age: number): this {
        this.user.age =  age
        return this
    }

    setDepartament(departament: string): this {
        this.user.departament =  departament
        return this
    }

    setSalary(salary: number): this {
        this.user.salary =  salary
        return this
    }

    getUser(): User {
        return this.user
    }
}

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

&lt;/div&gt;



&lt;p&gt;_&lt;br&gt;
Implementando a criação de novos usuários._&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
import { ConcreteUserBuilder } from "../builder/user-builder"

class EngineerUser {
    static buildUser() {
        return new ConcreteUserBuilder()
            .setName('Gabriel Valin')
            .setAge(23)
            .setDepartament('Engineering')
            .setSalary(99999999) //hahahaha :D
            .getUser() 
    }
}

class MarketingUser {
    static buildUser() {
        return new ConcreteUserBuilder()
            .setName('Thais Valin')
            .setAge(19)
            .setDepartament('Marketing')
            .setSalary(8888888) //hahahaha :D
            .getUser() 
    }
}

const newEngineer = EngineerUser.buildUser()
const newMarketing = MarketingUser.buildUser()

newMarketing.create()
newEngineer.create()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Resultado:&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  name: 'Thais Valin',
  age: 19,
  departament: 'Marketing',
  salary: 8888888
}
{
  name: 'Gabriel Valin',
  age: 23,
  departament: 'Engineering',
  salary: 99999999
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Está foi uma maneira simplificada de mostrar como utilizar o pattern Builder.&lt;/p&gt;

&lt;p&gt;Uma maneira legal de se pensar para entender esse pattern é imaginar a construção de uma casa, onde definimos numa classe principal (&lt;strong&gt;User&lt;/strong&gt;) que ela terá algumas propriedades (janelas, portas, quantidade de banheiros, quartos, etc..), após isso devemos falar para a construtora que a casa deverá ser construída mantendo o padrão de construção que foi passado (&lt;strong&gt;interface UserBuilder&lt;/strong&gt;), por final, a construtora irá criar e separar para os funcionários as funções de construção que ao final vão gerar uma casa pronta (&lt;strong&gt;ConcreteUserBuilder&lt;/strong&gt;).&lt;/p&gt;

&lt;p&gt;Com isso é possível que a construtora sempre crie casas complexas podendo definir suas propriedades sem muita dificuldade. (&lt;strong&gt;EngineerUser, MarketingUser&lt;/strong&gt;). :D&lt;/p&gt;

&lt;p&gt;Links para se aprofundar: &lt;a href="https://refactoring.guru/design-patterns/builder/typescript/example" rel="noopener noreferrer"&gt;https://refactoring.guru/design-patterns/builder/typescript/example&lt;/a&gt;&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>javascript</category>
      <category>codequality</category>
      <category>cleancode</category>
    </item>
    <item>
      <title>Node.JS and Cache with REDIS</title>
      <dc:creator>Gabriel Valin</dc:creator>
      <pubDate>Fri, 28 Oct 2022 14:23:51 +0000</pubDate>
      <link>https://dev.to/gvt3ch/nodejs-and-cache-with-redis-91o</link>
      <guid>https://dev.to/gvt3ch/nodejs-and-cache-with-redis-91o</guid>
      <description>&lt;p&gt;Primeiramente, o quê é cache?&lt;/p&gt;

&lt;p&gt;Segundo a querida Wikipedia, cache é:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Na área da computação, cache é um dispositivo de acesso rápido, interno a um sistema, que serve de intermediário entre um operador de um processo e o dispositivo de armazenamento ao qual esse operador acede.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Aqui nesse artigo iremos utilizar um simples servidor HTTP feito com Expressjs e duas rotas &lt;strong&gt;GET&lt;/strong&gt; para mostrar uma das dezenas de estratégias existentes para se lidar com cache.&lt;/p&gt;

&lt;p&gt;Clone o repositório para visualizar a estrutura por dentro e também contém a descrição para rodar o projeto: &lt;a href="https://github.com/Gabriel-Valin/api-cache-redis" rel="noopener noreferrer"&gt;https://github.com/Gabriel-Valin/api-cache-redis&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Contexto ficticío:
&lt;/h2&gt;

&lt;p&gt;Uma empresa tem 5 mil funcionários, todos cadastrados em um banco de dados; Precisamos disponibilizar um endpoint para que esses usuários possam ser consultados.&lt;/p&gt;

&lt;h2&gt;
  
  
  Execução:
&lt;/h2&gt;

&lt;p&gt;Começamos pensando que o processo de transferência de pacotes entre redes está entre uma das tarefas mais demoradas que um computador pode fazer, apesar de que para um humano isso seja "alienigenamente" rápido. Então como podemos otimizar a entrega desse pacotão com 5 mil funcionários? Resposta? &lt;strong&gt;CACHE!!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;cache.ts&lt;/strong&gt;&lt;/em&gt;: Configuração da conexão com Redis.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import IORedis from 'ioredis';

const redis = new IORedis({
    host: process.env.REDIS_HOST,
    port: 6379,
    password: process.env.REDIS_PASS
})


export default redis
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;&lt;strong&gt;list-service&lt;/strong&gt;&lt;/em&gt;: Listando usuários.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { getAllUsers } from "../repositories/find-all"
import redis from "./cache"
export const CACHE_KEY = 'users'

export const listAllUsersService = async () =&amp;gt; {
    const cachedUsers = await redis.get(CACHE_KEY)
    if (cachedUsers) {
        return JSON.parse(cachedUsers)
    }
    const users = getAllUsers()
    await redis.set(CACHE_KEY, JSON.stringify(users))
    return users
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;&lt;strong&gt;add-user&lt;/strong&gt;&lt;/em&gt;: Adicionando novo usuário a empresa.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import redis from "../services/cache";
import { CACHE_KEY } from "../services/list-service";
import { Response, Request } from "express";

export const addNewUser = async (req: Request, res: Response) =&amp;gt; {
    // here will create a new user
    // when user created we should cleanup cache 'cause the user list was updated

    await redis.del(CACHE_KEY)
    return res.status(200).json({ message: 'cache clean' })
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Estratégia:
&lt;/h2&gt;

&lt;p&gt;Temos uma lista bem grande para disponibilizar ao &lt;strong&gt;client&lt;/strong&gt;, então utilizamos a simples estratégia de após a primeira consulta no endpoint o conteúdo irá ficar "cached" e só invalidamos o cache assim que um novo usuário for cadastrado na empresa e assim o ciclo se repetirá. Com isso, a lista ficará sempre em cache, podendo reduzir o tempo de resposta em até mais de 50%.&lt;/p&gt;

&lt;h1&gt;
  
  
  Bônus:
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;Lembrando que existem vários sistemas de armazenamento em cache, esse foi apenas uma demonstração simples que acontece no mundo real onde precisamos "cachar" a entrega de conteúdo em um API, para mais informações, leia este artigo do Ed Rodrigues.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://edrodrigues.com.br/blog/estrategias-de-cache-tudo-o-que-voce-precisa-saber/" rel="noopener noreferrer"&gt;https://edrodrigues.com.br/blog/estrategias-de-cache-tudo-o-que-voce-precisa-saber/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>node</category>
      <category>redis</category>
      <category>javascript</category>
      <category>typescript</category>
    </item>
    <item>
      <title>HTTP - Verbs, HTTP codes &amp; Request Params</title>
      <dc:creator>Gabriel Valin</dc:creator>
      <pubDate>Mon, 18 Oct 2021 16:56:15 +0000</pubDate>
      <link>https://dev.to/gvt3ch/http-verbs-http-codes-request-params-3kc7</link>
      <guid>https://dev.to/gvt3ch/http-verbs-http-codes-request-params-3kc7</guid>
      <description>&lt;h2&gt;
  
  
  Verbs
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;GET - Reading infos&lt;/li&gt;
&lt;li&gt;POST - Create infos&lt;/li&gt;
&lt;li&gt;PUT - Update Infos&lt;/li&gt;
&lt;li&gt;PATCH - Update PARTIAL info (example: avatar from user)&lt;/li&gt;
&lt;li&gt;DELETE - Delete infos&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  HTTP - Status Code
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;1xx - Informative: processing..&lt;/li&gt;
&lt;li&gt;2xx - Confirmation:

&lt;ul&gt;
&lt;li&gt;200: Request success&lt;/li&gt;
&lt;li&gt;201: Created - AFTER REQUEST POST&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;3xx - Redirect:

&lt;ul&gt;
&lt;li&gt;301: Moved Permanently&lt;/li&gt;
&lt;li&gt;302: Moved&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;4xx - Client Error

&lt;ul&gt;
&lt;li&gt;400: Bad Request&lt;/li&gt;
&lt;li&gt;401: Unauthorized&lt;/li&gt;
&lt;li&gt;403: Forbidden&lt;/li&gt;
&lt;li&gt;404: Not Found&lt;/li&gt;
&lt;li&gt;422: Unprocessable Entity &lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;5xx - Server Error

&lt;ul&gt;
&lt;li&gt;500: Internal Server Error&lt;/li&gt;
&lt;li&gt;502: Bad Gateway&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Request Params
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Header Params: Token, authorization, cors&lt;/li&gt;
&lt;li&gt;Query Params: key,value,separator (page=28&amp;amp;)&lt;/li&gt;
&lt;li&gt;Route Params: /products/{id}&lt;/li&gt;
&lt;li&gt;Body Params: { name: 'john doe', last_name: 'stewie' }&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>http</category>
      <category>javascript</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>API Rest - a little bit..</title>
      <dc:creator>Gabriel Valin</dc:creator>
      <pubDate>Mon, 18 Oct 2021 16:44:08 +0000</pubDate>
      <link>https://dev.to/gvt3ch/api-rest-a-little-bit-55ad</link>
      <guid>https://dev.to/gvt3ch/api-rest-a-little-bit-55ad</guid>
      <description>&lt;h1&gt;
  
  
  Application Programming Interface
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Group of possible specifications about interactions at applications.&lt;/li&gt;
&lt;li&gt;Documentation (example: Swagger)&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  REST: Representation State Transfer
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Architecture Shape&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  6 rules for REST
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Client-Server&lt;/li&gt;
&lt;li&gt;Stateless&lt;/li&gt;
&lt;li&gt;Cache&lt;/li&gt;
&lt;li&gt;Uniform Interface

&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://address.com/users" rel="noopener noreferrer"&gt;http://address.com/users&lt;/a&gt; (example)&lt;/li&gt;
&lt;li&gt;JSON/XML ...&lt;/li&gt;
&lt;li&gt;Messages and Status coherent&lt;/li&gt;
&lt;li&gt;HATEOS

&lt;ul&gt;
&lt;li&gt;Return links inside request&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;Layers

&lt;ul&gt;
&lt;li&gt;Charger Balanced (example)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Code on Demand&lt;/li&gt;

&lt;/ul&gt;

</description>
      <category>http</category>
      <category>api</category>
      <category>webdev</category>
      <category>rest</category>
    </item>
    <item>
      <title>NodeJS - Fundamentals</title>
      <dc:creator>Gabriel Valin</dc:creator>
      <pubDate>Mon, 18 Oct 2021 16:35:15 +0000</pubDate>
      <link>https://dev.to/gvt3ch/nodejs-fundamentals-5e9k</link>
      <guid>https://dev.to/gvt3ch/nodejs-fundamentals-5e9k</guid>
      <description>&lt;h1&gt;
  
  
  NODEJS
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Open Source platform, allow the execution of javascript language in server-side.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Single Thread (v8) with Thread Pool (libuv c++) and group of modules.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Event Loop (Call Stack)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;NoN-Blocking I/O&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Self Modules (http, fs, dns, buffer, etc..)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  What's Event Loop?
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo79vj6c97ka5ieue8xx0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo79vj6c97ka5ieue8xx0.png" alt="luiztools" width="763" height="379"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;b&gt;the last one in is the first one out!&lt;b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>node</category>
      <category>javascript</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
