<?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: Pedro Ramos</title>
    <description>The latest articles on DEV Community by Pedro Ramos (@ramospedro1421).</description>
    <link>https://dev.to/ramospedro1421</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%2F1173101%2F91a88f83-4fb6-48bb-b23b-5f01c7f5217b.png</url>
      <title>DEV Community: Pedro Ramos</title>
      <link>https://dev.to/ramospedro1421</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ramospedro1421"/>
    <language>en</language>
    <item>
      <title>Parte 2 NodeWallet - Configurando as models iniciais e criando uma Autenticação com JWT</title>
      <dc:creator>Pedro Ramos</dc:creator>
      <pubDate>Wed, 11 Oct 2023 11:21:17 +0000</pubDate>
      <link>https://dev.to/ramospedro1421/parte-2-nodewallet-configurando-as-models-iniciais-e-criando-uma-autenticacao-com-jwt-50bm</link>
      <guid>https://dev.to/ramospedro1421/parte-2-nodewallet-configurando-as-models-iniciais-e-criando-uma-autenticacao-com-jwt-50bm</guid>
      <description>&lt;p&gt;Após a criação do projeto e as configurações inicias vamos, finalmente, partir para o desenvolvimento das funcionalidades. Como primeira funcionalidade, pensei na implementação do login (registro e autenticação) com JWT (Json Web Token) para uma maior segurança do projeto.&lt;/p&gt;

&lt;p&gt;Primeiro de tudo vamos configurar a migration Usuário, onde vão ser definidos os campos que vão ser criados na tabela.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;'use strict';

/** @type {import('sequelize-cli').Migration} */
module.exports = {
  async up (queryInterface, Sequelize) {
    await queryInterface.createTable('Users', {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER,
      },
      username: {
        type: Sequelize.STRING,
        allowNull: false,
      },
      email: {
        type: Sequelize.STRING,
        allowNull: false,
        unique: true
      },
      password: {
        type: Sequelize.STRING,
        allowNull: false,
      },
      createdAt: {
        allowNull: false,
        type: Sequelize.DATE,
      },
      updatedAt: {
        allowNull: false,
        type: Sequelize.DATE,
      }
    })
  },

  async down (queryInterface, Sequelize) {
    await queryInterface.dropTable('users');
  }
};

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

&lt;/div&gt;



&lt;p&gt;Aqui é onde os campos da entidade são criados dentro do banco, sendo necessário informar o tipo do campo, se ele pode ser nulo, se ele vai se autocompletar, se é um campo único e tambem se ele é uma chave primária (usada para se relacionar com outras tabelas).&lt;/p&gt;

&lt;p&gt;Com a migration criada, vamos partir para a criação da Model, onde vão ser definidos os tipos dos dados e também métodos para a alteração desses mesmos dados&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const { Model } = require('sequelize');
const bcrypt = require('bcrypt');

