Treinamento OmniStack === ###### tags: `Estudos` --- ### Ambiente VsCode pluggins VsCode: - Dracula Official - Color Highlight - EditorConfig for VS Code - ESLint - Prettier - Code formatter - Rocketseat React Native - Rocketseat ReactJS - vscode-icons fonte **`fira code`** no ubuntu para instalar fonte, `sudo apt install fonts-firacode` ctrl+shift+p > preferences: open settings(json) ```jsonld= { "window.zoomLevel": -1, "explorer.confirmDragAndDrop": false, "workbench.colorTheme": "Dracula", "editor.fontFamily": "'fira code', 'monospace', monospace, 'Droid Sans Fallback'", "editor.fontLigatures": true, "editor.fontSize": 18, "editor.lineHeight": 24, "workbench.iconTheme": "vscode-icons", "editor.formatOnSave": true, "editor.rulers": [80, 120], "editor.tabSize": 2, "editor.renderLineHighlight": "gutter", "terminal.integrated.fontSize": 14, "emmet.syntaxProfiles": { "javascript": "jsx" }, "emmet.includeLanguages": { "javascript": "javascriptreact" }, "javascript.updateImportsOnFileMove.enabled": "never", "breadcrumbs.enabled": true, "editor.parameterHints.enabled": false, "prettier.eslintIntegration": true } ``` ### Ambiente Terminal Cli #### Oh My Sh instalação do [OhMySh](https://ohmyz.sh) `sh -c "$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"` #### Oh My Sh - Tema SpaceShio Instalação do tema ***spacheship*** `git clone https://github.com/denysdovhan/spaceship-prompt.git "$ZSH_CUSTOM/themes/spaceship-prompt"` `ln -s "$ZSH_CUSTOM/themes/spaceship-prompt/spaceship.zsh-theme" "$ZSH_CUSTOM/themes/spaceship.zsh-theme"` editar configs no ==~/.zshrc== ```bash # alterar parametro abaixo ZSH_THEME="spaceship" # incluír bloco ao final do arquivo SPACESHIP_PROMPT_ORDER=( user # Username section dir # Current directory section host # Hostname section git # Git section (git_branch + git_status) hg # Mercurial section (hg_branch + hg_status) exec_time # Execution time line_sep # Line break vi_mode # Vi-mode indicator jobs # Background jobs indicator exit_code # Exit code section char # Prompt character ) SPACESHIP_PROMPT_ADD_NEWLINE=false SPACESHIP_CHAR_SYMBOL="❯" SPACESHIP_CHAR_SUFFIX=" " ``` instalação do plugin zplugin `sh -c "$(curl -fsSL https://raw.githubusercontent.com/zdharma/zplugin/master/doc/mod-install.sh)"` ❯ sudo apt install libncurses5-dev libncursesw5-dev editar configs no ==~/.zshrc== ```bash # incluír bloco ao final do arquivo zplugin light zsh-users/zsh-autosuggestions zplugin light zsh-users/zsh-completions zplugin light zdharma/fast-syntax-highlighting ``` sudo snap install insomnia ### Ambiente Navegador - Chrome adicionado extensoes: - react developer tools - dracula devtools theme ### Ambiente ferramentas #### insomnia https://insomnia.rest sudo snap install insomnia #### DevDocs :fireworks: Podemos utilizar online: `https://devdocs.io/php/function.preg-match-all` :top: Podemos baixar e ter tudo offline tambem! ```bash= cd ~ git clone https://github.com/egoist/devdocs-desktop cd devdocs-desktop npm install npm run app ``` --- --- --- # Modulo 02 - Iniciando back-end do GoBarber ## Configurando estrutura criado pasta de desenvolvimento `/home/ice/Documentos/treinamentoRocketSeat/modulo02/gobarber` ```bash= nvm install 10.15.3 nvm use --delete-prefix v10.15.3 yarn init -y yarn add express ``` :::info [Commit da etapa](https://github.com/WoneyBranga/rocketseat-gobarber/commit/f5f793b0c1026a5d8827b2776aef7dd729c0b988) ::: --- ## Nodemon & Sucrase para utilizar padrao de importação de modulos atual, mesmo que temos no react, vamos add sucrase que nos gera esta funcionalidade. exemplo de alteracao: ```javascript= \\ Antes const { express } = require('express'); module.exports = new App().server; \\ Depois import express from "express"; export default new App().server; ``` ```bash= yarn add sucrase nodemon -D ``` uma vez com sucrase instalado, podemos chamar a nossa app com o comando: ```bash= yarn sucrase-node src/server.js ``` podemos ajustear nodemon para chamar sucrase, para isto vamos realizar 2 ajustes: no *package.json* ```jsonld= "scripts": { "dev": "nodemon src/server.js" }, ``` na raiz de nosso projeto add *nodemon.json* ```jsonld= { "execMap": { "js": "sucrase-node" } } ``` a partir deste momento podemos chamar nodemon+sucrase com comando simplificado ```bash= yarn dev ``` :::info [Commit da etapa](https://github.com/WoneyBranga/rocketseat-gobarber/commit/aa0299dcf8720f79af41733a164822d5d5f34a8d) ::: --- ## Conceitos do Docker apresentacao resumida do docker e suas funcionalidades: - containers, - imagens, - volumes, - Dockerfile ## Configurando Docker instalar docker na maquina segundo receitas do site oficial... ```bash curl -fsSL https://get.docker.com -o get-docker.sh ./docker.sh ``` criando primeiro container... ```bash= docker run \ -d \ --name database \ -e POSTGRES_PASSWORD=docker \ -p 5432:5432 \ postgres ``` :+1: Dica: ***[postBird](https://github.com/Paxa/postbird)*** como client para bancos postgres conectamos ao nosso container com user **postgres:docker** e criamos database **gobarber** que utilizaremos em nossa aplicacao. --- ## Sequelize & MVC o *[sequelize](http://docs.sequelizejs.com/)* é um ORM que nos permite codar de modo uniforme para interagir com bancos Postgres, MySQL, MariaDB, SQLite e Microsoft SQL Server ### migrations controle de versao para base de dados ** migrarion nao pode ser editada! ** migration interage sempre com uma unica tabela! **Seeds** para população de tabelas com dados fakes para testes... nunca deve ser utilizado em prod. --- ### MVC *un controler nao chama outro controller* Controller pode ter 5 metodos ex: ```javascript= class UserControlller { index() { } // listagem dos users show() { } // exibir um unico user store() { } // cadastrar user update() { } // aleterar user delete() { } // remover user } ``` --- ## ESLint, Prettier & EditorConfig utlizaremos padrao de codigo js da airbnb --- ### ESLINT ```bash= yarn add eslint -D yarn eslint --init yarn add eslint -D 3 - To check syntax, find problems, and enforce code style 1 - JavaScript modules (import/export) 3 - None of these 2 - Node 1 - Use a popular style guide 1 - Airbnb (https://github.com/airbnb/javascript) 1 - JavaScript # em nosso caso solicitou downgrade do eslint... vai! The style guide "airbnb" requires eslint@^4.19.1 || ^5.3.0. You are currently using eslint@6.0.1. yes Would you like to install them now with npm? Yes ``` por ter instalado com npm, gerou ==package-lock.json== vamos remover pois utilizamos yarn. por fim rodar `yarn` para fazer mapeamentos e atualizar nosso ==package.json== :::info no vscode precisamos do plugin eslint instalado para estas funcionalidades! ::: ctrl+shift+p "Preferences: Open Settings (JSON)" adicionado seguinte bloco: ```jsonld= "eslint.autoFixOnSave": true, "eslint.validate": [ { "language": "javascript", "autoFix": true }, { "language": "javascriptreact", "autoFix": true }, { "language": "typescript", "autoFix": true }, { "language": "typescriptreact", "autoFix": true } ], ``` no arquivo .eslintrc.js iremos realziar nossos ajustes ```javascript= module.exports = { env: { es6: true, node: true, }, extends: [ 'airbnb-base', ], globals: { Atomics: 'readonly', SharedArrayBuffer: 'readonly', }, parserOptions: { ecmaVersion: 2018, sourceType: 'module', }, rules: { "class-methods-use-this": "off", "no-param-reassign": "off", "camlcase": "off", "no-unused-vars": ["error", {"argsIgnorePattern": "next"}], }, }; ``` --- ### Prettier ```bash= yarn add prettier eslint-config-prettier eslint-plugin-prettier -D ``` no arquivo .eslintrc.js iremos realziar nossos ajustes ```javascript= module.exports = { env: { es6: true, node: true, }, extends: [ 'airbnb-base', 'prettier' ], plugins: ['prettier'], globals: { Atomics: 'readonly', SharedArrayBuffer: 'readonly', }, parserOptions: { ecmaVersion: 2018, sourceType: 'module', }, rules: { "prettier/prettier": "error", "class-methods-use-this": "off", "no-param-reassign": "off", "camlcase": "off", "no-unused-vars": ["error", {"argsIgnorePattern": "next"}], }, }; ``` criar na raiz do projeto .prettierrc ```jsonld= { "singleQuote": true, "trailingComma": "es5" } ``` :::info para corrigir a padronização de varios arquivos simultaneamente: `yarn eslint --fix src --ext .js` ::: :::info bug a entender... e ajuste... ```bash= nvm install 10.15.3 nvm use --delete-prefix v10.15.3 ``` ::: --- ### EditorConfig responsável por fazer com que os editores dos programadores utilizem mesmo padrao de configuração. no vlcode instalar **EditorConfig for VS Code** na raiz do projeto, dentro do vscode segundo botao do mouse e "generate .editorconfig" ```bash= root = true [*] indent_style = space indent_size = 2 charset = utf-8 trim_trailing_whitespace = true insert_final_newline = true ``` --- ## Configurando Sequilize ```bash= yarn add sequelize yarn add sequelize-cli -D ``` criar na raiz arquivo .sequelizerc e popular: ```javascript= const { resolve } = require('path'); module.exports = { config: resolve(__dirname,'src', 'config', 'database.js'), 'models-path': resolve(__dirname,'src', 'app', 'models'), 'migrations-path': resolve(__dirname,'src', 'database', 'migrations'), 'seeders-path': resolve(__dirname,'src', 'database', 'seeds'), }; ``` criar arquivo src/config/database.js e popular ```javascript= module.exports = { dialect: 'postgres', }; ``` instalar dependencias de acordo com base em uso http://docs.sequelizejs.com/manual/dialects.html: ```bash= yarn add pg pg-hstore ``` popular database.js ```javascript= module.exports = { dialect: 'postgres', host: 'localhost', username: 'postgres', password: 'docker', database: 'gobarber', define: { timestamps: true, // cria em cada tabela coluna com info de criacao e update de cada registro, interessante underscored: true, // forcando nome_nesse_padrao em vez de camelCase underscoredAll: true, // forcando nome_nesse_padrao em vez de camelCase }, }; ``` --- ## Migration de usuario ```bash= yarn sequelize migration:create --name=create-users ``` com este comando teremos em nosso diretorio src/database/migrations/ um novo arquivo, vamos populá-lo: ```javascript= module.exports = { up: (queryInterface, Sequelize) => { return queryInterface.createTable('users', { id: { type: Sequelize.INTEGER, allowNull: false, autoIncrement: true, primaryKey: true, }, name: { type: Sequelize.STRING, allowNull: false, }, email: { type: Sequelize.STRING, allowNull: false, unique: true, }, password_hash: { type: Sequelize.STRING, allowNull: false, }, provider: { type: Sequelize.BOOLEAN, defautValue: false, allowNull: false, }, created_at: { type: Sequelize.DATE, allowNull: false, }, updated_at: { type: Sequelize.DATE, allowNull: false, }, }); }, down: queryInterface => { return queryInterface.dropTable('users'); }, }; ``` para aplicar rodar: ```bash= yarn sequelize db:migrate yarn run v1.16.0 $ /home/ice/Documentos/treinamentoRocketSeat/modulo02/gobarber/node_modules/.bin/sequelize db:migrate Sequelize CLI [Node: 10.15.3, CLI: 5.5.0, ORM: 5.9.4] Loaded configuration file "src/config/database.js". == 20190709133832-create-users: migrating ======= == 20190709133832-create-users: migrated (0.041s) Done in 0.63s. ``` :::success Para aplicar nossa Migration... `yarn sequelize db:migrate` ::: :::warning para desfazer ultima migrarion: `yarn sequelize db:migrate:undo` ::: :::danger para desfazer todas as migrations: `yarn sequelize db:migrate:undo:all` ::: --- # Model de usuário app/models/User.js ```javascript= import Sequelize, { Model } from 'sequelize'; class User extends Model { static init(sequelize) { super.init( { name: Sequelize.STRING, email: Sequelize.STRING, password_hash: Sequelize.STRING, provider: Sequelize.BOOLEAN, }, { sequelize, } ); } } export default User; ``` database/index.js ```javascript= import Sequelize from 'sequelize'; import databaseConfig from '../config/database'; import User from '../app/models/User'; const models = [User]; class Database { constructor() { this.init(); } init() { this.connection = new Sequelize(databaseConfig); models.map(model => model.init(this.connection)); } } export default new Database(); ``` --- # Cadastro de Usuários gerado [commit](https://github.com/WoneyBranga/rocketseat-gobarber/commit/ea564744fc14f39db1a28f1d95c1dcbd1c01bb5b) com alterações.. # Gerando hash da senha adicionar modulo bcryptjs ```shell= yarn add bcryptjs ``` gerado [commit](https://github.com/WoneyBranga/rocketseat-gobarber/commit/e14799f4970e7ee8bdc4da1b51eb07c3b3099fa8) com alterações.. --- # Conceitos de JWT exemplo de token ```shell eyJhbGciOiJIUzI1NiIsCJ9.eyJpcY29tIiwiZXhwIjoJ1ZX0.yRQYnWzskCZUx7oWxAQK_ZXw [ Header ].[ payload ].[ assinatura ] ``` Estrutura do token JWT | Header | payload | assinatura | | -------- | -------- | -------- | | (tipo de token, algoritmo) | infos da nossa aplicacao(idUser, nomeUser...) | hash de validacao do token para evitar manipulação | --- # Autenticação JWT ```shell= yarn add jsonwebtoken ``` :::info :information_source: Para gerar hash no jwt, usar site [MD5OnLine](https://www.md5online.org/) ::: Para geração do token, utilizamos função sign do jwt sendo: ```javascript= jwt.sign([PAYLOAD], [HASH_UNICO_DA_APLIC], [TEMPO_DE_VIDA_TOKEN]); jwt.sign({ id }, 'c680d8ed019b9302b0fdc895b830d97a', {expiresIn: '7d' }); ``` --- # Middleware de autenticação gerado [commit ](https://github.com/WoneyBranga/rocketseat-gobarber/commit/04b705f3de1c6752eb20b348fd119b1d2a220266) com alterações... :::info :information_source: modulo **==promisify==** transforma funções formato callback em funções com tratamento async/await... ::: --- # Update Usuário gerado [commit ](https://github.com/WoneyBranga/rocketseat-gobarber/commit/6701dcaf17584ef1b0276c5b743c83cf7b0363e7) com alterações... --- # Validando dados de entrada ```shell= yarn add yup ``` gerado [commit ](https://github.com/WoneyBranga/rocketseat-gobarber/commit/7be7166d1a7a7dfdb575ae360258d05b8eae6ea6) com alterações... --- --- # Módulo 03 - Continuando API do GoBarber --- ## Configurando Multer Multer é uma dependencia para que possamos trabalhar com o envio de "multipart form data" em formulários html, este é o formato que utilizamos quando vamos realziar o UPLOAD de uma imagem. ```bash= yarn add multer mkdir ./tmp mkdir ./tmp/uploads ``` commit OK https://github.com/WoneyBranga/bootcamp-meetapp-backend/commit/2948c6f73614cafe723d7feb2628952cf4cb071c --- ## Avatar do usuário Vamos criar um migration para o files criando uma nova tabela... ```bash= yarn sequelize migration:create --name=create-files ``` populamos o arquivo criado com estrutura de nossa tabela: ```javascript= module.exports = { up: (queryInterface, Sequelize) => queryInterface.createTable('files', { id: { type: Sequelize.INTEGER, allowNull: false, autoIncrement: true, primaruyKey: true, }, name: { type: Sequelize.STRING, allowNull: false, }, path: { type: Sequelize.STRING, allowNull: false, unique: true, }, created_at: { type: Sequelize.DATE, allowNull: false, }, updated_at: { type: Sequelize.DATE, allowNull: false, }, }), down: queryInterface => queryInterface.dropTable('files'), }; ``` por fim carregamos migration... ```bash= yarn sequelize db:migrate ``` precisamos criar uma associação entre tabela users e file, para isso criaremos uma migration para adicionar campo na tabela users ```bash= yarn sequelize migration:create --name=add-avatar-field-to-users ``` Aqui teve uma viajada no commit, ações deste modulo/epata escritos nos 2 commits a seguir... --- ## Listagem de prestadores de serviço --- ## Migration e model de agendamento --- ## Agendamento de serviço --- ## Validações de agendamento ```bash= yarn add date-fns@next ``` --- ## Listando agendamentos do usuário --- ## Aplicando paginação --- ## Listando agenda do prestador --- ## Configurando MongoDB ```bash= docker run --name mongobarber -p 27017:27017 -d -t mongo ``` ```bash= yarn add mongoose ``` Cliente mongodb para debugs ***mongodb compass community*** --- ## Notificando novos agendamentos --- ## Listando notificações do usuário --- ## Marcar notificações como lidas --- ## Cancelamento de agendamento --- ## Configurando Nodemailer ```bash= yarn add nodemailer ``` Servidores de email - amazon ses - mailgun - sparkpost - Mandril(mailchimp) :::warning :warning: gmail tem limite e bloqueia! ::: --- mailtrap (apenas ambiente DEV) mailtrap.io ## Configurando templates de e-mail ```bash= yarn add express-handlebars nodemailer-express-handlebars ``` --- ## Configurando fila com Redis ```bash= docker run \ -dit \ --name redisbarber \ -p 6379:6379 \ redis:alpine ``` ```bash= yarn add bee-queue ``` --- ## Monitorando falhas na fila --- ## Listando horários disponíveis --- ## Campos virtuais no agendamento --- ## Tratamento de exceções sentry.io bugsnag.com maybe to php language => errbit.com cula.io por default o express nao captura erros nas chamadas async. Para resolver este problema ,`yarn add express-async-errors` `yarn add youch` --- ## Variáveis ambiente criar na raiz do projeto .env `yarn add dotenv` ---