module.exports = (sequelize, DataTypes) =&amp;gt; {
    class User extends Model {
        static associate(models) {

        }
    }

    User.init(
        {
            username: DataTypes.STRING,
            email: DataTypes.STRING,
            password: DataTypes.STRING,
        },
        {
            sequelize,
            modelName: 'User',
            hooks: {
                beforeCreate: async(user) =&amp;gt; {
                    if(user.password) {
                        const salt = await bcrypt.genSalt(10);
                        user.password = await bcrypt.hash(user.password, salt);
                    }
                },
            },
        }
    );

    return User;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Essa é uma estrutura básica de uma Model, onde eu defino os tipos de dados que cada campo pode aceitar e tambem crio uma função que encripta a senha antes de criar o usuário.&lt;/p&gt;

&lt;p&gt;Logo depois da model, partimos para a criação do controller, parte que é responsável por receber e processar as requisições feitas através das rotas&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const { User } = require('../models');
const bcrypt = require('bcrypt');
const jwt = require('jsonwebtoken');

module.exports = {
    async register(req, res) {
        try {
            const { username, email, password } = req.body;
            const user = await User.create({username, email, password});
            res.status(201).json({user}); 
        } catch (error) {
            console.error(error);
            req.status(500).json({ error: `Internal Server Error` });
        }
    },

    async login(req, res) {
        try {

            const { email, password } = req.body;
            const user = await User.findOne({ where: {email} });

            if(!user) {
                return res.status(404).json({ error: `Invalid email or password` });
            }

            const isPasswordValid = await bcrypt.compare(password, user.password);

            if(!isPasswordValid) {
                return res.status(404).json({ error: `Invalid email or password` });
            }

            const payload = {
                user
            };

            const secretKey = 'yourSecretKey';

            const options = {
                expiresIn: '12h'
            };

            token = jwt.sign(payload, secretKey, options);

            res.status(200).json({ success: `Successful Login`, user: user, token: token });

        } catch (error) {

            console.error(error);
            res.status(500).json({ error: `Internal server error` });

        }
    },
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E antes de finalizar vamos a criação do arquivo de rotas, nesse projeto eu optei por separar as rotas em diferentes arquivos, como ainda estamos no começo do projeto por agora teremos apenas o arquivo &lt;code&gt;authRoutes.js&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const express = require('express');
const router = express.Router();

const UserController = require('../controllers/UserController');

router.post('/register', UserController.register);
router.post('/login', UserController.login);

module.exports = router;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora para finalizar, criamos o arquivo principal do projeto, resolvi chamá-lo de &lt;code&gt;index.js&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const express = require('express');
const app = express();
const PORT = process.env.PORT || 3000;

app.use(express.json());

app.use('/auth', require('./routes/authRoutes'));

app.listen(PORT, () =&amp;gt; {
    console.log(`Server is running on port ${PORT}`);
})
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Assim temos um login completamente funcional, que faz conexão com o banco de dados e tambem faz uso do JWT!&lt;/p&gt;

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

</description>
    </item>
    <item>
      <title>NodeWallet (projeto NodeJS de uma carteira virtual, usando Node+Express+Postgres)</title>
      <dc:creator>Pedro Ramos</dc:creator>
      <pubDate>Tue, 10 Oct 2023 18:04:09 +0000</pubDate>
      <link>https://dev.to/ramospedro1421/nodewallet-projeto-nodejs-de-uma-carteira-virtual-usando-nodeexpresspostgres-18hj</link>
      <guid>https://dev.to/ramospedro1421/nodewallet-projeto-nodejs-de-uma-carteira-virtual-usando-nodeexpresspostgres-18hj</guid>
      <description>&lt;p&gt;Após alguns meses afastado da programação, resolvi me dedicar aos estudos novamente, e agora a bola da vez é o NodeJS. Ferramenta na qual eu sempre tive interesse mas nunca coragem de começar a mexer (talvez era só preguiça mesmo). E a partir de agora vocês vão acompanhar minha trajetória de estudo dessa nova linguagem.&lt;/p&gt;

&lt;p&gt;Antes de decidir colocar a mão na massa eu comecei a fazer o curso da OneBitCode para desenvolvedores, porem como ja possuo alguma experiência na programação resolvi começar sozinho um projeto de uma Carteira virtual, onde será possivel anotar as suas entradas e saídas de dinheiro, assim, podendo ter um controle maior das finanças (essa é a ideia inicial do projeto, mais para frente quando essas funcionalidades estiverem bem definidas vou implementar alguns gráficos para ter algo mais visual sobre as transações feitas no mês).&lt;/p&gt;

&lt;p&gt;Agora vamos ao que interessa, para esse projeto decidir usar o Node com o Express e o Postgress no docker, ferramentas que ao meu ver vão lidar muito bem com a ideia proposta (node para o processamento dos dados no backend, express para as rotas e um banco de dados relacional, onde muitas informações possuem conexões umas com as outras).&lt;/p&gt;

&lt;p&gt;Comecei criando a pasta a pasta do projeto, e dentro dela rodei o comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm init -y 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;para iniciar um projeto node&lt;/p&gt;

&lt;p&gt;Logo que o package.json estava criado, reuni alguns pacotes externos nos quais eu vou necessitar durante a criação do projeto, e são eles:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Express&lt;/li&gt;
&lt;li&gt;Bcrypt&lt;/li&gt;
&lt;li&gt;JWT&lt;/li&gt;
&lt;li&gt;Sequelize&lt;/li&gt;
&lt;li&gt;Nodemon&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Assim que as todas as depêndencias foram instaladas com o npm, parti para a criação do banco de dados. O banco usado em questão é o PostgreSQL por ser um banco de dados relacional e de facil manutenção, porem estou fazendo uso do mesmo via Docker. Para criar um banco de dados PostgreSQL via docker você precisa seguir os seguintes passos&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ter o Docker instalado na sua máquina&lt;/li&gt;
&lt;li&gt;Criar a imagem com o comando:
&lt;code&gt;docker run --name meu-postgres -e POSTGRES_PASSWORD=minhasenha -p 5432:5432 -d postgres
&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Conectar-se com o banco pelo comando: &lt;code&gt;docker exec -it meu-postgres psql -U postgres
&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;E crie um banco de dados com o comando &lt;code&gt;CREATE DATABASE&lt;/code&gt; e depois insira as informações do passo &lt;strong&gt;2&lt;/strong&gt; em uma IDE (como o DBeaver) e seja feliz com seu banco.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Assim que seu projeto estiver iniciado e com o banco criado, rode o comando &lt;code&gt;npm sequelize init&lt;/code&gt; para o sequelize criar as estruturas de pastas necessárias.&lt;/p&gt;

&lt;p&gt;Agora que o projeto e o banco estão criados, é só partir para o desenvolvimento, e isso fica na parte 2 desse artigo!&lt;/p&gt;

&lt;p&gt;Até!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>node</category>
      <category>express</category>
      <category>postgres</category>
    </item>
  </channel>
</rss>
