From 6e28b431c06c410501cff192f3128b7d42437477 Mon Sep 17 00:00:00 2001 From: ivy Date: Mon, 3 Apr 2023 14:59:34 -0500 Subject: [PATCH 01/43] trabajo necesario por mongoDB setup y spawn en Windows --- projects/04-burger-queen-api/config.js | 2 ++ .../04-burger-queen-api/e2e/globalSetup.js | 26 ++++++++++++++++--- .../jest-mongodb-config.js | 12 +++++++++ projects/04-burger-queen-api/package.json | 7 +++-- 4 files changed, 42 insertions(+), 5 deletions(-) create mode 100644 projects/04-burger-queen-api/jest-mongodb-config.js diff --git a/projects/04-burger-queen-api/config.js b/projects/04-burger-queen-api/config.js index 58b4b6e29..caf5177d6 100644 --- a/projects/04-burger-queen-api/config.js +++ b/projects/04-burger-queen-api/config.js @@ -3,3 +3,5 @@ exports.dbUrl = process.env.DB_URL || 'mongodb://localhost:27017/test'; exports.secret = process.env.JWT_SECRET || 'esta-es-la-api-burger-queen'; exports.adminEmail = process.env.ADMIN_EMAIL || 'admin@localhost'; exports.adminPassword = process.env.ADMIN_PASSWORD || 'changeme'; +exports.dbUrl = process.env.MONGO_URL || process.env.DB_URL || 'mongodb://localhost:27017/test'; +exports.dbName = process.env.DB_NAME || 'burgerqueen'; diff --git a/projects/04-burger-queen-api/e2e/globalSetup.js b/projects/04-burger-queen-api/e2e/globalSetup.js index 3db0e9971..bcfa4c31b 100644 --- a/projects/04-burger-queen-api/e2e/globalSetup.js +++ b/projects/04-burger-queen-api/e2e/globalSetup.js @@ -2,6 +2,12 @@ const path = require('path'); const { spawn } = require('child_process'); const kill = require('tree-kill'); +/* Descomentar eso para mongoDB +const globalSetup = require("@shelf/jest-mongodb/lib/setup"); +const MongodbMemoryServer = require('mongodb-memory-server').default; + +global.__MONGOD__ = MongodbMemoryServer; +*/ const config = require('../config'); const port = process.env.PORT || 8888; @@ -106,9 +112,23 @@ module.exports = () => new Promise((resolve, reject) => { } // TODO: Configurar DB de tests - - console.info('Staring local server...'); - const child = spawn('npm', ['start', process.env.PORT || 8888], { + + /* si usas mongoDB + globalSetup({rootDir: __dirname}).then(() => { + // console.log(global.__MONGOD__); + console.info('Starting local server...'); + const child = spawn("node", [ "index.js", process.env.PORT || 8888], + { + cwd: path.resolve(__dirname, "../"), + stdio: ["ignore", "pipe", "pipe"], + env: { PATH: process.env.PATH, MONGO_URL: process.env.MONGO_URL } + } + ); + }) + .catch((error) => console.log(error)); + */ + console.info('Starting local server...'); + const child = spawn(/^win/.test(process.platform) ? 'npm.cmd' : 'npm', ['start', process.env.PORT || 8888], { cwd: path.resolve(__dirname, '../'), stdio: ['ignore', 'pipe', 'pipe'], }); diff --git a/projects/04-burger-queen-api/jest-mongodb-config.js b/projects/04-burger-queen-api/jest-mongodb-config.js new file mode 100644 index 000000000..5a95a3c0c --- /dev/null +++ b/projects/04-burger-queen-api/jest-mongodb-config.js @@ -0,0 +1,12 @@ +module.exports = { + mongodbMemoryServerOptions: { + instance: { + dbName: 'burger-queen-api', + }, + binary: { + version: '4.0.3', + skipMD5: true, + }, + autoStart: false, + }, +}; diff --git a/projects/04-burger-queen-api/package.json b/projects/04-burger-queen-api/package.json index d9445fc17..dd0aea928 100644 --- a/projects/04-burger-queen-api/package.json +++ b/projects/04-burger-queen-api/package.json @@ -20,7 +20,8 @@ "bcrypt": "^5.0.1", "body-parser": "^1.19.0", "express": "^4.17.1", - "jsonwebtoken": "^8.5.1" + "jsonwebtoken": "^8.5.1", + "mongoose": "^6.8.3" }, "devDependencies": { "docdash": "^1.2.0", @@ -31,7 +32,9 @@ "jest": "^27.0.1", "jsdoc": "^3.6.6", "jsdoc-http-plugin": "^0.3.2", + "mongodb-memory-server": "^8.11.2", "node-fetch": "^3.1.0", + "@shelf/jest-mongodb": "^4.1.5", "tree-kill": "^1.2.2" } -} \ No newline at end of file +} From cc5b37ba99c99b37a91e34a94d2521247268bbf9 Mon Sep 17 00:00:00 2001 From: ivy Date: Thu, 20 Apr 2023 17:13:48 -0500 Subject: [PATCH 02/43] cambios a README --- projects/04-burger-queen-api/README.md | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/projects/04-burger-queen-api/README.md b/projects/04-burger-queen-api/README.md index d8443c913..052f77475 100644 --- a/projects/04-burger-queen-api/README.md +++ b/projects/04-burger-queen-api/README.md @@ -44,8 +44,8 @@ _endpoints_ (puntos de conexión o URLs) y nos piden completar la aplicación. Esto implica que tendremos que partir por leer la implementación existente, y familiarizarnos con el _stack_ elegido ([Node.js](https://nodejs.org/) y [Express](https://expressjs.com/)) y complementarlo con un motor de bases de -datos, el cual tu deberás elegir entre [MongoDB](https://www.mongodb.com/), -[PostgreSQL](https://www.postgresql.org/) y [MySQL](https://www.mysql.com/). +datos. El boilerplate viene con logica para usar con [MongoDB](https://www.mongodb.com/). +Pero puedes tambien elegir entre [PostgreSQL](https://www.postgresql.org/) y [MySQL](https://www.mysql.com/), sacando o comentando los partes que apoyan MongoDB. La clienta nos ha dado un [link a la documentación](https://app.swaggerhub.com/apis-docs/ssinuco/BurgerQueenAPI/2.0.0) que especifica el comportamiento esperado de la API que expondremos por @@ -205,19 +205,22 @@ Nuestra aplicación usa las siguientes variables de entorno: ### 5.3 Despliegue (Deployment) Nuestra clienta nos ha manifestado que su equipo de _devops_ está siempre con -muchas tareas, por por lo que nos pide como requerimiento que la aplicación esté +muchas tareas, por lo que nos pide como requerimiento que la aplicación esté configurada con `docker-compose` para que pueda ser desplegada sin dificultades en cualquier entorno. El _boilerplate_ ya cuenta con una configuración incial de `docker-compose` para la aplicación de node, tu tarea será extender esa configuración para incluir la -configuración de base de datos que hayas elegido. Ten en cuenta que como vas a -tener dos servidores corriendo sobre una misma configuración, deberás exponer -los servicios en diferentes puertos. +configuración de base de datos que hayas elegido (como MongoDB). +Ten en cuenta que como vas a tener dos servidores corriendo sobre una misma configuración, deberás exponer los servicios en diferentes puertos. -Para este proyecto te recomendamos usar `docker-compose` localmente (en tu -computadora) para ejecutar la aplicación junto con la base de datos -seleccionada. Por otro lado, con respecto al despliegue, no es obligatorio usar +No es obligatorio, pero para este proyecto te recomendamos usar `docker-compose` +localmente (en tu computadora) para ejecutar la aplicación junto con la base de datos +seleccionada. Si complica usar `docker` con tu sistema (estamos pensando +en Windows) para desarrollo local, puedes dejar `docker` +y levantar (correr) el base de datos y express server localmente. + +Por otro lado, con respecto al despliegue, tampoco es obligatorio usar `docker-compose`, puedes elegir el proveedor (o proveedores) que prefieras junto con el mecanismo de despligue y estrategia de alojamiento. Te recomendamos explorar las siguientes opciones: From 3eeac056755f658894c76d37c62223bd12553e89 Mon Sep 17 00:00:00 2001 From: ivy Date: Thu, 20 Apr 2023 17:17:33 -0500 Subject: [PATCH 03/43] ideas para adiciones GETTING_STARTED --- .../04-burger-queen-api/GETTING-STARTED.md | 24 +++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/projects/04-burger-queen-api/GETTING-STARTED.md b/projects/04-burger-queen-api/GETTING-STARTED.md index dc6b0dda2..0be662f0b 100644 --- a/projects/04-burger-queen-api/GETTING-STARTED.md +++ b/projects/04-burger-queen-api/GETTING-STARTED.md @@ -9,7 +9,7 @@ Para ello te recomendamos seguir los pasos a continuación: * [3. Configurar "servicio" de base de datos](#3-configurar-servicio-de-base-de-datos) * [4. Configurar conexión a BBDD en "servicio" node](#4-configurar-conexión-a-bbdd-en-servicio-node) * [5. Elegir módulo (cliente)](#5-elegir-módulo-cliente) -* [6. Iniciar, re-iniciar y parar los servicios con `docker-compose`](#6-iniciar-re-iniciar-y-parar-los-servicios-con-docker-compose) +* [6. Iniciar, re-iniciar y parar los servicios](#6-iniciar-re-iniciar-y-parar-los-servicios) * [7. Familiarizarte con admisitración de contenedores](#7-familiarizarte-con-admisitración-de-contenedores) * [8. Opcionalmente, instalar interfaz gráfica para admisitrar data](#8-opcionalmente-instalar-interfaz-gráfica-para-admisitrar-data) * [9. Definir esquemas](#9-definir-esquemas) @@ -23,12 +23,14 @@ Para ello te recomendamos seguir los pasos a continuación: La primera decisión que tenemos que tomar, antes de comenzar a programar, es elegir una base de datos. En este proyecto se sugieren 3 opciones: dos de ellas _relacionales_ y basadas en SQL, (PostgreSQL y MySQL), y otra _no relacional_ -(MongoDB). Las 3 son excelentes opciones. +(MongoDB). Las 3 son excelentes opciones. Estamos entregando el proyecto como +has elegido MongoDB, pero puedes editar el boilerplate pare trabajar con +otro base de datos. Algunos puntos a tener en cuenta: * MongoDB es la más _común_ (popular) a día de hoy en el ecosistema de - Node.js. + Node.js. Por eso estamos entregando el proyecto como fuera elegido. * Las bases de datos _relacionales_ normalmente requieren más diseño _a priori_ (definir tablas, columnas, relaciones, ...) mientras que las _no relacionales_ nos permiten ser más _flexibles_. @@ -47,6 +49,8 @@ Algunos puntos a tener en cuenta: ## 2. Instalar `docker` y `docker-compose` +Note: Si tienes sistema Windows y complica usar docker, salta partes 2, 3, y 4. + Independientemente de qué base datos elijas, en este proyecto vamos a ejecutar localmente (en nuestra computadora) el servidor de bases de datos usando _contenedores_ de Docker en vez de instalar el programa directamente en nuestra @@ -240,7 +244,15 @@ connection.query("SELECT 1 + 1 AS solution", (error, results) => { connection.end(); ``` -## 6. Iniciar, re-iniciar y parar los servicios con `docker-compose` +## 6. Iniciar, re-iniciar y parar los servicios + +Nota: Si no estas usando `docker` vas a levantar el servidor y instancia de +base de datos desde la linea comando o interfaz que has instalado con el base +de datos. + +TODO: ejemplos de levantar ? + +### con `docker-compose` Ahora que ya tenemos nuestra configuración de `docker-compose` lista, veamos cómo podemos _levantar_ la aplicación. Para eso usamos el comando @@ -493,3 +505,7 @@ remotas. Por ejemplo: ```sh REMOTE_URL=https://api.my-super-app.com npm run test:e2e ``` +### e2e con MongoDB + +TODO: habla de @shelf/jest-mongodb + mongodb-memory-server +y las configuraciones From 772d3dae1255b458695d67ed417dac8dc4c8ab1c Mon Sep 17 00:00:00 2001 From: ivy Date: Thu, 20 Apr 2023 17:17:56 -0500 Subject: [PATCH 04/43] comentando config y e2e tests mejor --- projects/04-burger-queen-api/config.js | 2 +- .../04-burger-queen-api/e2e/globalSetup.js | 39 ++++++++++--------- .../jest-mongodb-config.js | 5 ++- projects/04-burger-queen-api/package.json | 2 - 4 files changed, 26 insertions(+), 22 deletions(-) diff --git a/projects/04-burger-queen-api/config.js b/projects/04-burger-queen-api/config.js index caf5177d6..a545545d4 100644 --- a/projects/04-burger-queen-api/config.js +++ b/projects/04-burger-queen-api/config.js @@ -3,5 +3,5 @@ exports.dbUrl = process.env.DB_URL || 'mongodb://localhost:27017/test'; exports.secret = process.env.JWT_SECRET || 'esta-es-la-api-burger-queen'; exports.adminEmail = process.env.ADMIN_EMAIL || 'admin@localhost'; exports.adminPassword = process.env.ADMIN_PASSWORD || 'changeme'; +// la siguiente env vars son configurando con valores de MongoDB exports.dbUrl = process.env.MONGO_URL || process.env.DB_URL || 'mongodb://localhost:27017/test'; -exports.dbName = process.env.DB_NAME || 'burgerqueen'; diff --git a/projects/04-burger-queen-api/e2e/globalSetup.js b/projects/04-burger-queen-api/e2e/globalSetup.js index bcfa4c31b..4556fb15f 100644 --- a/projects/04-burger-queen-api/e2e/globalSetup.js +++ b/projects/04-burger-queen-api/e2e/globalSetup.js @@ -2,12 +2,13 @@ const path = require('path'); const { spawn } = require('child_process'); const kill = require('tree-kill'); -/* Descomentar eso para mongoDB +/* Para usar con MongoDB + @shelf/jest-mongodb, borrar si no estas usando */ const globalSetup = require("@shelf/jest-mongodb/lib/setup"); const MongodbMemoryServer = require('mongodb-memory-server').default; global.__MONGOD__ = MongodbMemoryServer; -*/ +/* end */ + const config = require('../config'); const port = process.env.PORT || 8888; @@ -111,23 +112,25 @@ module.exports = () => new Promise((resolve, reject) => { return resolve(); } - // TODO: Configurar DB de tests - - /* si usas mongoDB - globalSetup({rootDir: __dirname}).then(() => { - // console.log(global.__MONGOD__); - console.info('Starting local server...'); - const child = spawn("node", [ "index.js", process.env.PORT || 8888], - { - cwd: path.resolve(__dirname, "../"), - stdio: ["ignore", "pipe", "pipe"], - env: { PATH: process.env.PATH, MONGO_URL: process.env.MONGO_URL } - } - ); - }) - .catch((error) => console.log(error)); - */ + /* config de MongoDB */ + globalSetup({rootDir: __dirname}).then(() => { + // console.log(global.__MONGOD__); + console.info('Starting local server...'); + const child = spawn("node", [ "index.js", process.env.PORT || 8888], + { + cwd: path.resolve(__dirname, "../"), + stdio: ["ignore", "pipe", "pipe"], + env: { PATH: process.env.PATH, MONGO_URL: process.env.MONGO_URL } + } + ); + }) + .catch((error) => console.log(error)); + /* end */ + // sino usas MongoDB, borra de arriba y hay que + // TODO: Configurar DB de tests + console.info('Starting local server...'); + const child = spawn(/^win/.test(process.platform) ? 'npm.cmd' : 'npm', ['start', process.env.PORT || 8888], { cwd: path.resolve(__dirname, '../'), stdio: ['ignore', 'pipe', 'pipe'], diff --git a/projects/04-burger-queen-api/jest-mongodb-config.js b/projects/04-burger-queen-api/jest-mongodb-config.js index 5a95a3c0c..283bc5680 100644 --- a/projects/04-burger-queen-api/jest-mongodb-config.js +++ b/projects/04-burger-queen-api/jest-mongodb-config.js @@ -1,7 +1,10 @@ +// Para usar con MongoDB y jest-mongodb +// https://www.npmjs.com/package/@shelf/jest-mongodb + module.exports = { mongodbMemoryServerOptions: { instance: { - dbName: 'burger-queen-api', + dbName: 'jest', }, binary: { version: '4.0.3', diff --git a/projects/04-burger-queen-api/package.json b/projects/04-burger-queen-api/package.json index dd0aea928..06f23113c 100644 --- a/projects/04-burger-queen-api/package.json +++ b/projects/04-burger-queen-api/package.json @@ -20,8 +20,6 @@ "bcrypt": "^5.0.1", "body-parser": "^1.19.0", "express": "^4.17.1", - "jsonwebtoken": "^8.5.1", - "mongoose": "^6.8.3" }, "devDependencies": { "docdash": "^1.2.0", From 801a18cafda4be145be847a61aeb58eb86107595 Mon Sep 17 00:00:00 2001 From: ivy Date: Thu, 20 Apr 2023 18:34:31 -0500 Subject: [PATCH 05/43] mdlint fixes --- projects/04-burger-queen-api/GETTING-STARTED.md | 5 +++-- projects/04-burger-queen-api/README.md | 11 +++++++---- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/projects/04-burger-queen-api/GETTING-STARTED.md b/projects/04-burger-queen-api/GETTING-STARTED.md index 0be662f0b..c1f02e24d 100644 --- a/projects/04-burger-queen-api/GETTING-STARTED.md +++ b/projects/04-burger-queen-api/GETTING-STARTED.md @@ -244,13 +244,13 @@ connection.query("SELECT 1 + 1 AS solution", (error, results) => { connection.end(); ``` -## 6. Iniciar, re-iniciar y parar los servicios +## 6. Iniciar, re-iniciar y parar los servicios Nota: Si no estas usando `docker` vas a levantar el servidor y instancia de base de datos desde la linea comando o interfaz que has instalado con el base de datos. -TODO: ejemplos de levantar ? +TODO: ejemplos de levantar ? ### con `docker-compose` @@ -505,6 +505,7 @@ remotas. Por ejemplo: ```sh REMOTE_URL=https://api.my-super-app.com npm run test:e2e ``` + ### e2e con MongoDB TODO: habla de @shelf/jest-mongodb + mongodb-memory-server diff --git a/projects/04-burger-queen-api/README.md b/projects/04-burger-queen-api/README.md index 052f77475..77d0121cc 100644 --- a/projects/04-burger-queen-api/README.md +++ b/projects/04-burger-queen-api/README.md @@ -45,7 +45,9 @@ Esto implica que tendremos que partir por leer la implementación existente, y familiarizarnos con el _stack_ elegido ([Node.js](https://nodejs.org/) y [Express](https://expressjs.com/)) y complementarlo con un motor de bases de datos. El boilerplate viene con logica para usar con [MongoDB](https://www.mongodb.com/). -Pero puedes tambien elegir entre [PostgreSQL](https://www.postgresql.org/) y [MySQL](https://www.mysql.com/), sacando o comentando los partes que apoyan MongoDB. +Pero puedes tambien elegir entre [PostgreSQL](https://www.postgresql.org/) +y [MySQL](https://www.mysql.com/), sacando o comentando los partes +que apoyan MongoDB. La clienta nos ha dado un [link a la documentación](https://app.swaggerhub.com/apis-docs/ssinuco/BurgerQueenAPI/2.0.0) que especifica el comportamiento esperado de la API que expondremos por @@ -210,9 +212,10 @@ configurada con `docker-compose` para que pueda ser desplegada sin dificultades en cualquier entorno. El _boilerplate_ ya cuenta con una configuración incial de `docker-compose` para -la aplicación de node, tu tarea será extender esa configuración para incluir la -configuración de base de datos que hayas elegido (como MongoDB). -Ten en cuenta que como vas a tener dos servidores corriendo sobre una misma configuración, deberás exponer los servicios en diferentes puertos. +la aplicación de node, tu tarea será extender esa configuración para incluir +la configuración de base de datos que hayas elegido (como MongoDB). +Ten en cuenta que como vas a tener dos servidores corriendo sobre una misma +configuración, deberás exponer los servicios en diferentes puertos. No es obligatorio, pero para este proyecto te recomendamos usar `docker-compose` localmente (en tu computadora) para ejecutar la aplicación junto con la base de datos From 1eeef5613227e652f239fff30c8a37a2af6f135e Mon Sep 17 00:00:00 2001 From: ivy Date: Fri, 21 Apr 2023 13:42:21 -0500 Subject: [PATCH 06/43] separating docker and mongo guides --- .../GETTING-STARTED-DOCKER.md} | 25 +-- .../guides/GETTING-STARTED-MONGODB.md | 164 ++++++++++++++++++ 2 files changed, 168 insertions(+), 21 deletions(-) rename projects/04-burger-queen-api/{GETTING-STARTED.md => guides/GETTING-STARTED-DOCKER.md} (95%) create mode 100644 projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.md diff --git a/projects/04-burger-queen-api/GETTING-STARTED.md b/projects/04-burger-queen-api/guides/GETTING-STARTED-DOCKER.md similarity index 95% rename from projects/04-burger-queen-api/GETTING-STARTED.md rename to projects/04-burger-queen-api/guides/GETTING-STARTED-DOCKER.md index c1f02e24d..dc6b0dda2 100644 --- a/projects/04-burger-queen-api/GETTING-STARTED.md +++ b/projects/04-burger-queen-api/guides/GETTING-STARTED-DOCKER.md @@ -9,7 +9,7 @@ Para ello te recomendamos seguir los pasos a continuación: * [3. Configurar "servicio" de base de datos](#3-configurar-servicio-de-base-de-datos) * [4. Configurar conexión a BBDD en "servicio" node](#4-configurar-conexión-a-bbdd-en-servicio-node) * [5. Elegir módulo (cliente)](#5-elegir-módulo-cliente) -* [6. Iniciar, re-iniciar y parar los servicios](#6-iniciar-re-iniciar-y-parar-los-servicios) +* [6. Iniciar, re-iniciar y parar los servicios con `docker-compose`](#6-iniciar-re-iniciar-y-parar-los-servicios-con-docker-compose) * [7. Familiarizarte con admisitración de contenedores](#7-familiarizarte-con-admisitración-de-contenedores) * [8. Opcionalmente, instalar interfaz gráfica para admisitrar data](#8-opcionalmente-instalar-interfaz-gráfica-para-admisitrar-data) * [9. Definir esquemas](#9-definir-esquemas) @@ -23,14 +23,12 @@ Para ello te recomendamos seguir los pasos a continuación: La primera decisión que tenemos que tomar, antes de comenzar a programar, es elegir una base de datos. En este proyecto se sugieren 3 opciones: dos de ellas _relacionales_ y basadas en SQL, (PostgreSQL y MySQL), y otra _no relacional_ -(MongoDB). Las 3 son excelentes opciones. Estamos entregando el proyecto como -has elegido MongoDB, pero puedes editar el boilerplate pare trabajar con -otro base de datos. +(MongoDB). Las 3 son excelentes opciones. Algunos puntos a tener en cuenta: * MongoDB es la más _común_ (popular) a día de hoy en el ecosistema de - Node.js. Por eso estamos entregando el proyecto como fuera elegido. + Node.js. * Las bases de datos _relacionales_ normalmente requieren más diseño _a priori_ (definir tablas, columnas, relaciones, ...) mientras que las _no relacionales_ nos permiten ser más _flexibles_. @@ -49,8 +47,6 @@ Algunos puntos a tener en cuenta: ## 2. Instalar `docker` y `docker-compose` -Note: Si tienes sistema Windows y complica usar docker, salta partes 2, 3, y 4. - Independientemente de qué base datos elijas, en este proyecto vamos a ejecutar localmente (en nuestra computadora) el servidor de bases de datos usando _contenedores_ de Docker en vez de instalar el programa directamente en nuestra @@ -244,15 +240,7 @@ connection.query("SELECT 1 + 1 AS solution", (error, results) => { connection.end(); ``` -## 6. Iniciar, re-iniciar y parar los servicios - -Nota: Si no estas usando `docker` vas a levantar el servidor y instancia de -base de datos desde la linea comando o interfaz que has instalado con el base -de datos. - -TODO: ejemplos de levantar ? - -### con `docker-compose` +## 6. Iniciar, re-iniciar y parar los servicios con `docker-compose` Ahora que ya tenemos nuestra configuración de `docker-compose` lista, veamos cómo podemos _levantar_ la aplicación. Para eso usamos el comando @@ -505,8 +493,3 @@ remotas. Por ejemplo: ```sh REMOTE_URL=https://api.my-super-app.com npm run test:e2e ``` - -### e2e con MongoDB - -TODO: habla de @shelf/jest-mongodb + mongodb-memory-server -y las configuraciones diff --git a/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.md b/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.md new file mode 100644 index 000000000..b967bc343 --- /dev/null +++ b/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.md @@ -0,0 +1,164 @@ +# Primeros pasos con MongoDB + +MongoDB es un base de datos no-relacionado, y es la más _común_ (popular) +a día de hoy en el ecosistema de Node.js. + +Si vas a trabajar con MongoDB y Docker, mejor leer [**guía de _primeros pasos con Docker_**](./GETTING-STARTED-DOCKER.md) primero. Si vas a instalar MongoDB y desarollar el proyecto sin +Docker en este momento, seguir leyendo este guia. + +Una vez creado tu fork y clonado el repo en tu computadora, y haces `npm install` +para instalar las dependencias basicas, antes de poder +comenzar a codear, tenemos que crear nuestro _entorno de desarrollo_. +Para ello te recomendamos seguir los pasos a continuación: + +* [1. Instalar MongoDB](#1-instalar-mongodb-y-compass) +* [3. Configurar "servicio" de base de datos](#3-configurar-servicio-de-base-de-datos) +* [4. Configurar conexión a BBDD en "servicio" node](#4-configurar-conexión-a-bbdd-en-servicio-node) +* [5. Elegir módulo (cliente)](#5-elegir-módulo-cliente) +* [6. Iniciar, re-iniciar y parar los servicios con `docker-compose`](#6-iniciar-re-iniciar-y-parar-los-servicios-con-docker-compose) +* [7. Familiarizarte con admisitración de contenedores](#7-familiarizarte-con-admisitración-de-contenedores) +* [8. Opcionalmente, instalar interfaz gráfica para admisitrar data](#8-opcionalmente-instalar-interfaz-gráfica-para-admisitrar-data) +* [9. Definir esquemas](#9-definir-esquemas) +* [10. Definir estrategia de pruebas unitarias](#10-definir-estrategia-de-pruebas-unitarias) +* [11. Familiarizarte con las pruebas de integración (e2e)](#11-familiarizarte-con-las-pruebas-de-integración-e2e) + +*** + +## 1. Instalar MongoDB y Compass + +El sitio de MongoDB tiene tutorials como instalar el [Community Edition](https://www.mongodb.com/docs/compass/current/install/). +Elige tu plataforma (Windows, Mac, Ubuntu etc) y sigue [el tutorial](https://www.mongodb.com/docs/manual/installation/#mongodb-installation-tutorials). + +Con los tutorials, va a descargar y instalar MongoDB en tu sistema, con algunas +herramientas y comandos para usar en tu linea de comando. + +Tambien recomendamos que instales [Compass](https://www.mongodb.com/products/compass), que es +un GUI (Graphical User Interface) para interactuar con el base de datos. Puedes interactuar +con MongoDB sin Compass y solo en la linea de comando, pero un GUI puede ayudarte visualizar +y entender que esta en el db. Sigue [las +instrucciones de instalacion de Compass](https://www.mongodb.com/docs/compass/current/install/). + + +## 2. Levanta el base de datos y server + +Podemos decir este proyecto tiene dos "servicios", uno es el base de datos para almanecenar +los productos, usuarios, etc., y el otro es el server para exponer el API. + +Estes servicios tienen que estar corriendo, disponible, para este proyecto, el API, +puede funcionar. + +Para correr el server, es bien simple - con `npm start` va a ejecutar +[`index.js`](../index.js) que tiene logica basica de server con express. + +Para levantar el server, este depende en tu instalación y sistema. +Por ejemplo, en MacOS si instalaste con `homebrew`, puede usar +`brew services start mongodb-community@6.0` para levantarlo. O sin `homebrew`, +`mongod --config /usr/local/etc/mongod.conf --fork`. En Windows, hay que levantarlo +desde Services console. + +Revisa [la guia de instalacion de +](https://www.mongodb.com/docs/manual/tutorial/install-mongodb-on-os-x/#run-mongodb-community-edition), +[guia de instalacion de Windows](https://www.mongodb.com/docs/manual/tutorial/install-mongodb-on-windows/#run-mongodb-community-edition-as-a-windows-service), o tu instalación en particular, para +ejemplos en como levantarlo. + +## 5. Elegir módulo (cliente) + +Ahora que ya tenemos un servidor de bases de datos vamos a necesitar elegir un +módulo o librería diseñado para interactuar con nuestra base de datos desde +Node.js. Existen un montón de opciones, pero para este proyecto te recomendamos +elegir [Mongoose](https://mongoosejs.com/) (MongoDB), que es la más popular para MongoDB). + +Hay que instalar Mongoose como dependencia en este proyecto usando `npm`. + +El _boilerplate_ ya incluye un archivo `config.js` donde se leen las +variables de entorno, y entre ellas está `DB_URL`. Como vemos ese valor lo +estamos asignando en la propiedad `dbUrl` del módulo `config`. + +```js +// `config.js` +exports.dbUrl = process.env.DB_URL || "mongodb://localhost:27017/test"; +``` + +Ahora que ya sabemos dónde encontrar el _connection string_ (en el módulo +config), podemos proceder a establecer una conexión con la base de datos +usando el cliente elegido. + +Ejemplo de conexión usando [Mongoose](https://mongoosejs.com/) (MongoDB): + +```js +const mongoose = require("mongoose"); +const config = require("./config"); + +mongoose + .connect(config.dbUrl, { + useNewUrlParser: true, + useUnifiedTopology: true, + }) + .then(console.log) + .catch(console.error); +``` + +## 6. Definir esquemas + +Como parte del proceso de diseño de nuestra base de datos vamos a tener que +especificar los _esquemas_ de nuestros _modelos_ de datos. Con esto nos +referimos a que tenemos que _describir_ de alguna forma las colecciones o +tablas que vamos a usar y la _forma_ de los objetos o filas que vayamos a +guardar en esas colecciones. + +Si has elegido MongoDB y Mongoose, este último nos ofrece un mecanismo para +describir esos [_modelos_](https://mongoosejs.com/docs/models.html) y +[_esquemas_](https://mongoosejs.com/docs/guide.html) de datos en JavaScript. + +## 7. Definir estrategia de pruebas unitarias + +Además de las pruebas `e2e` que ya incluye el _boilerplate_ del proyecto, se +espera que puedas también usar pruebas _unitarias_ para el desarrollo de los +diferentes _endpoints_ o _rutas_ así como otros módulos internos que decidas +desarrollar. + +Para hacer pruebas unitarias de _rutas_ de Express, te recomendamos explorar la +librería [`supertest`](https://www.npmjs.com/package/supertest), que puedes usar +en combinación con `jest`. + +Otro punto a tener en cuenta en las pruebas unitarias, es cómo _mockear_ la base +de datos. Algunas bases de datos ofrecen herramientas (como +[`mongodb-memory-server`](https://github.com/nodkz/mongodb-memory-server)) que +nos permiten usar una base de datos en memoria y así evitar hacer _mocks_ per +se, pero por lo general querremos considerar cómo abstraer la interacción +con la base de datos para facilitar _mocks_ que nos permitan concentrarnos en +la lógica de las rutas. + +## 8. Familiarizarte con las pruebas de integración (e2e) + +El _boilerplate_ de este proyecto ya incluye pruebas `e2e` (end-to-end) o de +_integración_, que se encargan de probar nuestra aplicación en conjunto, +através de la interfaz HTTP. A diferencia de las pruebas unitarias, en vez +de importar o requerir un módulo y probar una función de forma aislada, lo que +vamos a hacer es arrancar toda la aplicación, y probarla tal como se usaría en +el mundo real, para ello la aplicación de prueba necesitará una base de datos y +escuchar en un puerto de red. + +Para correr pruebas e2e sobre instancia local podemos usar: + +```sh +npm run test:e2e +``` + +Esto levanta la aplicación con `npm start` y corre los tests contra la URL de +esta instancia (por defecto `http://127.0.0.1:8080`). Esto asume que la base de +datos está disponible. + +Los pruebas e2e depende en codigo de (`globalSetup.js`)[../e2e/globalSetup.js] que `jest` +sabe correr primero antes de los tests. En este paso de setup, hay que levantar un +mock db (como hemos hablado de [`mongodb-memory-server`](https://github.com/nodkz/mongodb-memory-server)) +y hacer que jest se conecta a este mock db. + +Para este configuracion - hay que instalar `mongodb-memory-server` y un preset (`jest-mongodb`)[https://www.npmjs.com/package/@shelf/jest-mongodb]. + +El patrón de setup no es tan directo y documentado, porque `jest-mongodb` tambien usa su propio `globalSetup` +y los dos no juegan bien en conjunto. Hemos agregado este codigo para configurar los e2e tests +y `globalSetup` en un patch (`git diff`) que puedes aplicar manualmente (copy/pega) o automatica con +`git apply ./mongoDB-e2e.patch`. + +TODO: necesitamos crear un user de authenticacion? From 683640e2f48f52ba07dacc4629d523a91bb90bb9 Mon Sep 17 00:00:00 2001 From: ivy Date: Fri, 21 Apr 2023 13:43:01 -0500 Subject: [PATCH 07/43] remove mongo deps from package.json --- projects/04-burger-queen-api/package.json | 2 -- 1 file changed, 2 deletions(-) diff --git a/projects/04-burger-queen-api/package.json b/projects/04-burger-queen-api/package.json index 06f23113c..004baf44f 100644 --- a/projects/04-burger-queen-api/package.json +++ b/projects/04-burger-queen-api/package.json @@ -30,9 +30,7 @@ "jest": "^27.0.1", "jsdoc": "^3.6.6", "jsdoc-http-plugin": "^0.3.2", - "mongodb-memory-server": "^8.11.2", "node-fetch": "^3.1.0", - "@shelf/jest-mongodb": "^4.1.5", "tree-kill": "^1.2.2" } } From f3541139c051e3e705ab74500c3e49108cd07fcf Mon Sep 17 00:00:00 2001 From: ivy Date: Fri, 21 Apr 2023 13:49:06 -0500 Subject: [PATCH 08/43] clean mongoDB references de proyecto --- projects/04-burger-queen-api/config.js | 2 -- .../04-burger-queen-api/e2e/globalSetup.js | 22 ------------------- .../04-burger-queen-api/e2e/jest.config.js | 3 --- .../jest-mongodb-config.js | 15 ------------- 4 files changed, 42 deletions(-) delete mode 100644 projects/04-burger-queen-api/e2e/jest.config.js delete mode 100644 projects/04-burger-queen-api/jest-mongodb-config.js diff --git a/projects/04-burger-queen-api/config.js b/projects/04-burger-queen-api/config.js index a545545d4..58b4b6e29 100644 --- a/projects/04-burger-queen-api/config.js +++ b/projects/04-burger-queen-api/config.js @@ -3,5 +3,3 @@ exports.dbUrl = process.env.DB_URL || 'mongodb://localhost:27017/test'; exports.secret = process.env.JWT_SECRET || 'esta-es-la-api-burger-queen'; exports.adminEmail = process.env.ADMIN_EMAIL || 'admin@localhost'; exports.adminPassword = process.env.ADMIN_PASSWORD || 'changeme'; -// la siguiente env vars son configurando con valores de MongoDB -exports.dbUrl = process.env.MONGO_URL || process.env.DB_URL || 'mongodb://localhost:27017/test'; diff --git a/projects/04-burger-queen-api/e2e/globalSetup.js b/projects/04-burger-queen-api/e2e/globalSetup.js index 4556fb15f..93e9b5636 100644 --- a/projects/04-burger-queen-api/e2e/globalSetup.js +++ b/projects/04-burger-queen-api/e2e/globalSetup.js @@ -2,13 +2,6 @@ const path = require('path'); const { spawn } = require('child_process'); const kill = require('tree-kill'); -/* Para usar con MongoDB + @shelf/jest-mongodb, borrar si no estas usando */ -const globalSetup = require("@shelf/jest-mongodb/lib/setup"); -const MongodbMemoryServer = require('mongodb-memory-server').default; - -global.__MONGOD__ = MongodbMemoryServer; -/* end */ - const config = require('../config'); const port = process.env.PORT || 8888; @@ -112,21 +105,6 @@ module.exports = () => new Promise((resolve, reject) => { return resolve(); } - /* config de MongoDB */ - globalSetup({rootDir: __dirname}).then(() => { - // console.log(global.__MONGOD__); - console.info('Starting local server...'); - const child = spawn("node", [ "index.js", process.env.PORT || 8888], - { - cwd: path.resolve(__dirname, "../"), - stdio: ["ignore", "pipe", "pipe"], - env: { PATH: process.env.PATH, MONGO_URL: process.env.MONGO_URL } - } - ); - }) - .catch((error) => console.log(error)); - /* end */ - // sino usas MongoDB, borra de arriba y hay que // TODO: Configurar DB de tests console.info('Starting local server...'); diff --git a/projects/04-burger-queen-api/e2e/jest.config.js b/projects/04-burger-queen-api/e2e/jest.config.js deleted file mode 100644 index 38d8cb351..000000000 --- a/projects/04-burger-queen-api/e2e/jest.config.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - preset: '@shelf/jest-mongodb', -}; diff --git a/projects/04-burger-queen-api/jest-mongodb-config.js b/projects/04-burger-queen-api/jest-mongodb-config.js deleted file mode 100644 index 283bc5680..000000000 --- a/projects/04-burger-queen-api/jest-mongodb-config.js +++ /dev/null @@ -1,15 +0,0 @@ -// Para usar con MongoDB y jest-mongodb -// https://www.npmjs.com/package/@shelf/jest-mongodb - -module.exports = { - mongodbMemoryServerOptions: { - instance: { - dbName: 'jest', - }, - binary: { - version: '4.0.3', - skipMD5: true, - }, - autoStart: false, - }, -}; From c63ac2cc48932ede9004723ac4a40b4417684c38 Mon Sep 17 00:00:00 2001 From: ivy Date: Fri, 21 Apr 2023 14:00:15 -0500 Subject: [PATCH 09/43] patch for Mongo --- mongoDB-e2e.patch | 75 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 mongoDB-e2e.patch diff --git a/mongoDB-e2e.patch b/mongoDB-e2e.patch new file mode 100644 index 000000000..ff35a16bb --- /dev/null +++ b/mongoDB-e2e.patch @@ -0,0 +1,75 @@ +diff --git a/projects/04-burger-queen-api/config.js b/projects/04-burger-queen-api/config.js +index 58b4b6e2..a545545d 100644 +--- a/projects/04-burger-queen-api/config.js ++++ b/projects/04-burger-queen-api/config.js +@@ -3,3 +3,5 @@ exports.dbUrl = process.env.DB_URL || 'mongodb://localhost:27017/test'; + exports.secret = process.env.JWT_SECRET || 'esta-es-la-api-burger-queen'; + exports.adminEmail = process.env.ADMIN_EMAIL || 'admin@localhost'; + exports.adminPassword = process.env.ADMIN_PASSWORD || 'changeme'; ++// la siguiente env vars son configurando con valores de MongoDB ++exports.dbUrl = process.env.MONGO_URL || process.env.DB_URL || 'mongodb://localhost:27017/test'; +diff --git a/projects/04-burger-queen-api/e2e/globalSetup.js b/projects/04-burger-queen-api/e2e/globalSetup.js +index 93e9b563..d82c7e01 100644 +--- a/projects/04-burger-queen-api/e2e/globalSetup.js ++++ b/projects/04-burger-queen-api/e2e/globalSetup.js +@@ -2,6 +2,11 @@ const path = require('path'); + const { spawn } = require('child_process'); + const kill = require('tree-kill'); + ++const globalSetup = require("@shelf/jest-mongodb/lib/setup"); ++const MongodbMemoryServer = require('mongodb-memory-server').default; ++ ++global.__MONGOD__ = MongodbMemoryServer; ++ + const config = require('../config'); + + const port = process.env.PORT || 8888; +@@ -105,7 +110,17 @@ module.exports = () => new Promise((resolve, reject) => { + return resolve(); + } + +- // TODO: Configurar DB de tests ++ globalSetup({rootDir: __dirname}).then(() => { ++ console.info('Starting local server...'); ++ spawn("node", [ "index.js", process.env.PORT || 8888], ++ { ++ cwd: path.resolve(__dirname, "../"), ++ stdio: ["ignore", "pipe", "pipe"], ++ env: { PATH: process.env.PATH, MONGO_URL: process.env.MONGO_URL } ++ } ++ ); ++ }) ++ .catch((error) => console.log(error)); + + console.info('Starting local server...'); + +diff --git a/projects/04-burger-queen-api/e2e/jest.config.js b/projects/04-burger-queen-api/e2e/jest.config.js +new file mode 100644 +index 00000000..38d8cb35 +--- /dev/null ++++ b/projects/04-burger-queen-api/e2e/jest.config.js +@@ -0,0 +1,3 @@ ++module.exports = { ++ preset: '@shelf/jest-mongodb', ++}; +diff --git a/projects/04-burger-queen-api/jest-mongodb-config.js b/projects/04-burger-queen-api/jest-mongodb-config.js +new file mode 100644 +index 00000000..283bc568 +--- /dev/null ++++ b/projects/04-burger-queen-api/jest-mongodb-config.js +@@ -0,0 +1,15 @@ ++// Para usar con MongoDB y jest-mongodb ++// https://www.npmjs.com/package/@shelf/jest-mongodb ++ ++module.exports = { ++ mongodbMemoryServerOptions: { ++ instance: { ++ dbName: 'jest', ++ }, ++ binary: { ++ version: '4.0.3', ++ skipMD5: true, ++ }, ++ autoStart: false, ++ }, ++}; From 9da33ec12b5554df649eaf8888c2a6bb3f5a8143 Mon Sep 17 00:00:00 2001 From: Ivy Feraco Date: Fri, 21 Apr 2023 14:07:57 -0500 Subject: [PATCH 10/43] Update projects/04-burger-queen-api/README.md --- projects/04-burger-queen-api/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/04-burger-queen-api/README.md b/projects/04-burger-queen-api/README.md index 77d0121cc..e80536850 100644 --- a/projects/04-burger-queen-api/README.md +++ b/projects/04-burger-queen-api/README.md @@ -219,7 +219,7 @@ configuración, deberás exponer los servicios en diferentes puertos. No es obligatorio, pero para este proyecto te recomendamos usar `docker-compose` localmente (en tu computadora) para ejecutar la aplicación junto con la base de datos -seleccionada. Si complica usar `docker` con tu sistema (estamos pensando +seleccionada. Si complica usar `docker` con tu sistema (a veces es costoso y lento en Windows) para desarrollo local, puedes dejar `docker` y levantar (correr) el base de datos y express server localmente. From 945b216c7da0e2a200edf42fb37e4bdaddead477 Mon Sep 17 00:00:00 2001 From: ivy Date: Fri, 21 Apr 2023 14:08:29 -0500 Subject: [PATCH 11/43] cambios al readme y guia --- projects/04-burger-queen-api/README.md | 7 +++---- .../04-burger-queen-api/guides/GETTING-STARTED-MONGODB.md | 4 ++-- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/projects/04-burger-queen-api/README.md b/projects/04-burger-queen-api/README.md index 77d0121cc..77c912ef7 100644 --- a/projects/04-burger-queen-api/README.md +++ b/projects/04-burger-queen-api/README.md @@ -44,10 +44,9 @@ _endpoints_ (puntos de conexión o URLs) y nos piden completar la aplicación. Esto implica que tendremos que partir por leer la implementación existente, y familiarizarnos con el _stack_ elegido ([Node.js](https://nodejs.org/) y [Express](https://expressjs.com/)) y complementarlo con un motor de bases de -datos. El boilerplate viene con logica para usar con [MongoDB](https://www.mongodb.com/). -Pero puedes tambien elegir entre [PostgreSQL](https://www.postgresql.org/) -y [MySQL](https://www.mysql.com/), sacando o comentando los partes -que apoyan MongoDB. +datos. Recomendamos el uso de [MongoDB](https://www.mongodb.com/), +pero puedes también elegir entre [PostgreSQL](https://www.postgresql.org/) +y [MySQL](https://www.mysql.com/). La clienta nos ha dado un [link a la documentación](https://app.swaggerhub.com/apis-docs/ssinuco/BurgerQueenAPI/2.0.0) que especifica el comportamiento esperado de la API que expondremos por diff --git a/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.md b/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.md index b967bc343..355882518 100644 --- a/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.md +++ b/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.md @@ -154,11 +154,11 @@ sabe correr primero antes de los tests. En este paso de setup, hay que levantar mock db (como hemos hablado de [`mongodb-memory-server`](https://github.com/nodkz/mongodb-memory-server)) y hacer que jest se conecta a este mock db. -Para este configuracion - hay que instalar `mongodb-memory-server` y un preset (`jest-mongodb`)[https://www.npmjs.com/package/@shelf/jest-mongodb]. +Para este configuracion - hay que instalar `mongodb-memory-server` y un preset (`jest-mongodb`)[https://github.com/shelfio/jest-mongodb]. El patrón de setup no es tan directo y documentado, porque `jest-mongodb` tambien usa su propio `globalSetup` y los dos no juegan bien en conjunto. Hemos agregado este codigo para configurar los e2e tests -y `globalSetup` en un patch (`git diff`) que puedes aplicar manualmente (copy/pega) o automatica con +y `globalSetup` en un patch (`usando git diff`) que puedes aplicar automaticamente con `git apply ./mongoDB-e2e.patch`. TODO: necesitamos crear un user de authenticacion? From abe4552f61a39761f5345438863c756c314426ea Mon Sep 17 00:00:00 2001 From: ivy Date: Fri, 21 Apr 2023 14:38:01 -0500 Subject: [PATCH 12/43] mdlint fixes --- .../guides/GETTING-STARTED-MONGODB.md | 58 ++++++++++--------- 1 file changed, 31 insertions(+), 27 deletions(-) diff --git a/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.md b/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.md index 355882518..e116be290 100644 --- a/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.md +++ b/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.md @@ -3,7 +3,9 @@ MongoDB es un base de datos no-relacionado, y es la más _común_ (popular) a día de hoy en el ecosistema de Node.js. -Si vas a trabajar con MongoDB y Docker, mejor leer [**guía de _primeros pasos con Docker_**](./GETTING-STARTED-DOCKER.md) primero. Si vas a instalar MongoDB y desarollar el proyecto sin +Si vas a trabajar con MongoDB y Docker, mejor leer +[**la guía de _primeros pasos con Docker_**](./GETTING-STARTED-DOCKER.md) +primero. Si vas a instalar MongoDB y desarollar el proyecto sin Docker en este momento, seguir leyendo este guia. Una vez creado tu fork y clonado el repo en tu computadora, y haces `npm install` @@ -29,44 +31,44 @@ Para ello te recomendamos seguir los pasos a continuación: El sitio de MongoDB tiene tutorials como instalar el [Community Edition](https://www.mongodb.com/docs/compass/current/install/). Elige tu plataforma (Windows, Mac, Ubuntu etc) y sigue [el tutorial](https://www.mongodb.com/docs/manual/installation/#mongodb-installation-tutorials). -Con los tutorials, va a descargar y instalar MongoDB en tu sistema, con algunas -herramientas y comandos para usar en tu linea de comando. +Con los tutorials, va a descargar y instalar MongoDB en tu sistema, +con algunas herramientas y comandos para usar en la linea de comando. -Tambien recomendamos que instales [Compass](https://www.mongodb.com/products/compass), que es -un GUI (Graphical User Interface) para interactuar con el base de datos. Puedes interactuar -con MongoDB sin Compass y solo en la linea de comando, pero un GUI puede ayudarte visualizar -y entender que esta en el db. Sigue [las +Tambien recomendamos que instales [Compass](https://www.mongodb.com/products/compass), +que es un GUI (Graphical User Interface) para interactuar con el base de datos. +Puedes interactuar con MongoDB sin Compass y solo en la linea de comando, +pero un GUI puede ayudarte visualizar y entender que esta en el db. Sigue [las instrucciones de instalacion de Compass](https://www.mongodb.com/docs/compass/current/install/). - ## 2. Levanta el base de datos y server -Podemos decir este proyecto tiene dos "servicios", uno es el base de datos para almanecenar -los productos, usuarios, etc., y el otro es el server para exponer el API. +Podemos decir este proyecto tiene dos "servicios", uno es el base de datos para +almanecenar los productos, usuarios, etc., y el otro es el server para exponer +el API. -Estes servicios tienen que estar corriendo, disponible, para este proyecto, el API, -puede funcionar. +Estes servicios tienen que estar corriendo, disponible, para este proyecto, +el API, puede funcionar. -Para correr el server, es bien simple - con `npm start` va a ejecutar +Para correr el server, es bien simple - con `npm start` va a ejecutar [`index.js`](../index.js) que tiene logica basica de server con express. -Para levantar el server, este depende en tu instalación y sistema. -Por ejemplo, en MacOS si instalaste con `homebrew`, puede usar +Para levantar el server, este depende en tu instalación y sistema. +Por ejemplo, en MacOS si instalaste con `homebrew`, puede usar `brew services start mongodb-community@6.0` para levantarlo. O sin `homebrew`, -`mongod --config /usr/local/etc/mongod.conf --fork`. En Windows, hay que levantarlo -desde Services console. +`mongod --config /usr/local/etc/mongod.conf --fork`. En Windows, hay que +levantarlo desde Services console. Revisa [la guia de instalacion de -](https://www.mongodb.com/docs/manual/tutorial/install-mongodb-on-os-x/#run-mongodb-community-edition), -[guia de instalacion de Windows](https://www.mongodb.com/docs/manual/tutorial/install-mongodb-on-windows/#run-mongodb-community-edition-as-a-windows-service), o tu instalación en particular, para -ejemplos en como levantarlo. +](https://www.mongodb.com/docs/manual/tutorial/install-mongodb-on-os-x/#run-mongodb-community-edition), +[guia de instalacion de Windows](https://www.mongodb.com/docs/manual/tutorial/install-mongodb-on-windows/#run-mongodb-community-edition-as-a-windows-service), +o tu instalación en particular, para ejemplos en como levantarlo. ## 5. Elegir módulo (cliente) Ahora que ya tenemos un servidor de bases de datos vamos a necesitar elegir un módulo o librería diseñado para interactuar con nuestra base de datos desde Node.js. Existen un montón de opciones, pero para este proyecto te recomendamos -elegir [Mongoose](https://mongoosejs.com/) (MongoDB), que es la más popular para MongoDB). +elegir [Mongoose](https://mongoosejs.com/) (que es la más popular para MongoDB). Hay que instalar Mongoose como dependencia en este proyecto usando `npm`. @@ -149,16 +151,18 @@ Esto levanta la aplicación con `npm start` y corre los tests contra la URL de esta instancia (por defecto `http://127.0.0.1:8080`). Esto asume que la base de datos está disponible. -Los pruebas e2e depende en codigo de (`globalSetup.js`)[../e2e/globalSetup.js] que `jest` -sabe correr primero antes de los tests. En este paso de setup, hay que levantar un -mock db (como hemos hablado de [`mongodb-memory-server`](https://github.com/nodkz/mongodb-memory-server)) +Los pruebas e2e depende en codigo de (`globalSetup.js`)[../e2e/globalSetup.js] +que `jest` sabe correr primero antes de los tests. +En este paso de setup, hay que levantar un mock db (como hemos hablado de +[`mongodb-memory-server`](https://github.com/nodkz/mongodb-memory-server)) y hacer que jest se conecta a este mock db. Para este configuracion - hay que instalar `mongodb-memory-server` y un preset (`jest-mongodb`)[https://github.com/shelfio/jest-mongodb]. -El patrón de setup no es tan directo y documentado, porque `jest-mongodb` tambien usa su propio `globalSetup` -y los dos no juegan bien en conjunto. Hemos agregado este codigo para configurar los e2e tests -y `globalSetup` en un patch (`usando git diff`) que puedes aplicar automaticamente con +El patrón de setup no es tan directo y documentado, porque `jest-mongodb` +tambien usa su propio `globalSetup` y los dos no juegan bien en conjunto. +Hemos agregado este codigo para configurar los e2e tests y `globalSetup` +en un patch (`usando git diff`) que puedes aplicar automaticamente con `git apply ./mongoDB-e2e.patch`. TODO: necesitamos crear un user de authenticacion? From c728593f5dc92bdc01e6cb80a90f794775df85db Mon Sep 17 00:00:00 2001 From: ivy Date: Fri, 21 Apr 2023 14:41:05 -0500 Subject: [PATCH 13/43] readd jsonwebtoken dep --- projects/04-burger-queen-api/package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/projects/04-burger-queen-api/package.json b/projects/04-burger-queen-api/package.json index 004baf44f..d9445fc17 100644 --- a/projects/04-burger-queen-api/package.json +++ b/projects/04-burger-queen-api/package.json @@ -20,6 +20,7 @@ "bcrypt": "^5.0.1", "body-parser": "^1.19.0", "express": "^4.17.1", + "jsonwebtoken": "^8.5.1" }, "devDependencies": { "docdash": "^1.2.0", @@ -33,4 +34,4 @@ "node-fetch": "^3.1.0", "tree-kill": "^1.2.2" } -} +} \ No newline at end of file From 98c0bcb353fb93907c3e702e862e2b9e47c7bf9c Mon Sep 17 00:00:00 2001 From: ivy Date: Fri, 21 Apr 2023 14:48:25 -0500 Subject: [PATCH 14/43] remove ws from patch --- mongoDB-e2e.patch | 75 ----------------------------------------------- 1 file changed, 75 deletions(-) diff --git a/mongoDB-e2e.patch b/mongoDB-e2e.patch index ff35a16bb..e69de29bb 100644 --- a/mongoDB-e2e.patch +++ b/mongoDB-e2e.patch @@ -1,75 +0,0 @@ -diff --git a/projects/04-burger-queen-api/config.js b/projects/04-burger-queen-api/config.js -index 58b4b6e2..a545545d 100644 ---- a/projects/04-burger-queen-api/config.js -+++ b/projects/04-burger-queen-api/config.js -@@ -3,3 +3,5 @@ exports.dbUrl = process.env.DB_URL || 'mongodb://localhost:27017/test'; - exports.secret = process.env.JWT_SECRET || 'esta-es-la-api-burger-queen'; - exports.adminEmail = process.env.ADMIN_EMAIL || 'admin@localhost'; - exports.adminPassword = process.env.ADMIN_PASSWORD || 'changeme'; -+// la siguiente env vars son configurando con valores de MongoDB -+exports.dbUrl = process.env.MONGO_URL || process.env.DB_URL || 'mongodb://localhost:27017/test'; -diff --git a/projects/04-burger-queen-api/e2e/globalSetup.js b/projects/04-burger-queen-api/e2e/globalSetup.js -index 93e9b563..d82c7e01 100644 ---- a/projects/04-burger-queen-api/e2e/globalSetup.js -+++ b/projects/04-burger-queen-api/e2e/globalSetup.js -@@ -2,6 +2,11 @@ const path = require('path'); - const { spawn } = require('child_process'); - const kill = require('tree-kill'); - -+const globalSetup = require("@shelf/jest-mongodb/lib/setup"); -+const MongodbMemoryServer = require('mongodb-memory-server').default; -+ -+global.__MONGOD__ = MongodbMemoryServer; -+ - const config = require('../config'); - - const port = process.env.PORT || 8888; -@@ -105,7 +110,17 @@ module.exports = () => new Promise((resolve, reject) => { - return resolve(); - } - -- // TODO: Configurar DB de tests -+ globalSetup({rootDir: __dirname}).then(() => { -+ console.info('Starting local server...'); -+ spawn("node", [ "index.js", process.env.PORT || 8888], -+ { -+ cwd: path.resolve(__dirname, "../"), -+ stdio: ["ignore", "pipe", "pipe"], -+ env: { PATH: process.env.PATH, MONGO_URL: process.env.MONGO_URL } -+ } -+ ); -+ }) -+ .catch((error) => console.log(error)); - - console.info('Starting local server...'); - -diff --git a/projects/04-burger-queen-api/e2e/jest.config.js b/projects/04-burger-queen-api/e2e/jest.config.js -new file mode 100644 -index 00000000..38d8cb35 ---- /dev/null -+++ b/projects/04-burger-queen-api/e2e/jest.config.js -@@ -0,0 +1,3 @@ -+module.exports = { -+ preset: '@shelf/jest-mongodb', -+}; -diff --git a/projects/04-burger-queen-api/jest-mongodb-config.js b/projects/04-burger-queen-api/jest-mongodb-config.js -new file mode 100644 -index 00000000..283bc568 ---- /dev/null -+++ b/projects/04-burger-queen-api/jest-mongodb-config.js -@@ -0,0 +1,15 @@ -+// Para usar con MongoDB y jest-mongodb -+// https://www.npmjs.com/package/@shelf/jest-mongodb -+ -+module.exports = { -+ mongodbMemoryServerOptions: { -+ instance: { -+ dbName: 'jest', -+ }, -+ binary: { -+ version: '4.0.3', -+ skipMD5: true, -+ }, -+ autoStart: false, -+ }, -+}; From c6b01ab3aa93cae35b3fab815f075553816f510d Mon Sep 17 00:00:00 2001 From: ivy Date: Fri, 21 Apr 2023 14:53:45 -0500 Subject: [PATCH 15/43] patch in the wrong place --- mongoDB-e2e.patch | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 mongoDB-e2e.patch diff --git a/mongoDB-e2e.patch b/mongoDB-e2e.patch deleted file mode 100644 index e69de29bb..000000000 From 065010d9f36d1af45114344474ab2c140601c109 Mon Sep 17 00:00:00 2001 From: ivy Date: Fri, 21 Apr 2023 15:08:51 -0500 Subject: [PATCH 16/43] patch mongoDB created from project not from bootcamp --- .../04-burger-queen-api/mongoDB-e2e.patch | 74 +++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 projects/04-burger-queen-api/mongoDB-e2e.patch diff --git a/projects/04-burger-queen-api/mongoDB-e2e.patch b/projects/04-burger-queen-api/mongoDB-e2e.patch new file mode 100644 index 000000000..844c68c77 --- /dev/null +++ b/projects/04-burger-queen-api/mongoDB-e2e.patch @@ -0,0 +1,74 @@ +diff --git a/config.js b/config.js +index 58b4b6e..f7d4787 100644 +--- a/config.js ++++ b/config.js +@@ -3,3 +3,4 @@ exports.dbUrl = process.env.DB_URL || 'mongodb://localhost:27017/test'; + exports.secret = process.env.JWT_SECRET || 'esta-es-la-api-burger-queen'; + exports.adminEmail = process.env.ADMIN_EMAIL || 'admin@localhost'; + exports.adminPassword = process.env.ADMIN_PASSWORD || 'changeme'; ++exports.dbUrl = process.env.MONGO_URL || process.env.DB_URL || 'mongodb://localhost:27017/test'; +diff --git a/e2e/globalSetup.js b/e2e/globalSetup.js +index 93e9b56..536d9dd 100644 +--- a/e2e/globalSetup.js ++++ b/e2e/globalSetup.js +@@ -2,6 +2,11 @@ const path = require('path'); + const { spawn } = require('child_process'); + const kill = require('tree-kill'); + ++const globalSetup = require("@shelf/jest-mongodb/lib/setup"); ++const MongodbMemoryServer = require('mongodb-memory-server').default; ++ ++global.__MONGOD__ = MongodbMemoryServer; ++ + const config = require('../config'); + + const port = process.env.PORT || 8888; +@@ -105,7 +110,17 @@ module.exports = () => new Promise((resolve, reject) => { + return resolve(); + } + +- // TODO: Configurar DB de tests ++ globalSetup({rootDir: __dirname}).then(() => { ++ console.info('Starting local server...'); ++ spawn("node", [ "index.js", process.env.PORT || 8888], ++ { ++ cwd: path.resolve(__dirname, "../"), ++ stdio: ["ignore", "pipe", "pipe"], ++ env: { PATH: process.env.PATH, MONGO_URL: process.env.MONGO_URL } ++ } ++ ); ++ }) ++ .catch((error) => console.log(error)); + + console.info('Starting local server...'); + +diff --git a/e2e/jest.config.js b/e2e/jest.config.js +new file mode 100644 +index 0000000..38d8cb3 +--- /dev/null ++++ b/e2e/jest.config.js +@@ -0,0 +1,3 @@ ++module.exports = { ++ preset: '@shelf/jest-mongodb', ++}; +diff --git a/jest-mongodb-config.js b/jest-mongodb-config.js +new file mode 100644 +index 0000000..283bc56 +--- /dev/null ++++ b/jest-mongodb-config.js +@@ -0,0 +1,15 @@ ++// Para usar con MongoDB y jest-mongodb ++// https://www.npmjs.com/package/@shelf/jest-mongodb ++ ++module.exports = { ++ mongodbMemoryServerOptions: { ++ instance: { ++ dbName: 'jest', ++ }, ++ binary: { ++ version: '4.0.3', ++ skipMD5: true, ++ }, ++ autoStart: false, ++ }, ++}; From 8136213b4822f112fb0299ffb481e6262ff1cbf9 Mon Sep 17 00:00:00 2001 From: ivy Date: Fri, 21 Apr 2023 15:23:37 -0500 Subject: [PATCH 17/43] actualizar table of contents --- .../guides/GETTING-STARTED-MONGODB.md | 26 +++++++------------ 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.md b/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.md index e116be290..bcb609464 100644 --- a/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.md +++ b/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.md @@ -13,16 +13,12 @@ para instalar las dependencias basicas, antes de poder comenzar a codear, tenemos que crear nuestro _entorno de desarrollo_. Para ello te recomendamos seguir los pasos a continuación: -* [1. Instalar MongoDB](#1-instalar-mongodb-y-compass) -* [3. Configurar "servicio" de base de datos](#3-configurar-servicio-de-base-de-datos) -* [4. Configurar conexión a BBDD en "servicio" node](#4-configurar-conexión-a-bbdd-en-servicio-node) -* [5. Elegir módulo (cliente)](#5-elegir-módulo-cliente) -* [6. Iniciar, re-iniciar y parar los servicios con `docker-compose`](#6-iniciar-re-iniciar-y-parar-los-servicios-con-docker-compose) -* [7. Familiarizarte con admisitración de contenedores](#7-familiarizarte-con-admisitración-de-contenedores) -* [8. Opcionalmente, instalar interfaz gráfica para admisitrar data](#8-opcionalmente-instalar-interfaz-gráfica-para-admisitrar-data) -* [9. Definir esquemas](#9-definir-esquemas) -* [10. Definir estrategia de pruebas unitarias](#10-definir-estrategia-de-pruebas-unitarias) -* [11. Familiarizarte con las pruebas de integración (e2e)](#11-familiarizarte-con-las-pruebas-de-integración-e2e) +* [1. Instalar MongoDB y Compass](#1-instalar-mongodb-y-compass) +* [2. Levanta el base de datos y server](#2-levanta-el-base-de-datos-y-server) +* [3. Elegir módulo (cliente)](#5-elegir-módulo-cliente) +* [4. Definir esquemas](#9-definir-esquemas) +* [5. Definir estrategia de pruebas unitarias](#10-definir-estrategia-de-pruebas-unitarias) +* [6. Familiarizarte con las pruebas de integración (e2e)](#11-familiarizarte-con-las-pruebas-de-integración-e2e) *** @@ -63,7 +59,7 @@ Revisa [la guia de instalacion de [guia de instalacion de Windows](https://www.mongodb.com/docs/manual/tutorial/install-mongodb-on-windows/#run-mongodb-community-edition-as-a-windows-service), o tu instalación en particular, para ejemplos en como levantarlo. -## 5. Elegir módulo (cliente) +## 3. Elegir módulo (cliente) Ahora que ya tenemos un servidor de bases de datos vamos a necesitar elegir un módulo o librería diseñado para interactuar con nuestra base de datos desde @@ -100,7 +96,7 @@ mongoose .catch(console.error); ``` -## 6. Definir esquemas +## 4. Definir esquemas Como parte del proceso de diseño de nuestra base de datos vamos a tener que especificar los _esquemas_ de nuestros _modelos_ de datos. Con esto nos @@ -112,7 +108,7 @@ Si has elegido MongoDB y Mongoose, este último nos ofrece un mecanismo para describir esos [_modelos_](https://mongoosejs.com/docs/models.html) y [_esquemas_](https://mongoosejs.com/docs/guide.html) de datos en JavaScript. -## 7. Definir estrategia de pruebas unitarias +## 5. Definir estrategia de pruebas unitarias Además de las pruebas `e2e` que ya incluye el _boilerplate_ del proyecto, se espera que puedas también usar pruebas _unitarias_ para el desarrollo de los @@ -131,7 +127,7 @@ se, pero por lo general querremos considerar cómo abstraer la interacción con la base de datos para facilitar _mocks_ que nos permitan concentrarnos en la lógica de las rutas. -## 8. Familiarizarte con las pruebas de integración (e2e) +## 6. Familiarizarte con las pruebas de integración (e2e) El _boilerplate_ de este proyecto ya incluye pruebas `e2e` (end-to-end) o de _integración_, que se encargan de probar nuestra aplicación en conjunto, @@ -164,5 +160,3 @@ tambien usa su propio `globalSetup` y los dos no juegan bien en conjunto. Hemos agregado este codigo para configurar los e2e tests y `globalSetup` en un patch (`usando git diff`) que puedes aplicar automaticamente con `git apply ./mongoDB-e2e.patch`. - -TODO: necesitamos crear un user de authenticacion? From dc6a2a8e5d0cec17e59afa3ca492e4e57aa2b2fc Mon Sep 17 00:00:00 2001 From: ivy Date: Fri, 5 May 2023 12:58:13 -0500 Subject: [PATCH 18/43] update guia and remove mongoose refs --- projects/04-burger-queen-api/README.md | 18 +-- .../04-burger-queen-api/controller/users.js | 1 + .../guides/GETTING-STARTED-MONGODB.md | 148 +++++++++++++++--- 3 files changed, 138 insertions(+), 29 deletions(-) diff --git a/projects/04-burger-queen-api/README.md b/projects/04-burger-queen-api/README.md index 9e6c1627d..06d438dfa 100644 --- a/projects/04-burger-queen-api/README.md +++ b/projects/04-burger-queen-api/README.md @@ -44,7 +44,9 @@ _endpoints_ (puntos de conexión o URLs) y nos piden completar la aplicación. Esto implica que tendremos que partir por leer la implementación existente, y familiarizarnos con el _stack_ elegido ([Node.js](https://nodejs.org/) y [Express](https://expressjs.com/)) y complementarlo con un motor de bases de -datos. Recomendamos el uso de [MongoDB](https://www.mongodb.com/), +datos. Recomendamos el uso de [MongoDB](https://www.mongodb.com/) y tenemos una +[guia para empezar con Mongo](./GETTING-STARTED-MONGO-DB.md) +> para ayudarte a elegir tu stack (base de datos, módulo para conectar a la base, pero puedes también elegir entre [PostgreSQL](https://www.postgresql.org/) y [MySQL](https://www.mysql.com/). @@ -227,11 +229,7 @@ Por otro lado, con respecto al despliegue, tampoco es obligatorio usar con el mecanismo de despligue y estrategia de alojamiento. Te recomendamos explorar las siguientes opciones: -* [Glitch](https://glitch.com) es - probablemente la opción más _sencilla_ (la que requiere menos configuración) y - nos permite alojar el servidor web Express - importando nuestro repositorio desde GitHub. -* [Vercel](https://vercel.com/) es una opción similar a Glitch, pero enfocada +* [Vercel](https://vercel.com/) es una opción enfocada a aplicaciones web estáticas (como las que se construyen con React). Sin embargo, Vercel también nos permite desplegar aplicaciones node usando [Serverless Functions](https://vercel.com/docs/serverless-functions/introduction). @@ -261,9 +259,11 @@ dudes en consultar con tus pares y tus coaches. ### Primeros pasos > :information_source: Antes de comenzar a programar te recomendamos leer y -> seguir con detenimiento la [**guía de _primeros pasos_**](./GETTING-STARTED.md) -> para ayudarte a elegir tu stack (base de datos, módulo para conectar a la base -> de datos desde Node.js, etc) y configurar tu entorno de desarrollo. +> seguir con detenimiento la [**guía de _primeros pasos_**](./GETTING-STARTED-MONGODB.md) +> para ayudarte con el stack recomendado (stack significa base de datos, +> módulo para conectar a la base de datos desde Node.js, etc) +> y configurar tu entorno de desarrollo. +> Si vas a intentar con Docker, tambien tenemos [**guia con docker**](./GETTING-STARTED-DOCKER.md) ### Otros recursos diff --git a/projects/04-burger-queen-api/controller/users.js b/projects/04-burger-queen-api/controller/users.js index 40ecbc906..160570cd8 100644 --- a/projects/04-burger-queen-api/controller/users.js +++ b/projects/04-burger-queen-api/controller/users.js @@ -1,4 +1,5 @@ module.exports = { getUsers: (req, resp, next) => { + // TODO implementa get users de collection }, }; diff --git a/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.md b/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.md index bcb609464..c2f6a0873 100644 --- a/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.md +++ b/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.md @@ -15,10 +15,11 @@ Para ello te recomendamos seguir los pasos a continuación: * [1. Instalar MongoDB y Compass](#1-instalar-mongodb-y-compass) * [2. Levanta el base de datos y server](#2-levanta-el-base-de-datos-y-server) -* [3. Elegir módulo (cliente)](#5-elegir-módulo-cliente) -* [4. Definir esquemas](#9-definir-esquemas) -* [5. Definir estrategia de pruebas unitarias](#10-definir-estrategia-de-pruebas-unitarias) -* [6. Familiarizarte con las pruebas de integración (e2e)](#11-familiarizarte-con-las-pruebas-de-integración-e2e) +* [3. Elegir módulo (cliente)](#3-elegir-módulo-cliente) +* [4. Definir esquemas](#4-definir-esquemas) +* [5. Implementar los primeros TODOs](#5-codigar-los-primeros-todos) +* [6. Definir estrategia de pruebas unitarias](#6-definir-estrategia-de-pruebas-unitarias) +* [7. Familiarizarte con las pruebas de integración (e2e)](#7-familiarizarte-con-las-pruebas-de-integración-e2e) *** @@ -64,9 +65,15 @@ o tu instalación en particular, para ejemplos en como levantarlo. Ahora que ya tenemos un servidor de bases de datos vamos a necesitar elegir un módulo o librería diseñado para interactuar con nuestra base de datos desde Node.js. Existen un montón de opciones, pero para este proyecto te recomendamos -elegir [Mongoose](https://mongoosejs.com/) (que es la más popular para MongoDB). +usar el [Node driver de MongoDB](https://www.mongodb.com/docs/drivers/node/current/) + (lo mas directo interactuar con MongoDB). -Hay que instalar Mongoose como dependencia en este proyecto usando `npm`. +También hay opciones mas abstractas como [Mongoose](https://mongoosejs.com/) +(que es muy popular para MongoDB) o [Prisma](https://www.prisma.io/), +pero si estas empezando con el mundo backend es mejor entender como interactuar +con el base de datos con el driver. + +Hay que instalar el Node Driver en este proyecto usando `npm`. El _boilerplate_ ya incluye un archivo `config.js` donde se leen las variables de entorno, y entre ellas está `DB_URL`. Como vemos ese valor lo @@ -81,21 +88,30 @@ Ahora que ya sabemos dónde encontrar el _connection string_ (en el módulo config), podemos proceder a establecer una conexión con la base de datos usando el cliente elegido. -Ejemplo de conexión usando [Mongoose](https://mongoosejs.com/) (MongoDB): +### Ejemplo de conexión usando MongoDB Node Driver ```js -const mongoose = require("mongoose"); +const { MongoClient } = require('mongodb'); const config = require("./config"); -mongoose - .connect(config.dbUrl, { - useNewUrlParser: true, - useUnifiedTopology: true, - }) - .then(console.log) - .catch(console.error); +const client = new MongoClient(config.dbUrl); + +async function run() { + try { + await client.connect(); + const db = client.db('test'); + // ... + } finally { + // Close the database connection when finished or an error occurs + await client.close(); + } +} +run().catch(console.error); ``` +Puedes encontrar mas ejemplos en [la documentación de MongoDB](https://www.mongodb.com/docs/drivers/node/current/?utm_campaign=w3schools_mdb&utm_source=w3schools&utm_medium=referral#fundamentals) +y también en [un tutorial de w3schools](https://www.w3schools.com/mongodb/mongodb_nodejs_connect_database.php). + ## 4. Definir esquemas Como parte del proceso de diseño de nuestra base de datos vamos a tener que @@ -104,11 +120,103 @@ referimos a que tenemos que _describir_ de alguna forma las colecciones o tablas que vamos a usar y la _forma_ de los objetos o filas que vayamos a guardar en esas colecciones. -Si has elegido MongoDB y Mongoose, este último nos ofrece un mecanismo para -describir esos [_modelos_](https://mongoosejs.com/docs/models.html) y -[_esquemas_](https://mongoosejs.com/docs/guide.html) de datos en JavaScript. +Puedes usar [la documentación de API](https://app.swaggerhub.com/apis-docs/ssinuco/BurgerQueenAPI/2.0.0) +que describe la estructura de `products`, `orders`, etc. para guiar el diseño. + +## 5. Implementar primeros TODOs + +El boilerplate del proyecto viene con archivos con logica para arrancar el server +y otros que contienen funciones de rutas y authenticación, pero muchas estan vacios. +Hemos marcado los primeros partes essencial con comentarios `TODO` - que es un +convención de documentacion de desarollo cuando hay algo para hacer. + +Aqui te guiamos un poco de estes todos. + +### TODO 1: Conectar al base de datos + +En el `index.js` donde arrancamos express y el API, hay + +```js +const { port, dbUrl, secret } = config; +const app = express(); + +// TODO: Conexión a la Base de Datos (MongoDB o MySQL) +``` + +Aquí debes usar el `dbUrl` que importamos del config para establecer la conexión, +quiza atravez una funcion que defines en un modulo y importas en el index. + +### TODO 2: Crear el usuario admin + +EL proyecto depende en la existencia de un usuario en el base de datos que +tiene privilegios de administrador - para crear otros usuarios, etc. + +En `routes/users.js` invocamos una funcion `initAdminUser(app, next)` +al final de archivo, y definimos esta funcion arriba en este misma archivo. + +`initAdminUser` es incompleto, y hay un TODO para crear el usuario admin, +donde tienes que primero porbar si un admin ya existe, y si no agregar uno +al base de datos. + +```js +const initAdminUser = (app, next) => { + const { adminEmail, adminPassword } = app.get('config'); + if (!adminEmail || !adminPassword) { + return next(); + } + + const adminUser = { + email: adminEmail, + password: bcrypt.hashSync(adminPassword, 10), + roles: { admin: true }, + }; + + // TODO: crear usuaria admin + next(); +}; + +Puedes confirmar si tu codigo funciona revisando el base de datos y un testeo unitario. + +``` + +### TODO 3: Implementar autenticación de usuario + +En `routes/auth.js` hay la ruta '/auth' definida, con un + +```js + // TODO: autenticar a la usuarix + ``` + +Aqui es donde debe que verificar que el correo y password coinciden con +datos de un usuario en el base de datos, y si coinciden, hay que generar un +[JWT token](https://jwt.io/introduction) +y mandarlo en la respuesta, para el usuario puede usar con peticiones futuros. +Para ejemplos con mas detalle, busca tutoriales de autenticacion con JWT y node/express. + +### TODO 4: Implementar el middleware de autenticación + +En `middleware/auth.js` hay varios `TODOs`. Usa este oportunidad a familiarizarte +con [el concepto de middleware en express](https://expressjs.com/es/guide/using-middleware.html). + +La aplicacion va a usar este middleware para chequear que los peticiones +que requiere autenticacion son autorizados, que tiene un token valido. + +### TODO 5: Implemenatar la ruta GET `/users` + +Para juntar y verificar todo el trabajo que has hecho, seria bueno implementar +una ruta basica del API, en este caso recomendamos `/users` porque ya debes +tener el user admin en tu base de datos, y este ruta usa el middleware de auth. + +Vas a ver que la ruta `/users` usa la funcion `getUsers` que es definido en +`controller/users.js`. El concepto de controller nos sirve para separar más +la logica de la definición de rutas con la implementacion que va a hablar con +el base de datos. Hay que implementar `getUsers` para obtener la lista de +users del colleción en tu base de datos. + +Revisa [el tutorial de Node y express en Mozilla](https://developer.mozilla.org/en-US/docs/Learn/Server-side/Express_Nodejs/routes) +que habla de controllers. -## 5. Definir estrategia de pruebas unitarias +## 6. Definir estrategia de pruebas unitarias Además de las pruebas `e2e` que ya incluye el _boilerplate_ del proyecto, se espera que puedas también usar pruebas _unitarias_ para el desarrollo de los @@ -127,7 +235,7 @@ se, pero por lo general querremos considerar cómo abstraer la interacción con la base de datos para facilitar _mocks_ que nos permitan concentrarnos en la lógica de las rutas. -## 6. Familiarizarte con las pruebas de integración (e2e) +## 7. Familiarizarte con las pruebas de integración (e2e) El _boilerplate_ de este proyecto ya incluye pruebas `e2e` (end-to-end) o de _integración_, que se encargan de probar nuestra aplicación en conjunto, From 54dd2f411dc1bf671530da62b581587ab6492865 Mon Sep 17 00:00:00 2001 From: ivy Date: Fri, 5 May 2023 13:25:46 -0500 Subject: [PATCH 19/43] minor corrections --- projects/04-burger-queen-api/e2e/globalSetup.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/04-burger-queen-api/e2e/globalSetup.js b/projects/04-burger-queen-api/e2e/globalSetup.js index 93e9b5636..46ad006ad 100644 --- a/projects/04-burger-queen-api/e2e/globalSetup.js +++ b/projects/04-burger-queen-api/e2e/globalSetup.js @@ -85,7 +85,7 @@ const checkAdminCredentials = () => fetch('/auth', { const waitForServerToBeReady = (retries = 10) => new Promise((resolve, reject) => { if (!retries) { - return reject(new Error('Server took to long to start')); + return reject(new Error('Server took too long to start')); } setTimeout(() => { From 13ee9737da6b539b709dcbbc39e8a3fde2af83f8 Mon Sep 17 00:00:00 2001 From: ivy Date: Fri, 5 May 2023 16:52:39 -0500 Subject: [PATCH 20/43] rehacer el patch --- .../04-burger-queen-api/mongoDB-e2e.patch | 113 +++++++++++++++--- 1 file changed, 95 insertions(+), 18 deletions(-) diff --git a/projects/04-burger-queen-api/mongoDB-e2e.patch b/projects/04-burger-queen-api/mongoDB-e2e.patch index 844c68c77..1a3048c24 100644 --- a/projects/04-burger-queen-api/mongoDB-e2e.patch +++ b/projects/04-burger-queen-api/mongoDB-e2e.patch @@ -1,47 +1,106 @@ diff --git a/config.js b/config.js -index 58b4b6e..f7d4787 100644 +index 58b4b6e..330d1c8 100644 --- a/config.js +++ b/config.js -@@ -3,3 +3,4 @@ exports.dbUrl = process.env.DB_URL || 'mongodb://localhost:27017/test'; +@@ -1,5 +1,5 @@ + exports.port = process.argv[2] || process.env.PORT || 8080; +-exports.dbUrl = process.env.DB_URL || 'mongodb://localhost:27017/test'; ++exports.dbUrl = process.env.MONGO_URL || process.env.DB_URL || 'mongodb://127.0.0.1:27017/test'; exports.secret = process.env.JWT_SECRET || 'esta-es-la-api-burger-queen'; exports.adminEmail = process.env.ADMIN_EMAIL || 'admin@localhost'; exports.adminPassword = process.env.ADMIN_PASSWORD || 'changeme'; -+exports.dbUrl = process.env.MONGO_URL || process.env.DB_URL || 'mongodb://localhost:27017/test'; diff --git a/e2e/globalSetup.js b/e2e/globalSetup.js -index 93e9b56..536d9dd 100644 +index 46ad006..e8953d9 100644 --- a/e2e/globalSetup.js +++ b/e2e/globalSetup.js -@@ -2,6 +2,11 @@ const path = require('path'); +@@ -1,6 +1,9 @@ + const path = require('path'); const { spawn } = require('child_process'); const kill = require('tree-kill'); - -+const globalSetup = require("@shelf/jest-mongodb/lib/setup"); -+const MongodbMemoryServer = require('mongodb-memory-server').default; -+ -+global.__MONGOD__ = MongodbMemoryServer; ++const { MongoClient } = require('mongodb'); + ++const mongoGlobalSetup = require("@shelf/jest-mongodb/lib/setup"); + const config = require('../config'); - const port = process.env.PORT || 8888; -@@ -105,7 +110,17 @@ module.exports = () => new Promise((resolve, reject) => { +@@ -105,42 +108,47 @@ module.exports = () => new Promise((resolve, reject) => { return resolve(); } - // TODO: Configurar DB de tests -+ globalSetup({rootDir: __dirname}).then(() => { -+ console.info('Starting local server...'); -+ spawn("node", [ "index.js", process.env.PORT || 8888], ++ mongoGlobalSetup({rootDir: __dirname}).then(async () => { + +- console.info('Starting local server...'); ++ console.info('\n Starting local server...'); + +- const child = spawn(/^win/.test(process.platform) ? 'npm.cmd' : 'npm', ['start', process.env.PORT || 8888], { +- cwd: path.resolve(__dirname, '../'), +- stdio: ['ignore', 'pipe', 'pipe'], +- }); ++ const child = spawn(/^win/.test(process.platform) ? 'npm.cmd' : 'npm', ['start', port], + { + cwd: path.resolve(__dirname, "../"), + stdio: ["ignore", "pipe", "pipe"], + env: { PATH: process.env.PATH, MONGO_URL: process.env.MONGO_URL } + } + ); -+ }) -+ .catch((error) => console.log(error)); - console.info('Starting local server...'); +- Object.assign(__e2e, { childProcessPid: child.pid }); ++ Object.assign(__e2e, { childProcessPid: child.pid }); + +- child.stdout.on('data', (chunk) => { +- console.info(`\x1b[34m${chunk.toString()}\x1b[0m`); +- }); ++ child.stdout.on('data', (chunk) => { ++ console.info(`\x1b[34m${chunk.toString()}\x1b[0m`); ++ }); + +- child.stderr.on('data', (chunk) => { +- const str = chunk.toString(); +- if (/DeprecationWarning/.test(str)) { +- return; +- } +- console.error('child::stderr', str); +- }); +- +- process.on('uncaughtException', (err) => { +- console.error('UncaughtException!'); +- console.error(err); +- kill(child.pid, 'SIGKILL', () => process.exit(1)); +- }); +- +- waitForServerToBeReady() +- .then(checkAdminCredentials) +- .then(createTestUser) +- .then(resolve) +- .catch((err) => { +- kill(child.pid, 'SIGKILL', () => reject(err)); ++ child.stderr.on('data', (chunk) => { ++ const str = chunk.toString(); ++ if (/DeprecationWarning/.test(str)) { ++ return; ++ } ++ console.error('child::stderr', str); + }); ++ ++ process.on('uncaughtException', (err) => { ++ console.error('UncaughtException!'); ++ console.error(err); ++ kill(child.pid, 'SIGKILL', () => process.exit(1)); ++ }); ++ ++ waitForServerToBeReady() ++ .then(checkAdminCredentials) ++ .then(createTestUser) ++ .then(resolve) ++ .catch((err) => { ++ console.log('there was an error'); ++ kill(child.pid, 'SIGKILL', () => reject(err)); ++ }) ++ }).catch((error)=> console.log(error)); + }); + // Export globals - ugly... :-( diff --git a/e2e/jest.config.js b/e2e/jest.config.js new file mode 100644 index 0000000..38d8cb3 @@ -72,3 +131,21 @@ index 0000000..283bc56 + autoStart: false, + }, +}; +diff --git a/package.json b/package.json +index 8472c48..5e7a6c2 100644 +--- a/package.json ++++ b/package.json +@@ -17,10 +17,12 @@ + "docs:deploy": "rm -rf docs && npm run docs:generate && gh-pages -d docs" + }, + "dependencies": { ++ "@shelf/jest-mongodb": "^4.1.7", + "bcrypt": "^5.0.1", + "body-parser": "^1.19.0", + "express": "^4.17.1", +- "jsonwebtoken": "^8.5.1" ++ "jsonwebtoken": "^8.5.1", ++ "mongodb-memory-server": "^8.12.2" + }, + "devDependencies": { + "docdash": "^1.2.0", From 0d444826e17e7c49fd003ef961afc7628c321d42 Mon Sep 17 00:00:00 2001 From: ivy Date: Fri, 5 May 2023 17:15:24 -0500 Subject: [PATCH 21/43] corrections --- projects/04-burger-queen-api/README.md | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/projects/04-burger-queen-api/README.md b/projects/04-burger-queen-api/README.md index 06d438dfa..73f928719 100644 --- a/projects/04-burger-queen-api/README.md +++ b/projects/04-burger-queen-api/README.md @@ -45,8 +45,7 @@ Esto implica que tendremos que partir por leer la implementación existente, y familiarizarnos con el _stack_ elegido ([Node.js](https://nodejs.org/) y [Express](https://expressjs.com/)) y complementarlo con un motor de bases de datos. Recomendamos el uso de [MongoDB](https://www.mongodb.com/) y tenemos una -[guia para empezar con Mongo](./GETTING-STARTED-MONGO-DB.md) -> para ayudarte a elegir tu stack (base de datos, módulo para conectar a la base, +[guia para empezar con Mongo](./GETTING-STARTED-MONGO-DB.md) en este proyecto, pero puedes también elegir entre [PostgreSQL](https://www.postgresql.org/) y [MySQL](https://www.mysql.com/). @@ -260,10 +259,8 @@ dudes en consultar con tus pares y tus coaches. > :information_source: Antes de comenzar a programar te recomendamos leer y > seguir con detenimiento la [**guía de _primeros pasos_**](./GETTING-STARTED-MONGODB.md) -> para ayudarte con el stack recomendado (stack significa base de datos, -> módulo para conectar a la base de datos desde Node.js, etc) -> y configurar tu entorno de desarrollo. -> Si vas a intentar con Docker, tambien tenemos [**guia con docker**](./GETTING-STARTED-DOCKER.md) +> para ayudarte con el stack recomendado y configurar tu entorno de desarrollo. +> Si vas a intentar con Docker, también tenemos una [**guia para docker**](./GETTING-STARTED-DOCKER.md) ### Otros recursos From c9b0fd111a3d98581bd3109ee9570cfb7e6ca397 Mon Sep 17 00:00:00 2001 From: ivy Date: Mon, 8 May 2023 12:37:31 -0500 Subject: [PATCH 22/43] remove redundant checklist, node driver resource --- projects/04-burger-queen-api/README.md | 54 ++----------------- .../guides/GETTING-STARTED-MONGODB.md | 7 +-- 2 files changed, 6 insertions(+), 55 deletions(-) diff --git a/projects/04-burger-queen-api/README.md b/projects/04-burger-queen-api/README.md index 73f928719..6aa38f748 100644 --- a/projects/04-burger-queen-api/README.md +++ b/projects/04-burger-queen-api/README.md @@ -8,7 +8,6 @@ * [4. Consideraciones generales](#4-consideraciones-generales) * [5. Criterios de aceptación mínimos del proyecto](#5-criterios-de-aceptaci%C3%B3n-m%C3%ADnimos-del-proyecto) * [6. Pistas, tips y lecturas complementarias](#6-pistas-tips-y-lecturas-complementarias) -* [7 HTTP API Checklist](#7-http-api-checklist) ## 1. Preámbulo @@ -187,7 +186,7 @@ Nuestra aplicación usa las siguientes variables de entorno: * `PORT`: Si no se ha especificado un puerto como argumento de lína de comando, podemos usar la variable de entorno `PORT` para especificar el puerto. Valor por defecto `8080`. -* `DB_URL`: El _string_ de conexión de _MongoDB_ o _MySQL_. Cuando ejecutemos la +* `DB_URL`: El _string_ de conexión de _MongoDB_. Cuando ejecutemos la aplicación en nuestra computadora (en entorno de desarrollo), podemos usar el una base de datos local, pero en producción deberemos utilizar las instancias configuradas con `docker-compose` (mas sobre esto en la siguiente sección de @@ -232,6 +231,9 @@ explorar las siguientes opciones: a aplicaciones web estáticas (como las que se construyen con React). Sin embargo, Vercel también nos permite desplegar aplicaciones node usando [Serverless Functions](https://vercel.com/docs/serverless-functions/introduction). +* Para MongoDB, [MongoDB Atlas](https://www.mongodb.com/cloud/atlas) + es una muy buena opción para alojar nuestra base datos de producción, la cuál + podemos usar en conjunción con cualquiera de las opciones mencionadas arriba. * Si quieres explorar opciones más personalizadas y ver docker del lado del servidor puedes cosiderar proveedores como [AWS (Amazon Web Services)](https://aws.amazon.com/) o @@ -240,15 +242,6 @@ explorar las siguientes opciones: (VPS) donde configurar nuestro propio Docker o servicios para desplegar aplicaciones en contenedores (por ejemplo [Compute Engine](https://cloud.google.com/compute/docs/containers) de GCP o [Elastic Container Service](https://aws.amazon.com/ecs/) de AWS). -* Si quieres trabajar con MongoDB, [MongoDB Atlas](https://www.mongodb.com/cloud/atlas) - es una muy buena opción para alojar nuestra base datos de producción, la cuál - podemos usar en conjunción con cualquiera de las opciones mencionadas arriba. -* Si quieres trabajar con PostgreSql, [ElephantSQL](https://www.elephantsql.com/plans.html) - es una muy buena opción para alojar nuestra base datos de producción, la cuál - podemos usar en conjunción con cualquiera de las opciones mencionadas arriba. -* Si quieres trabajar con MySQL, [ClearDB](https://www.cleardb.com/) es una - muy buena opción para alojar nuestra base datos de producción, la cuál podemos - usar en conjunción con cualquiera de las opciones mencionadas arriba. Si tienes dudas sobre las diferentes (y múltiples) opciones de despliegue no dudes en consultar con tus pares y tus coaches. @@ -266,47 +259,10 @@ dudes en consultar con tus pares y tus coaches. * [Express](https://expressjs.com/) * [MongoDB](https://www.mongodb.com/) -* [PostgreSQL](https://www.postgresql.org/) -* [MySQL](https://www.mysql.com/) +* [MongoDB Node Driver](https://www.mongodb.com/docs/drivers/node/current/) * [docker](https://docs.docker.com/) * [docker compose](https://docs.docker.com/compose/) * [¿Qué es Docker? | Curso de Docker | Platzi Cursos](https://youtu.be/hQgvt-s-AHQ) * [Postman](https://www.getpostman.com) * [Variable de entorno - Wikipedia](https://es.wikipedia.org/wiki/Variable_de_entorno) * [`process.env` - Node.js docs](https://nodejs.org/api/process.html#process_process_env) - ---- - -## 7 HTTP API Checklist - -### 7.1 `/` - -* [ ] `GET /` - -### 7.2 `/auth` - -* [ ] `POST /auth` - -### 7.3 `/users` - -* [ ] `GET /users` -* [ ] `GET /users/:uid` -* [ ] `POST /users` -* [ ] `PATCH /users/:uid` -* [ ] `DELETE /users/:uid` - -### 7.4 `/products` - -* [ ] `GET /products` -* [ ] `GET /products/:productid` -* [ ] `POST /products` -* [ ] `PATCH /products/:productid` -* [ ] `DELETE /products/:productid` - -### 7.5 `/orders` - -* [ ] `GET /orders` -* [ ] `GET /orders/:orderId` -* [ ] `POST /orders` -* [ ] `PATCH /orders/:orderId` -* [ ] `DELETE /orders/:orderId` diff --git a/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.md b/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.md index c2f6a0873..91fa81655 100644 --- a/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.md +++ b/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.md @@ -17,7 +17,7 @@ Para ello te recomendamos seguir los pasos a continuación: * [2. Levanta el base de datos y server](#2-levanta-el-base-de-datos-y-server) * [3. Elegir módulo (cliente)](#3-elegir-módulo-cliente) * [4. Definir esquemas](#4-definir-esquemas) -* [5. Implementar los primeros TODOs](#5-codigar-los-primeros-todos) +* [5. Implementar los primeros TODOs](#5-implementar-los-primeros-todos) * [6. Definir estrategia de pruebas unitarias](#6-definir-estrategia-de-pruebas-unitarias) * [7. Familiarizarte con las pruebas de integración (e2e)](#7-familiarizarte-con-las-pruebas-de-integración-e2e) @@ -68,11 +68,6 @@ Node.js. Existen un montón de opciones, pero para este proyecto te recomendamos usar el [Node driver de MongoDB](https://www.mongodb.com/docs/drivers/node/current/) (lo mas directo interactuar con MongoDB). -También hay opciones mas abstractas como [Mongoose](https://mongoosejs.com/) -(que es muy popular para MongoDB) o [Prisma](https://www.prisma.io/), -pero si estas empezando con el mundo backend es mejor entender como interactuar -con el base de datos con el driver. - Hay que instalar el Node Driver en este proyecto usando `npm`. El _boilerplate_ ya incluye un archivo `config.js` donde se leen las From cd0bde95cae6b77e8d6858d11f1c12ce7509823d Mon Sep 17 00:00:00 2001 From: Ivy Feraco Date: Mon, 8 May 2023 12:38:17 -0500 Subject: [PATCH 23/43] Update TODO projects/04-burger-queen-api/controller/users.js MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Alfredo González <12631491+mfdebian@users.noreply.github.com> --- projects/04-burger-queen-api/controller/users.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/04-burger-queen-api/controller/users.js b/projects/04-burger-queen-api/controller/users.js index 160570cd8..268b1fece 100644 --- a/projects/04-burger-queen-api/controller/users.js +++ b/projects/04-burger-queen-api/controller/users.js @@ -1,5 +1,5 @@ module.exports = { getUsers: (req, resp, next) => { - // TODO implementa get users de collection + // TODO: Implementa la función necesaria para traer la colección `users` }, }; From 083201313173485dab50965649e81a512fef55f7 Mon Sep 17 00:00:00 2001 From: ivy Date: Mon, 8 May 2023 14:11:19 -0500 Subject: [PATCH 24/43] mas detalle en TODO comentarios --- projects/04-burger-queen-api/routes/auth.js | 4 ++++ projects/04-burger-queen-api/routes/users.js | 3 +++ 2 files changed, 7 insertions(+) diff --git a/projects/04-burger-queen-api/routes/auth.js b/projects/04-burger-queen-api/routes/auth.js index ff3d6426e..de9012958 100644 --- a/projects/04-burger-queen-api/routes/auth.js +++ b/projects/04-burger-queen-api/routes/auth.js @@ -25,6 +25,10 @@ module.exports = (app, nextMain) => { } // TODO: autenticar a la usuarix + // Hay que confirmar si el email y password + // coincidir con un user en el base de datos + // Si coinciden, manda un access token creado con jwt + next(); }); diff --git a/projects/04-burger-queen-api/routes/users.js b/projects/04-burger-queen-api/routes/users.js index 33e489355..73b446125 100644 --- a/projects/04-burger-queen-api/routes/users.js +++ b/projects/04-burger-queen-api/routes/users.js @@ -22,6 +22,9 @@ const initAdminUser = (app, next) => { }; // TODO: crear usuaria admin + // Primero ver si ya existe adminUser en base de datos + // si no existe, hay que guardarlo + next(); }; From c3308fa9ff39f4d25eec6f0340d4f95dcd8ba6cf Mon Sep 17 00:00:00 2001 From: ivy Date: Mon, 8 May 2023 14:12:43 -0500 Subject: [PATCH 25/43] quitar mysql postgres de readme inicial, hacker edition docker --- projects/04-burger-queen-api/README.md | 60 +++++++++---------- .../guides/GETTING-STARTED-DOCKER.md | 3 +- 2 files changed, 32 insertions(+), 31 deletions(-) diff --git a/projects/04-burger-queen-api/README.md b/projects/04-burger-queen-api/README.md index 6aa38f748..7f8c844e2 100644 --- a/projects/04-burger-queen-api/README.md +++ b/projects/04-burger-queen-api/README.md @@ -44,9 +44,7 @@ Esto implica que tendremos que partir por leer la implementación existente, y familiarizarnos con el _stack_ elegido ([Node.js](https://nodejs.org/) y [Express](https://expressjs.com/)) y complementarlo con un motor de bases de datos. Recomendamos el uso de [MongoDB](https://www.mongodb.com/) y tenemos una -[guia para empezar con Mongo](./GETTING-STARTED-MONGO-DB.md) en este proyecto, -pero puedes también elegir entre [PostgreSQL](https://www.postgresql.org/) -y [MySQL](https://www.mysql.com/). +[guia para empezar con MongoDB](./GETTING-STARTED-MONGO-DB.md). La clienta nos ha dado un [link a la documentación](https://app.swaggerhub.com/apis-docs/ssinuco/BurgerQueenAPI/2.0.0) que especifica el comportamiento esperado de la API que expondremos por @@ -56,8 +54,7 @@ implementar la aplicación, qué parámetros esperan, qué deben responder, etc. El objetivo principal de aprendizaje es adquirir experiencia con **Node.js** como herramienta para desarrollar _aplicaciones de servidor_, junto con una serie de herramientas comunes usadas en este tipo de contexto (Express como -framework, MongoDB, PostgreSQL o MySQL como base datos, contenedores de docker, -etc). +framework, MongoDB como base datos, etc). En este proyecto tendrás que construir un servidor web que debe _servir_ `JSON` sobre `HTTP`, y desplegarlo en un servidor en la nube. @@ -65,8 +62,8 @@ sobre `HTTP`, y desplegarlo en un servidor en la nube. Para completar el proyecto tendrás que familiarizarte con conceptos como **rutas** (_routes_), **URLs**, **HTTP** y **REST** (verbs, request, response, headers, body, status codes...), **JSON**, **JWT** (_JSON Web Tokens_), -**conexión con una base datos** (`MongoDB`, `PostgreSQL`, o `MySQL`), -**variables de entorno**, **deployment**, **contenedores de `docker`**, etc. +**conexión con una base datos** (`MongoDB`), +**variables de entorno**, **deployment**, etc. ## 3. Objetivos de aprendizaje @@ -205,37 +202,44 @@ Nuestra aplicación usa las siguientes variables de entorno: ### 5.3 Despliegue (Deployment) +Puedes elegir el proveedor (o proveedores) que prefieras junto +con el mecanismo de despligue y estrategia de alojamiento. Te recomendamos +explorar las siguientes opciones: + +* [Vercel](https://vercel.com/) es una opción enfocada + a aplicaciones web estáticas (como las que se construyen con React). Sin embargo, + Vercel también nos permite desplegar aplicaciones node usando [Serverless + Functions](https://vercel.com/docs/serverless-functions/introduction). +* [MongoDB Atlas](https://www.mongodb.com/cloud/atlas) + es una muy buena opción para alojar nuestra base datos de producción, la cuál + podemos usar en conjunción con cualquiera de las opciones mencionadas arriba. + +Si tienes dudas sobre las diferentes (y múltiples) opciones de despliegue no +dudes en consultar con tus pares y tus coaches. + +### 5.4 Hacker (Devops) Edition con Docker + Nuestra clienta nos ha manifestado que su equipo de _devops_ está siempre con muchas tareas, por lo que nos pide como requerimiento que la aplicación esté configurada con `docker-compose` para que pueda ser desplegada sin dificultades en cualquier entorno. -El _boilerplate_ ya cuenta con una configuración incial de `docker-compose` para +El _boilerplate_ ya cuenta con una configuración inicial de `docker-compose` para la aplicación de node, tu tarea será extender esa configuración para incluir -la configuración de base de datos que hayas elegido (como MongoDB). -Ten en cuenta que como vas a tener dos servidores corriendo sobre una misma +la configuración de base de datos. Ten en cuenta que como vas a tener dos servidores corriendo sobre una misma configuración, deberás exponer los servicios en diferentes puertos. -No es obligatorio, pero para este proyecto te recomendamos usar `docker-compose` -localmente (en tu computadora) para ejecutar la aplicación junto con la base de datos -seleccionada. Si complica usar `docker` con tu sistema (a veces es costoso y lento -en Windows) para desarrollo local, puedes dejar `docker` -y levantar (correr) el base de datos y express server localmente. +Lee la [**guia para docker**] incluido en el proyecto (./GETTING-STARTED-DOCKER.md) para mas información. -Por otro lado, con respecto al despliegue, tampoco es obligatorio usar -`docker-compose`, puedes elegir el proveedor (o proveedores) que prefieras junto -con el mecanismo de despligue y estrategia de alojamiento. Te recomendamos +Para probar tu configuración de docker, te recomendamos usar `docker-compose` +localmente (en tu computadora) para ejecutar la aplicación junto +con la base de datos. + +Con respecto al despliegue, puedes elegir el proveedor (o proveedores) que prefieras junto con el mecanismo de despligue y estrategia de alojamiento. Te recomendamos explorar las siguientes opciones: -* [Vercel](https://vercel.com/) es una opción enfocada - a aplicaciones web estáticas (como las que se construyen con React). Sin embargo, - Vercel también nos permite desplegar aplicaciones node usando [Serverless - Functions](https://vercel.com/docs/serverless-functions/introduction). -* Para MongoDB, [MongoDB Atlas](https://www.mongodb.com/cloud/atlas) - es una muy buena opción para alojar nuestra base datos de producción, la cuál - podemos usar en conjunción con cualquiera de las opciones mencionadas arriba. * Si quieres explorar opciones más personalizadas y ver docker del lado del - servidor puedes cosiderar proveedores como + servidor puedes considerar proveedores como [AWS (Amazon Web Services)](https://aws.amazon.com/) o [GCP (Google Cloud Platform)](https://cloud.google.com/), ambos tienen algún tipo de _free tier_ así como tanto _instancias_ de _servidores virtuales_ @@ -243,9 +247,6 @@ explorar las siguientes opciones: aplicaciones en contenedores (por ejemplo [Compute Engine](https://cloud.google.com/compute/docs/containers) de GCP o [Elastic Container Service](https://aws.amazon.com/ecs/) de AWS). -Si tienes dudas sobre las diferentes (y múltiples) opciones de despliegue no -dudes en consultar con tus pares y tus coaches. - ## 6. Pistas, tips y lecturas complementarias ### Primeros pasos @@ -253,7 +254,6 @@ dudes en consultar con tus pares y tus coaches. > :information_source: Antes de comenzar a programar te recomendamos leer y > seguir con detenimiento la [**guía de _primeros pasos_**](./GETTING-STARTED-MONGODB.md) > para ayudarte con el stack recomendado y configurar tu entorno de desarrollo. -> Si vas a intentar con Docker, también tenemos una [**guia para docker**](./GETTING-STARTED-DOCKER.md) ### Otros recursos diff --git a/projects/04-burger-queen-api/guides/GETTING-STARTED-DOCKER.md b/projects/04-burger-queen-api/guides/GETTING-STARTED-DOCKER.md index dc6b0dda2..1e147459d 100644 --- a/projects/04-burger-queen-api/guides/GETTING-STARTED-DOCKER.md +++ b/projects/04-burger-queen-api/guides/GETTING-STARTED-DOCKER.md @@ -23,7 +23,8 @@ Para ello te recomendamos seguir los pasos a continuación: La primera decisión que tenemos que tomar, antes de comenzar a programar, es elegir una base de datos. En este proyecto se sugieren 3 opciones: dos de ellas _relacionales_ y basadas en SQL, (PostgreSQL y MySQL), y otra _no relacional_ -(MongoDB). Las 3 son excelentes opciones. +(MongoDB). Las 3 son excelentes opciones. Recomendamos `MongoDB` para tu primer +proyecto backend. Algunos puntos a tener en cuenta: From 7fa219332e9bc3fbf58b04f238066dd67f627c2e Mon Sep 17 00:00:00 2001 From: ivy Date: Mon, 8 May 2023 14:20:41 -0500 Subject: [PATCH 26/43] apply and remove patch for e2e tests --- projects/04-burger-queen-api/config.js | 2 +- .../04-burger-queen-api/e2e/globalSetup.js | 68 ++++---- .../04-burger-queen-api/e2e/jest.config.js | 3 + .../guides/GETTING-STARTED-MONGODB.md | 14 +- .../jest-mongodb-config.js | 15 ++ .../04-burger-queen-api/mongoDB-e2e.patch | 151 ------------------ projects/04-burger-queen-api/package.json | 4 +- 7 files changed, 64 insertions(+), 193 deletions(-) create mode 100644 projects/04-burger-queen-api/e2e/jest.config.js create mode 100644 projects/04-burger-queen-api/jest-mongodb-config.js delete mode 100644 projects/04-burger-queen-api/mongoDB-e2e.patch diff --git a/projects/04-burger-queen-api/config.js b/projects/04-burger-queen-api/config.js index 58b4b6e29..330d1c817 100644 --- a/projects/04-burger-queen-api/config.js +++ b/projects/04-burger-queen-api/config.js @@ -1,5 +1,5 @@ exports.port = process.argv[2] || process.env.PORT || 8080; -exports.dbUrl = process.env.DB_URL || 'mongodb://localhost:27017/test'; +exports.dbUrl = process.env.MONGO_URL || process.env.DB_URL || 'mongodb://127.0.0.1:27017/test'; exports.secret = process.env.JWT_SECRET || 'esta-es-la-api-burger-queen'; exports.adminEmail = process.env.ADMIN_EMAIL || 'admin@localhost'; exports.adminPassword = process.env.ADMIN_PASSWORD || 'changeme'; diff --git a/projects/04-burger-queen-api/e2e/globalSetup.js b/projects/04-burger-queen-api/e2e/globalSetup.js index 46ad006ad..799bff502 100644 --- a/projects/04-burger-queen-api/e2e/globalSetup.js +++ b/projects/04-burger-queen-api/e2e/globalSetup.js @@ -1,6 +1,9 @@ const path = require('path'); const { spawn } = require('child_process'); const kill = require('tree-kill'); +const { MongoClient } = require('mongodb'); + +const mongoGlobalSetup = require("@shelf/jest-mongodb/lib/setup"); const config = require('../config'); @@ -105,42 +108,47 @@ module.exports = () => new Promise((resolve, reject) => { return resolve(); } - // TODO: Configurar DB de tests + mongoGlobalSetup({rootDir: __dirname}).then(async () => { - console.info('Starting local server...'); + console.info('\n Starting local server...'); - const child = spawn(/^win/.test(process.platform) ? 'npm.cmd' : 'npm', ['start', process.env.PORT || 8888], { - cwd: path.resolve(__dirname, '../'), - stdio: ['ignore', 'pipe', 'pipe'], - }); + const child = spawn(/^win/.test(process.platform) ? 'npm.cmd' : 'npm', ['start', port], + { + cwd: path.resolve(__dirname, "../"), + stdio: ["ignore", "pipe", "pipe"], + env: { PATH: process.env.PATH, MONGO_URL: process.env.MONGO_URL } + } + ); - Object.assign(__e2e, { childProcessPid: child.pid }); + Object.assign(__e2e, { childProcessPid: child.pid }); - child.stdout.on('data', (chunk) => { - console.info(`\x1b[34m${chunk.toString()}\x1b[0m`); - }); + child.stdout.on('data', (chunk) => { + console.info(`\x1b[34m${chunk.toString()}\x1b[0m`); + }); - child.stderr.on('data', (chunk) => { - const str = chunk.toString(); - if (/DeprecationWarning/.test(str)) { - return; - } - console.error('child::stderr', str); - }); - - process.on('uncaughtException', (err) => { - console.error('UncaughtException!'); - console.error(err); - kill(child.pid, 'SIGKILL', () => process.exit(1)); - }); - - waitForServerToBeReady() - .then(checkAdminCredentials) - .then(createTestUser) - .then(resolve) - .catch((err) => { - kill(child.pid, 'SIGKILL', () => reject(err)); + child.stderr.on('data', (chunk) => { + const str = chunk.toString(); + if (/DeprecationWarning/.test(str)) { + return; + } + console.error('child::stderr', str); }); + + process.on('uncaughtException', (err) => { + console.error('UncaughtException!'); + console.error(err); + kill(child.pid, 'SIGKILL', () => process.exit(1)); + }); + + waitForServerToBeReady() + .then(checkAdminCredentials) + .then(createTestUser) + .then(resolve) + .catch((err) => { + console.log('there was an error'); + kill(child.pid, 'SIGKILL', () => reject(err)); + }) + }).catch((error)=> console.log(error)); }); // Export globals - ugly... :-( diff --git a/projects/04-burger-queen-api/e2e/jest.config.js b/projects/04-burger-queen-api/e2e/jest.config.js new file mode 100644 index 000000000..38d8cb351 --- /dev/null +++ b/projects/04-burger-queen-api/e2e/jest.config.js @@ -0,0 +1,3 @@ +module.exports = { + preset: '@shelf/jest-mongodb', +}; diff --git a/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.md b/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.md index 91fa81655..a4517528a 100644 --- a/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.md +++ b/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.md @@ -251,15 +251,9 @@ esta instancia (por defecto `http://127.0.0.1:8080`). Esto asume que la base de datos está disponible. Los pruebas e2e depende en codigo de (`globalSetup.js`)[../e2e/globalSetup.js] -que `jest` sabe correr primero antes de los tests. -En este paso de setup, hay que levantar un mock db (como hemos hablado de +que `jest` sabe correr primero, antes de los tests. +En este paso de setup, levantamos un mock db (como hemos hablado de [`mongodb-memory-server`](https://github.com/nodkz/mongodb-memory-server)) -y hacer que jest se conecta a este mock db. +y jest se conecta a este mock db. -Para este configuracion - hay que instalar `mongodb-memory-server` y un preset (`jest-mongodb`)[https://github.com/shelfio/jest-mongodb]. - -El patrón de setup no es tan directo y documentado, porque `jest-mongodb` -tambien usa su propio `globalSetup` y los dos no juegan bien en conjunto. -Hemos agregado este codigo para configurar los e2e tests y `globalSetup` -en un patch (`usando git diff`) que puedes aplicar automaticamente con -`git apply ./mongoDB-e2e.patch`. +Para este configuracion - usamos `mongodb-memory-server` y un preset (`jest-mongodb`)[https://github.com/shelfio/jest-mongodb]. diff --git a/projects/04-burger-queen-api/jest-mongodb-config.js b/projects/04-burger-queen-api/jest-mongodb-config.js new file mode 100644 index 000000000..283bc5680 --- /dev/null +++ b/projects/04-burger-queen-api/jest-mongodb-config.js @@ -0,0 +1,15 @@ +// Para usar con MongoDB y jest-mongodb +// https://www.npmjs.com/package/@shelf/jest-mongodb + +module.exports = { + mongodbMemoryServerOptions: { + instance: { + dbName: 'jest', + }, + binary: { + version: '4.0.3', + skipMD5: true, + }, + autoStart: false, + }, +}; diff --git a/projects/04-burger-queen-api/mongoDB-e2e.patch b/projects/04-burger-queen-api/mongoDB-e2e.patch deleted file mode 100644 index 1a3048c24..000000000 --- a/projects/04-burger-queen-api/mongoDB-e2e.patch +++ /dev/null @@ -1,151 +0,0 @@ -diff --git a/config.js b/config.js -index 58b4b6e..330d1c8 100644 ---- a/config.js -+++ b/config.js -@@ -1,5 +1,5 @@ - exports.port = process.argv[2] || process.env.PORT || 8080; --exports.dbUrl = process.env.DB_URL || 'mongodb://localhost:27017/test'; -+exports.dbUrl = process.env.MONGO_URL || process.env.DB_URL || 'mongodb://127.0.0.1:27017/test'; - exports.secret = process.env.JWT_SECRET || 'esta-es-la-api-burger-queen'; - exports.adminEmail = process.env.ADMIN_EMAIL || 'admin@localhost'; - exports.adminPassword = process.env.ADMIN_PASSWORD || 'changeme'; -diff --git a/e2e/globalSetup.js b/e2e/globalSetup.js -index 46ad006..e8953d9 100644 ---- a/e2e/globalSetup.js -+++ b/e2e/globalSetup.js -@@ -1,6 +1,9 @@ - const path = require('path'); - const { spawn } = require('child_process'); - const kill = require('tree-kill'); -+const { MongoClient } = require('mongodb'); -+ -+const mongoGlobalSetup = require("@shelf/jest-mongodb/lib/setup"); - - const config = require('../config'); - -@@ -105,42 +108,47 @@ module.exports = () => new Promise((resolve, reject) => { - return resolve(); - } - -- // TODO: Configurar DB de tests -+ mongoGlobalSetup({rootDir: __dirname}).then(async () => { - -- console.info('Starting local server...'); -+ console.info('\n Starting local server...'); - -- const child = spawn(/^win/.test(process.platform) ? 'npm.cmd' : 'npm', ['start', process.env.PORT || 8888], { -- cwd: path.resolve(__dirname, '../'), -- stdio: ['ignore', 'pipe', 'pipe'], -- }); -+ const child = spawn(/^win/.test(process.platform) ? 'npm.cmd' : 'npm', ['start', port], -+ { -+ cwd: path.resolve(__dirname, "../"), -+ stdio: ["ignore", "pipe", "pipe"], -+ env: { PATH: process.env.PATH, MONGO_URL: process.env.MONGO_URL } -+ } -+ ); - -- Object.assign(__e2e, { childProcessPid: child.pid }); -+ Object.assign(__e2e, { childProcessPid: child.pid }); - -- child.stdout.on('data', (chunk) => { -- console.info(`\x1b[34m${chunk.toString()}\x1b[0m`); -- }); -+ child.stdout.on('data', (chunk) => { -+ console.info(`\x1b[34m${chunk.toString()}\x1b[0m`); -+ }); - -- child.stderr.on('data', (chunk) => { -- const str = chunk.toString(); -- if (/DeprecationWarning/.test(str)) { -- return; -- } -- console.error('child::stderr', str); -- }); -- -- process.on('uncaughtException', (err) => { -- console.error('UncaughtException!'); -- console.error(err); -- kill(child.pid, 'SIGKILL', () => process.exit(1)); -- }); -- -- waitForServerToBeReady() -- .then(checkAdminCredentials) -- .then(createTestUser) -- .then(resolve) -- .catch((err) => { -- kill(child.pid, 'SIGKILL', () => reject(err)); -+ child.stderr.on('data', (chunk) => { -+ const str = chunk.toString(); -+ if (/DeprecationWarning/.test(str)) { -+ return; -+ } -+ console.error('child::stderr', str); - }); -+ -+ process.on('uncaughtException', (err) => { -+ console.error('UncaughtException!'); -+ console.error(err); -+ kill(child.pid, 'SIGKILL', () => process.exit(1)); -+ }); -+ -+ waitForServerToBeReady() -+ .then(checkAdminCredentials) -+ .then(createTestUser) -+ .then(resolve) -+ .catch((err) => { -+ console.log('there was an error'); -+ kill(child.pid, 'SIGKILL', () => reject(err)); -+ }) -+ }).catch((error)=> console.log(error)); - }); - - // Export globals - ugly... :-( -diff --git a/e2e/jest.config.js b/e2e/jest.config.js -new file mode 100644 -index 0000000..38d8cb3 ---- /dev/null -+++ b/e2e/jest.config.js -@@ -0,0 +1,3 @@ -+module.exports = { -+ preset: '@shelf/jest-mongodb', -+}; -diff --git a/jest-mongodb-config.js b/jest-mongodb-config.js -new file mode 100644 -index 0000000..283bc56 ---- /dev/null -+++ b/jest-mongodb-config.js -@@ -0,0 +1,15 @@ -+// Para usar con MongoDB y jest-mongodb -+// https://www.npmjs.com/package/@shelf/jest-mongodb -+ -+module.exports = { -+ mongodbMemoryServerOptions: { -+ instance: { -+ dbName: 'jest', -+ }, -+ binary: { -+ version: '4.0.3', -+ skipMD5: true, -+ }, -+ autoStart: false, -+ }, -+}; -diff --git a/package.json b/package.json -index 8472c48..5e7a6c2 100644 ---- a/package.json -+++ b/package.json -@@ -17,10 +17,12 @@ - "docs:deploy": "rm -rf docs && npm run docs:generate && gh-pages -d docs" - }, - "dependencies": { -+ "@shelf/jest-mongodb": "^4.1.7", - "bcrypt": "^5.0.1", - "body-parser": "^1.19.0", - "express": "^4.17.1", -- "jsonwebtoken": "^8.5.1" -+ "jsonwebtoken": "^8.5.1", -+ "mongodb-memory-server": "^8.12.2" - }, - "devDependencies": { - "docdash": "^1.2.0", diff --git a/projects/04-burger-queen-api/package.json b/projects/04-burger-queen-api/package.json index d9445fc17..49e9fc1bc 100644 --- a/projects/04-burger-queen-api/package.json +++ b/projects/04-burger-queen-api/package.json @@ -17,10 +17,12 @@ "docs:deploy": "rm -rf docs && npm run docs:generate && gh-pages -d docs" }, "dependencies": { + "@shelf/jest-mongodb": "^4.1.7", "bcrypt": "^5.0.1", "body-parser": "^1.19.0", "express": "^4.17.1", - "jsonwebtoken": "^8.5.1" + "jsonwebtoken": "^8.5.1", + "mongodb-memory-server": "^8.12.2" }, "devDependencies": { "docdash": "^1.2.0", From bf4c67c371dffbf517c16df9c1e9fc9ff664fb01 Mon Sep 17 00:00:00 2001 From: ivy Date: Mon, 8 May 2023 14:38:44 -0500 Subject: [PATCH 27/43] linter and section for hacker edition --- projects/04-burger-queen-api/README.md | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/projects/04-burger-queen-api/README.md b/projects/04-burger-queen-api/README.md index 7f8c844e2..5f5950619 100644 --- a/projects/04-burger-queen-api/README.md +++ b/projects/04-burger-queen-api/README.md @@ -7,7 +7,8 @@ * [3. Objetivos de aprendizaje](#3-objetivos-de-aprendizaje) * [4. Consideraciones generales](#4-consideraciones-generales) * [5. Criterios de aceptación mínimos del proyecto](#5-criterios-de-aceptaci%C3%B3n-m%C3%ADnimos-del-proyecto) -* [6. Pistas, tips y lecturas complementarias](#6-pistas-tips-y-lecturas-complementarias) +* [6. Hacker (Devops) Edition con Docker](#6-hacker-%28devops%29-edition-con-docker) +* [7. Pistas, tips y lecturas complementarias](#6-pistas-tips-y-lecturas-complementarias) ## 1. Preámbulo @@ -217,7 +218,7 @@ explorar las siguientes opciones: Si tienes dudas sobre las diferentes (y múltiples) opciones de despliegue no dudes en consultar con tus pares y tus coaches. -### 5.4 Hacker (Devops) Edition con Docker +### 6. Hacker (Devops) Edition con Docker Nuestra clienta nos ha manifestado que su equipo de _devops_ está siempre con muchas tareas, por lo que nos pide como requerimiento que la aplicación esté @@ -226,17 +227,20 @@ en cualquier entorno. El _boilerplate_ ya cuenta con una configuración inicial de `docker-compose` para la aplicación de node, tu tarea será extender esa configuración para incluir -la configuración de base de datos. Ten en cuenta que como vas a tener dos servidores corriendo sobre una misma -configuración, deberás exponer los servicios en diferentes puertos. +la configuración de base de datos. Ten en cuenta que como vas a tener dos +servidores corriendo sobre una misma configuración, deberás exponer +los servicios en diferentes puertos. -Lee la [**guia para docker**] incluido en el proyecto (./GETTING-STARTED-DOCKER.md) para mas información. +Lee la [**guia para docker**] (./GETTING-STARTED-DOCKER.md) +incluido en el proyecto para mas información. Para probar tu configuración de docker, te recomendamos usar `docker-compose` localmente (en tu computadora) para ejecutar la aplicación junto con la base de datos. -Con respecto al despliegue, puedes elegir el proveedor (o proveedores) que prefieras junto con el mecanismo de despligue y estrategia de alojamiento. Te recomendamos -explorar las siguientes opciones: +Con respecto al despliegue, puedes elegir el proveedor (o proveedores) +que prefieras junto con el mecanismo de despligue y estrategia de alojamiento. +Te recomendamos explorar las siguientes opciones: * Si quieres explorar opciones más personalizadas y ver docker del lado del servidor puedes considerar proveedores como @@ -247,7 +251,7 @@ explorar las siguientes opciones: aplicaciones en contenedores (por ejemplo [Compute Engine](https://cloud.google.com/compute/docs/containers) de GCP o [Elastic Container Service](https://aws.amazon.com/ecs/) de AWS). -## 6. Pistas, tips y lecturas complementarias +## 7. Pistas, tips y lecturas complementarias ### Primeros pasos From fce3433217f539aba6aa35936ddd98a1d2e97b5f Mon Sep 17 00:00:00 2001 From: Ivy Feraco Date: Tue, 9 May 2023 10:49:25 -0500 Subject: [PATCH 28/43] Apply grammar and spelling suggestions from code review Co-authored-by: Mariano Crowe --- .../guides/GETTING-STARTED-MONGODB.md | 110 +++++++++--------- 1 file changed, 55 insertions(+), 55 deletions(-) diff --git a/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.md b/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.md index a4517528a..6c76cdc58 100644 --- a/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.md +++ b/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.md @@ -1,20 +1,20 @@ # Primeros pasos con MongoDB -MongoDB es un base de datos no-relacionado, y es la más _común_ (popular) +MongoDB es un base de datos no-relacional, y es la más _común_ (popular) a día de hoy en el ecosistema de Node.js. -Si vas a trabajar con MongoDB y Docker, mejor leer -[**la guía de _primeros pasos con Docker_**](./GETTING-STARTED-DOCKER.md) -primero. Si vas a instalar MongoDB y desarollar el proyecto sin -Docker en este momento, seguir leyendo este guia. +Si vas a trabajar con MongoDB y Docker, mejor lee primero +[**la guía de _primeros pasos con Docker_**](./GETTING-STARTED-DOCKER.md). +Si vas a instalar MongoDB y desarollar el proyecto sin +Docker en este momento, sigue leyendo esta guía. -Una vez creado tu fork y clonado el repo en tu computadora, y haces `npm install` -para instalar las dependencias basicas, antes de poder -comenzar a codear, tenemos que crear nuestro _entorno de desarrollo_. -Para ello te recomendamos seguir los pasos a continuación: +Una vez creado tu fork y clonado el repo en tu computadora, haces `npm install` +para instalar las dependencias básicas. +Antes de poder comenzar a codear, tenemos que crear nuestro _entorno de desarrollo_. +Para ello te recomendamos seguir los siguientes pasos: * [1. Instalar MongoDB y Compass](#1-instalar-mongodb-y-compass) -* [2. Levanta el base de datos y server](#2-levanta-el-base-de-datos-y-server) +* [2. Levanta la base de datos y servidor](#2-levanta-la-base-de-datos-y-servidor) * [3. Elegir módulo (cliente)](#3-elegir-módulo-cliente) * [4. Definir esquemas](#4-definir-esquemas) * [5. Implementar los primeros TODOs](#5-implementar-los-primeros-todos) @@ -25,31 +25,31 @@ Para ello te recomendamos seguir los pasos a continuación: ## 1. Instalar MongoDB y Compass -El sitio de MongoDB tiene tutorials como instalar el [Community Edition](https://www.mongodb.com/docs/compass/current/install/). +El sitio de MongoDB tiene tutoriales de cómo instalar la [Community Edition](https://www.mongodb.com/docs/compass/current/install/). Elige tu plataforma (Windows, Mac, Ubuntu etc) y sigue [el tutorial](https://www.mongodb.com/docs/manual/installation/#mongodb-installation-tutorials). -Con los tutorials, va a descargar y instalar MongoDB en tu sistema, -con algunas herramientas y comandos para usar en la linea de comando. +Con los tutoriales, vas a descargar y instalar MongoDB en tu sistema, +con algunas herramientas y comandos para usar en la línea de comando. Tambien recomendamos que instales [Compass](https://www.mongodb.com/products/compass), -que es un GUI (Graphical User Interface) para interactuar con el base de datos. +que es un GUI (Graphical User Interface) para interactuar con la base de datos. Puedes interactuar con MongoDB sin Compass y solo en la linea de comando, -pero un GUI puede ayudarte visualizar y entender que esta en el db. Sigue [las +pero un GUI puede ayudarte visualizar y entender lo que está en la base de datos. Sigue [las instrucciones de instalacion de Compass](https://www.mongodb.com/docs/compass/current/install/). -## 2. Levanta el base de datos y server +## 2. Levanta la base de datos y server -Podemos decir este proyecto tiene dos "servicios", uno es el base de datos para -almanecenar los productos, usuarios, etc., y el otro es el server para exponer +Podemos decir que este proyecto tiene dos "servicios", uno es la base de datos para +almanecenar los productos, usuarios, etc., y el otro es el servidor para exponer el API. -Estes servicios tienen que estar corriendo, disponible, para este proyecto, -el API, puede funcionar. +Estos servicios tienen que estar corriendo, para que +el API pueda funcionar. -Para correr el server, es bien simple - con `npm start` va a ejecutar -[`index.js`](../index.js) que tiene logica basica de server con express. +Correr el servidor es bien simple: con `npm start` va a ejecutar +[`index.js`](../index.js) que tiene la lógica básica de un servidor con express. -Para levantar el server, este depende en tu instalación y sistema. +Cómo levantar el servidor, este depende de tu instalación y sistema. Por ejemplo, en MacOS si instalaste con `homebrew`, puede usar `brew services start mongodb-community@6.0` para levantarlo. O sin `homebrew`, `mongod --config /usr/local/etc/mongod.conf --fork`. En Windows, hay que @@ -58,7 +58,7 @@ levantarlo desde Services console. Revisa [la guia de instalacion de ](https://www.mongodb.com/docs/manual/tutorial/install-mongodb-on-os-x/#run-mongodb-community-edition), [guia de instalacion de Windows](https://www.mongodb.com/docs/manual/tutorial/install-mongodb-on-windows/#run-mongodb-community-edition-as-a-windows-service), -o tu instalación en particular, para ejemplos en como levantarlo. +o tu instalación en particular, para ejemplos en cómo levantarlo. ## 3. Elegir módulo (cliente) @@ -66,7 +66,7 @@ Ahora que ya tenemos un servidor de bases de datos vamos a necesitar elegir un módulo o librería diseñado para interactuar con nuestra base de datos desde Node.js. Existen un montón de opciones, pero para este proyecto te recomendamos usar el [Node driver de MongoDB](https://www.mongodb.com/docs/drivers/node/current/) - (lo mas directo interactuar con MongoDB). +que es la forma más directa de interactuar con tu instancia de MongoDB. Hay que instalar el Node Driver en este proyecto usando `npm`. @@ -104,15 +104,15 @@ async function run() { run().catch(console.error); ``` -Puedes encontrar mas ejemplos en [la documentación de MongoDB](https://www.mongodb.com/docs/drivers/node/current/?utm_campaign=w3schools_mdb&utm_source=w3schools&utm_medium=referral#fundamentals) +Puedes encontrar mas ejemplos en [la documentación de MongoDB](https://www.mongodb.com/docs/drivers/node/current/) y también en [un tutorial de w3schools](https://www.w3schools.com/mongodb/mongodb_nodejs_connect_database.php). ## 4. Definir esquemas Como parte del proceso de diseño de nuestra base de datos vamos a tener que especificar los _esquemas_ de nuestros _modelos_ de datos. Con esto nos -referimos a que tenemos que _describir_ de alguna forma las colecciones o -tablas que vamos a usar y la _forma_ de los objetos o filas que vayamos a +referimos a que tenemos que _describir_ de alguna forma la estructura de las colecciones +que vamos a usar y la _forma_ de los objetos que vayamos a guardar en esas colecciones. Puedes usar [la documentación de API](https://app.swaggerhub.com/apis-docs/ssinuco/BurgerQueenAPI/2.0.0) @@ -121,15 +121,15 @@ que describe la estructura de `products`, `orders`, etc. para guiar el diseño. ## 5. Implementar primeros TODOs El boilerplate del proyecto viene con archivos con logica para arrancar el server -y otros que contienen funciones de rutas y authenticación, pero muchas estan vacios. -Hemos marcado los primeros partes essencial con comentarios `TODO` - que es un -convención de documentacion de desarollo cuando hay algo para hacer. +y otros que contienen funciones de rutas y autenticación, pero muchas están vacías. +Hemos marcado las primeras partes esenciales con comentarios `TODO` (del inglés _por hacer_), que es una +convención en el desarollo de software, cuando queda algo pendiente de hacer. -Aqui te guiamos un poco de estes todos. +Aquí te guiamos un poco sobre esto ToDo's. -### TODO 1: Conectar al base de datos +### TODO 1: Conectar a la base de datos -En el `index.js` donde arrancamos express y el API, hay +En el `index.js` donde arrancamos express y el API, hay: ```js const { port, dbUrl, secret } = config; @@ -139,19 +139,19 @@ const app = express(); ``` Aquí debes usar el `dbUrl` que importamos del config para establecer la conexión, -quiza atravez una funcion que defines en un modulo y importas en el index. +quiza a través de una funcion que defines en un modulo y luego importas desde el index. -### TODO 2: Crear el usuario admin +### TODO 2: Crear el usuario _admin_ EL proyecto depende en la existencia de un usuario en el base de datos que -tiene privilegios de administrador - para crear otros usuarios, etc. +tiene privilegios de administrador, para así poder crear otros usuarios, etc. En `routes/users.js` invocamos una funcion `initAdminUser(app, next)` al final de archivo, y definimos esta funcion arriba en este misma archivo. -`initAdminUser` es incompleto, y hay un TODO para crear el usuario admin, -donde tienes que primero porbar si un admin ya existe, y si no agregar uno -al base de datos. +`initAdminUser` está incompleto, y hay un TODO para crear el usuario admin, +donde tienes que primero chequear si un admin ya existe, y si no agregar uno +a la base de datos. ```js const initAdminUser = (app, next) => { @@ -170,43 +170,43 @@ const initAdminUser = (app, next) => { next(); }; -Puedes confirmar si tu codigo funciona revisando el base de datos y un testeo unitario. +Puedes confirmar si tu código funciona revisando la base de datos y con un testeo unitario. ``` ### TODO 3: Implementar autenticación de usuario -En `routes/auth.js` hay la ruta '/auth' definida, con un +En `routes/auth.js` está la ruta '/auth' definida, con un ```js // TODO: autenticar a la usuarix ``` -Aqui es donde debe que verificar que el correo y password coinciden con -datos de un usuario en el base de datos, y si coinciden, hay que generar un +Aqui es donde debes verificar que el correo y password coinciden con +datos de algún usuario en la base de datos. Si coinciden, hay que generar un [JWT token](https://jwt.io/introduction) -y mandarlo en la respuesta, para el usuario puede usar con peticiones futuros. +y mandarlo en la respuesta, para que el usuario puede usarlo en sus peticiones futuras. Para ejemplos con mas detalle, busca tutoriales de autenticacion con JWT y node/express. ### TODO 4: Implementar el middleware de autenticación -En `middleware/auth.js` hay varios `TODOs`. Usa este oportunidad a familiarizarte +En `middleware/auth.js` hay varios `TODOs`. Usa esta oportunidad para familiarizarte con [el concepto de middleware en express](https://expressjs.com/es/guide/using-middleware.html). -La aplicacion va a usar este middleware para chequear que los peticiones -que requiere autenticacion son autorizados, que tiene un token valido. +La aplicación va a usar este middleware para chequear que las peticiones +que requieren autenticación sean autorizados, es decir, que tienen un token válido. ### TODO 5: Implemenatar la ruta GET `/users` Para juntar y verificar todo el trabajo que has hecho, seria bueno implementar -una ruta basica del API, en este caso recomendamos `/users` porque ya debes -tener el user admin en tu base de datos, y este ruta usa el middleware de auth. +una ruta básica del API, en este caso recomendamos `/users` porque ya debes +tener el user admin en tu base de datos, y además porque esta ruta usa el middleware de auth. -Vas a ver que la ruta `/users` usa la funcion `getUsers` que es definido en +Vas a ver que la ruta `/users` usa la funcion `getUsers` que está definido en `controller/users.js`. El concepto de controller nos sirve para separar más la logica de la definición de rutas con la implementacion que va a hablar con el base de datos. Hay que implementar `getUsers` para obtener la lista de -users del colleción en tu base de datos. +users de la colección en tu base de datos. Revisa [el tutorial de Node y express en Mozilla](https://developer.mozilla.org/en-US/docs/Learn/Server-side/Express_Nodejs/routes) que habla de controllers. @@ -250,10 +250,10 @@ Esto levanta la aplicación con `npm start` y corre los tests contra la URL de esta instancia (por defecto `http://127.0.0.1:8080`). Esto asume que la base de datos está disponible. -Los pruebas e2e depende en codigo de (`globalSetup.js`)[../e2e/globalSetup.js] -que `jest` sabe correr primero, antes de los tests. +Los pruebas e2e dependen del código de (`globalSetup.js`)[../e2e/globalSetup.js] +que `jest` ejecuta en primer lugar, antes de los tests. En este paso de setup, levantamos un mock db (como hemos hablado de [`mongodb-memory-server`](https://github.com/nodkz/mongodb-memory-server)) y jest se conecta a este mock db. -Para este configuracion - usamos `mongodb-memory-server` y un preset (`jest-mongodb`)[https://github.com/shelfio/jest-mongodb]. +Para este configuracion usamos `mongodb-memory-server` y un preset (`jest-mongodb`)[https://github.com/shelfio/jest-mongodb]. From e9fd40bd201fb4d416ddf4949f4f1872523a42f6 Mon Sep 17 00:00:00 2001 From: ivy Date: Tue, 9 May 2023 14:30:21 -0500 Subject: [PATCH 29/43] remove MySQL and add code link for snippet --- .../04-burger-queen-api/guides/GETTING-STARTED-MONGODB.md | 8 +++++--- projects/04-burger-queen-api/index.js | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.md b/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.md index 6c76cdc58..1d435f07c 100644 --- a/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.md +++ b/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.md @@ -37,7 +37,7 @@ Puedes interactuar con MongoDB sin Compass y solo en la linea de comando, pero un GUI puede ayudarte visualizar y entender lo que está en la base de datos. Sigue [las instrucciones de instalacion de Compass](https://www.mongodb.com/docs/compass/current/install/). -## 2. Levanta la base de datos y server +## 2. Levanta la base de datos y servidor Podemos decir que este proyecto tiene dos "servicios", uno es la base de datos para almanecenar los productos, usuarios, etc., y el otro es el servidor para exponer @@ -62,7 +62,7 @@ o tu instalación en particular, para ejemplos en cómo levantarlo. ## 3. Elegir módulo (cliente) -Ahora que ya tenemos un servidor de bases de datos vamos a necesitar elegir un +Ahora que ya tenemos un servidor de base de datos, vamos a necesitar elegir un módulo o librería diseñado para interactuar con nuestra base de datos desde Node.js. Existen un montón de opciones, pero para este proyecto te recomendamos usar el [Node driver de MongoDB](https://www.mongodb.com/docs/drivers/node/current/) @@ -79,6 +79,8 @@ estamos asignando en la propiedad `dbUrl` del módulo `config`. exports.dbUrl = process.env.DB_URL || "mongodb://localhost:27017/test"; ``` +https://github.com/Laboratoria/bootcamp/blob/main/projects/04-burger-queen-api/config.js#L2 + Ahora que ya sabemos dónde encontrar el _connection string_ (en el módulo config), podemos proceder a establecer una conexión con la base de datos usando el cliente elegido. @@ -135,7 +137,7 @@ En el `index.js` donde arrancamos express y el API, hay: const { port, dbUrl, secret } = config; const app = express(); -// TODO: Conexión a la Base de Datos (MongoDB o MySQL) +// TODO: Conexión a la Base de Datos ``` Aquí debes usar el `dbUrl` que importamos del config para establecer la conexión, diff --git a/projects/04-burger-queen-api/index.js b/projects/04-burger-queen-api/index.js index ae55a7290..7b635e3a4 100644 --- a/projects/04-burger-queen-api/index.js +++ b/projects/04-burger-queen-api/index.js @@ -8,7 +8,7 @@ const pkg = require('./package.json'); const { port, dbUrl, secret } = config; const app = express(); -// TODO: Conexión a la Base de Datos (MongoDB o MySQL) +// TODO: Conexión a la Base de Datos app.set('config', config); app.set('pkg', pkg); From 1b9d2603db4d3fb3aa69035f61d899adcf571e94 Mon Sep 17 00:00:00 2001 From: ivy Date: Tue, 9 May 2023 15:03:40 -0500 Subject: [PATCH 30/43] mas correciones de spelling, con uso de extension --- projects/04-burger-queen-api/README.md | 12 ++-- .../guides/GETTING-STARTED-MONGODB.md | 61 ++++++++++--------- 2 files changed, 37 insertions(+), 36 deletions(-) diff --git a/projects/04-burger-queen-api/README.md b/projects/04-burger-queen-api/README.md index 5f5950619..9daa1227c 100644 --- a/projects/04-burger-queen-api/README.md +++ b/projects/04-burger-queen-api/README.md @@ -45,7 +45,7 @@ Esto implica que tendremos que partir por leer la implementación existente, y familiarizarnos con el _stack_ elegido ([Node.js](https://nodejs.org/) y [Express](https://expressjs.com/)) y complementarlo con un motor de bases de datos. Recomendamos el uso de [MongoDB](https://www.mongodb.com/) y tenemos una -[guia para empezar con MongoDB](./GETTING-STARTED-MONGO-DB.md). +[guía para empezar con MongoDB](./GETTING-STARTED-MONGO-DB.md). La clienta nos ha dado un [link a la documentación](https://app.swaggerhub.com/apis-docs/ssinuco/BurgerQueenAPI/2.0.0) que especifica el comportamiento esperado de la API que expondremos por @@ -68,7 +68,7 @@ headers, body, status codes...), **JSON**, **JWT** (_JSON Web Tokens_), ## 3. Objetivos de aprendizaje -> ℹ️ Esta sección será auomáticamente generada en el idioma pertinente, a partir +> ℹ️ Esta sección será automáticamente generada en el idioma pertinente, a partir > de los objetivos de aprendizaje declarados en [`project.yml`](./project.yml), > al crear el repo del proyecto para un cohort en particular usando > [`./scripts/create-cohort-project.js`](../../scripts#create-cohort-project-coaches). @@ -181,7 +181,7 @@ npm start 8888 Nuestra aplicación usa las siguientes variables de entorno: -* `PORT`: Si no se ha especificado un puerto como argumento de lína de comando, +* `PORT`: Si no se ha especificado un puerto como argumento de línea de comando, podemos usar la variable de entorno `PORT` para especificar el puerto. Valor por defecto `8080`. * `DB_URL`: El _string_ de conexión de _MongoDB_. Cuando ejecutemos la @@ -204,7 +204,7 @@ Nuestra aplicación usa las siguientes variables de entorno: ### 5.3 Despliegue (Deployment) Puedes elegir el proveedor (o proveedores) que prefieras junto -con el mecanismo de despligue y estrategia de alojamiento. Te recomendamos +con el mecanismo de despliegue y estrategia de alojamiento. Te recomendamos explorar las siguientes opciones: * [Vercel](https://vercel.com/) es una opción enfocada @@ -231,7 +231,7 @@ la configuración de base de datos. Ten en cuenta que como vas a tener dos servidores corriendo sobre una misma configuración, deberás exponer los servicios en diferentes puertos. -Lee la [**guia para docker**] (./GETTING-STARTED-DOCKER.md) +Lee la [**guía para docker**] (./GETTING-STARTED-DOCKER.md) incluido en el proyecto para mas información. Para probar tu configuración de docker, te recomendamos usar `docker-compose` @@ -239,7 +239,7 @@ localmente (en tu computadora) para ejecutar la aplicación junto con la base de datos. Con respecto al despliegue, puedes elegir el proveedor (o proveedores) -que prefieras junto con el mecanismo de despligue y estrategia de alojamiento. +que prefieras junto con el mecanismo de despliegue y estrategia de alojamiento. Te recomendamos explorar las siguientes opciones: * Si quieres explorar opciones más personalizadas y ver docker del lado del diff --git a/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.md b/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.md index 1d435f07c..af150d92d 100644 --- a/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.md +++ b/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.md @@ -5,7 +5,7 @@ a día de hoy en el ecosistema de Node.js. Si vas a trabajar con MongoDB y Docker, mejor lee primero [**la guía de _primeros pasos con Docker_**](./GETTING-STARTED-DOCKER.md). -Si vas a instalar MongoDB y desarollar el proyecto sin +Si vas a instalar MongoDB y desarrollar el proyecto sin Docker en este momento, sigue leyendo esta guía. Una vez creado tu fork y clonado el repo en tu computadora, haces `npm install` @@ -31,16 +31,16 @@ Elige tu plataforma (Windows, Mac, Ubuntu etc) y sigue [el tutorial](https://www Con los tutoriales, vas a descargar y instalar MongoDB en tu sistema, con algunas herramientas y comandos para usar en la línea de comando. -Tambien recomendamos que instales [Compass](https://www.mongodb.com/products/compass), +También recomendamos que instales [Compass](https://www.mongodb.com/products/compass), que es un GUI (Graphical User Interface) para interactuar con la base de datos. Puedes interactuar con MongoDB sin Compass y solo en la linea de comando, -pero un GUI puede ayudarte visualizar y entender lo que está en la base de datos. Sigue [las -instrucciones de instalacion de Compass](https://www.mongodb.com/docs/compass/current/install/). +pero un GUI puede ayudarte visualizar y entender lo que está en +la base de datos. Sigue [las instrucciones de instalación de Compass](https://www.mongodb.com/docs/compass/current/install/). ## 2. Levanta la base de datos y servidor Podemos decir que este proyecto tiene dos "servicios", uno es la base de datos para -almanecenar los productos, usuarios, etc., y el otro es el servidor para exponer +almacenar los productos, usuarios, etc., y el otro es el servidor para exponer el API. Estos servicios tienen que estar corriendo, para que @@ -55,9 +55,9 @@ Por ejemplo, en MacOS si instalaste con `homebrew`, puede usar `mongod --config /usr/local/etc/mongod.conf --fork`. En Windows, hay que levantarlo desde Services console. -Revisa [la guia de instalacion de +Revisa [la guía de instalación de ](https://www.mongodb.com/docs/manual/tutorial/install-mongodb-on-os-x/#run-mongodb-community-edition), -[guia de instalacion de Windows](https://www.mongodb.com/docs/manual/tutorial/install-mongodb-on-windows/#run-mongodb-community-edition-as-a-windows-service), +[guía de instalación de Windows](https://www.mongodb.com/docs/manual/tutorial/install-mongodb-on-windows/#run-mongodb-community-edition-as-a-windows-service), o tu instalación en particular, para ejemplos en cómo levantarlo. ## 3. Elegir módulo (cliente) @@ -76,11 +76,9 @@ estamos asignando en la propiedad `dbUrl` del módulo `config`. ```js // `config.js` -exports.dbUrl = process.env.DB_URL || "mongodb://localhost:27017/test"; +exports.dbUrl = process.env.MONGO_URL || process.env.DB_URL || 'mongodb://127.0.0.1:27017/test'; ``` -https://github.com/Laboratoria/bootcamp/blob/main/projects/04-burger-queen-api/config.js#L2 - Ahora que ya sabemos dónde encontrar el _connection string_ (en el módulo config), podemos proceder a establecer una conexión con la base de datos usando el cliente elegido. @@ -106,8 +104,7 @@ async function run() { run().catch(console.error); ``` -Puedes encontrar mas ejemplos en [la documentación de MongoDB](https://www.mongodb.com/docs/drivers/node/current/) -y también en [un tutorial de w3schools](https://www.w3schools.com/mongodb/mongodb_nodejs_connect_database.php). +Puedes encontrar mas ejemplos en [la documentación de MongoDB](https://www.mongodb.com/docs/drivers/node/current/). ## 4. Definir esquemas @@ -122,10 +119,11 @@ que describe la estructura de `products`, `orders`, etc. para guiar el diseño. ## 5. Implementar primeros TODOs -El boilerplate del proyecto viene con archivos con logica para arrancar el server +El boilerplate del proyecto viene con archivos con lógica para arrancar el server y otros que contienen funciones de rutas y autenticación, pero muchas están vacías. -Hemos marcado las primeras partes esenciales con comentarios `TODO` (del inglés _por hacer_), que es una -convención en el desarollo de software, cuando queda algo pendiente de hacer. +Hemos marcado las primeras partes esenciales con comentarios `TODO` +(del inglés _por hacer_), que es una convención en el desarrollo de software, +cuando queda algo pendiente de hacer. Aquí te guiamos un poco sobre esto ToDo's. @@ -141,15 +139,16 @@ const app = express(); ``` Aquí debes usar el `dbUrl` que importamos del config para establecer la conexión, -quiza a través de una funcion que defines en un modulo y luego importas desde el index. +quizá a través de una función que defines en un modulo y luego importas desde +el index. ### TODO 2: Crear el usuario _admin_ -EL proyecto depende en la existencia de un usuario en el base de datos que +EL proyecto depende en la existencia de un usuario en la base de datos que tiene privilegios de administrador, para así poder crear otros usuarios, etc. -En `routes/users.js` invocamos una funcion `initAdminUser(app, next)` -al final de archivo, y definimos esta funcion arriba en este misma archivo. +En `routes/users.js` invocamos una función `initAdminUser(app, next)` +al final de archivo, y definimos esta función arriba en este misma archivo. `initAdminUser` está incompleto, y hay un TODO para crear el usuario admin, donde tienes que primero chequear si un admin ya existe, y si no agregar uno @@ -184,11 +183,11 @@ En `routes/auth.js` está la ruta '/auth' definida, con un // TODO: autenticar a la usuarix ``` -Aqui es donde debes verificar que el correo y password coinciden con +Aquí es donde debes verificar que el correo y password coinciden con datos de algún usuario en la base de datos. Si coinciden, hay que generar un [JWT token](https://jwt.io/introduction) y mandarlo en la respuesta, para que el usuario puede usarlo en sus peticiones futuras. -Para ejemplos con mas detalle, busca tutoriales de autenticacion con JWT y node/express. +Para ejemplos con mas detalle, busca tutoriales de autenticación con JWT y node/express. ### TODO 4: Implementar el middleware de autenticación @@ -198,15 +197,16 @@ con [el concepto de middleware en express](https://expressjs.com/es/guide/using- La aplicación va a usar este middleware para chequear que las peticiones que requieren autenticación sean autorizados, es decir, que tienen un token válido. -### TODO 5: Implemenatar la ruta GET `/users` +### TODO 5: Implementar la ruta GET `/users` Para juntar y verificar todo el trabajo que has hecho, seria bueno implementar una ruta básica del API, en este caso recomendamos `/users` porque ya debes -tener el user admin en tu base de datos, y además porque esta ruta usa el middleware de auth. +tener el user admin en tu base de datos, y además porque esta ruta usa +el middleware de auth. -Vas a ver que la ruta `/users` usa la funcion `getUsers` que está definido en +Vas a ver que la ruta `/users` usa la función `getUsers` que está definido en `controller/users.js`. El concepto de controller nos sirve para separar más -la logica de la definición de rutas con la implementacion que va a hablar con +la lógica de la definición de rutas con la implementación que va a hablar con el base de datos. Hay que implementar `getUsers` para obtener la lista de users de la colección en tu base de datos. @@ -236,7 +236,7 @@ la lógica de las rutas. El _boilerplate_ de este proyecto ya incluye pruebas `e2e` (end-to-end) o de _integración_, que se encargan de probar nuestra aplicación en conjunto, -através de la interfaz HTTP. A diferencia de las pruebas unitarias, en vez +a través de la interfaz HTTP. A diferencia de las pruebas unitarias, en vez de importar o requerir un módulo y probar una función de forma aislada, lo que vamos a hacer es arrancar toda la aplicación, y probarla tal como se usaría en el mundo real, para ello la aplicación de prueba necesitará una base de datos y @@ -249,13 +249,14 @@ npm run test:e2e ``` Esto levanta la aplicación con `npm start` y corre los tests contra la URL de -esta instancia (por defecto `http://127.0.0.1:8080`). Esto asume que la base de -datos está disponible. +esta instancia (por defecto `http://127.0.0.1:8080`). Los pruebas e2e dependen del código de (`globalSetup.js`)[../e2e/globalSetup.js] que `jest` ejecuta en primer lugar, antes de los tests. -En este paso de setup, levantamos un mock db (como hemos hablado de +Este paso de setup levanta un mock db (como hemos hablado de [`mongodb-memory-server`](https://github.com/nodkz/mongodb-memory-server)) y jest se conecta a este mock db. -Para este configuracion usamos `mongodb-memory-server` y un preset (`jest-mongodb`)[https://github.com/shelfio/jest-mongodb]. +Para este configuración usamos `mongodb-memory-server` y +un preset (`jest-mongodb`)[https://github.com/shelfio/jest-mongodb] +que ya están incluido en el boilerplate. From b3e99e3e6fd84c28adef6d23432688ed24da0a6a Mon Sep 17 00:00:00 2001 From: Ivy Feraco Date: Tue, 9 May 2023 15:08:15 -0500 Subject: [PATCH 31/43] Update auth.js --- projects/04-burger-queen-api/routes/auth.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/04-burger-queen-api/routes/auth.js b/projects/04-burger-queen-api/routes/auth.js index de9012958..2ba383895 100644 --- a/projects/04-burger-queen-api/routes/auth.js +++ b/projects/04-burger-queen-api/routes/auth.js @@ -26,7 +26,7 @@ module.exports = (app, nextMain) => { // TODO: autenticar a la usuarix // Hay que confirmar si el email y password - // coincidir con un user en el base de datos + // coinciden con un user en la base de datos // Si coinciden, manda un access token creado con jwt next(); From 692b210fdeb63be9bd7af6cd43da86b0b95b129e Mon Sep 17 00:00:00 2001 From: Ivy Feraco Date: Wed, 10 May 2023 10:45:57 -0500 Subject: [PATCH 32/43] Apply suggestions from code review --- .../04-burger-queen-api/guides/GETTING-STARTED-MONGODB.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.md b/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.md index af150d92d..257a69049 100644 --- a/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.md +++ b/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.md @@ -117,7 +117,7 @@ guardar en esas colecciones. Puedes usar [la documentación de API](https://app.swaggerhub.com/apis-docs/ssinuco/BurgerQueenAPI/2.0.0) que describe la estructura de `products`, `orders`, etc. para guiar el diseño. -## 5. Implementar primeros TODOs +## 5. Implementar los primeros TODOs El boilerplate del proyecto viene con archivos con lógica para arrancar el server y otros que contienen funciones de rutas y autenticación, pero muchas están vacías. @@ -258,5 +258,5 @@ Este paso de setup levanta un mock db (como hemos hablado de y jest se conecta a este mock db. Para este configuración usamos `mongodb-memory-server` y -un preset (`jest-mongodb`)[https://github.com/shelfio/jest-mongodb] +un preset [`jest-mongodb`](https://github.com/shelfio/jest-mongodb) que ya están incluido en el boilerplate. From c2512d858fc3913b4d64828608300a34d74c2ad6 Mon Sep 17 00:00:00 2001 From: ivy Date: Wed, 10 May 2023 16:16:46 -0500 Subject: [PATCH 33/43] update pt README --- projects/04-burger-queen-api/README.pt.md | 137 +++++++++------------- 1 file changed, 55 insertions(+), 82 deletions(-) diff --git a/projects/04-burger-queen-api/README.pt.md b/projects/04-burger-queen-api/README.pt.md index 283fa559b..066b7ece2 100644 --- a/projects/04-burger-queen-api/README.pt.md +++ b/projects/04-burger-queen-api/README.pt.md @@ -7,8 +7,8 @@ * [3. Objetivos de aprendizagem](#3-objetivos-de-aprendizagem) * [4. Considerações gerais](#4-considerações-gerais) * [5. Critérios de aceitação mínimos do projeto](#5-critérios-de-aceitação-mínimos-do-projeto) -* [6. Pistas, tips e leituras complementares](#6-pistas-tips-e-leituras-complementares) -* [7 HTTP API Checklist](#7-http-api-checklist) +* [6. Hacker (Devops) Edition con Docker](#6-edição-hacker-devops-com-docker) +* [7. Pistas, tips e leituras complementares](#7-pistas-tips-e-leituras-complementares) ## 1. Prefácio @@ -41,10 +41,14 @@ de maneira relativamente simples, tudo isso usando JavaScript! Neste projeto partimos de um _boilerplate_ que já contém uma série de _endpoints_ (pontos de conexão ou URLs) e nos pedem para completar a aplicação. -Isto implica que teremos que começar a ler a implementação existente, e -familiarizar-nos com a _stack_ escolhida ([Node.js](https://nodejs.org/) e -[Express](https://expressjs.com/)) e complementá-la com um motor de banco de dados, -no qual você deverá escolher entre [MongoDB](https://www.mongodb.com/), +Isso implica que teremos que começar lendo a implementação existente e nos +familiarizar com o _stack_ escolhido ([Node.js](https://nodejs.org/) e +[Express](https://expressjs.com/)), além de complementá-lo com um motor de +banco de dados. Recomendamos o uso do [MongoDB](https://www.mongodb.com/) +e temos [um guia para começar com o MongoDB.](./GETTING-STARTED-MONGO-DB.pt.md) + + +[MongoDB](https://www.mongodb.com/), [PostgreSQL](https://www.postgresql.org/) e [MySQL](https://www.mysql.com/). O cliente nos deu um @@ -56,8 +60,8 @@ implementar na aplicação, que parâmetros esperam, o que devem responder, etc. O objetivo de aprendizagem principal é adquirir experiência com o **Node.js** como ferramenta para desenvolvimento de _aplicações de servidor_, junto com uma série -de outras ferramentas comumente utilizadas nesse contexto (Express como framework, -MongoDB, PostgreSQL ou MySQL como base de dados, containers de docker, etc). +de outras ferramentas comumente utilizadas nesse contexto (Express como +framework, MongoDB como base de dados, etc.). Neste projeto, você desenvolverá um servidor web que deverá _servir_ `JSON` através de uma conexão `HTTP`, e implantá-lo em um servidor na nuvem. @@ -65,8 +69,7 @@ através de uma conexão `HTTP`, e implantá-lo em um servidor na nuvem. Ao final do projeto, você deverá estar familiarizada com conceitos como **rotas** (_routes_), **URLs**, **HTTP** (verbos, request, response, headers, body, status codes, etc), **JSON**, **JWT** (_JSON Web Tokens_), **conexão com uma base de dados** -(`MongoDB`, `PostgreSQL` ou `MySQL`), **variables de ambiente**, **deployment**, -**containers de `docker`**, etc. +(`MongoDB`), **variables de ambiente**, **deployment**, etc. ## 3. Objetivos de aprendizagem @@ -205,31 +208,47 @@ Nossa aplicação usa as seguintes variáveis de ambiente: ### 5.3 Implantação (Deployment) -Nosso cliente nos informou que a sua equipe de _devops_ está sempre com muitas -tarefas, portanto, pediu como requesito que a aplicação esteja configurada -com `docker-compose` para que possa ser implantada sem dificuldades em qualquer -ambiente. - -O _boilerplate_ já conta com uma configuração incial de `docker-compose` para -a aplicação de node, sua tarefa será estender essa configuração para incluir a -configuração do banco de dados escolhido. -Leve em consideração que como terá dois servidores rodando sobre uma mesma -configuração, deverá colocar os serviços em diferentes portas. - -Para este projeto te recomendamos a usar `docker-compose` localmente (em seu -computador) para executar a aplicação junto com a base de dados -selecionada. Por outro lado, em relação a implantação, não é obrigatório usar -`docker-compose`, você pode escolher o provedor (ou provedores) que preferir junto -com o mecanismo de implantação e estratégia de hospedagem. Te recomendamos -explorar as seguintes opcões: - -* [Glitch](https://glitch.com) é provavelmente a opção mais _simples_ -(requer menos configuração) e nos permite hospedar o servidor web Express -importando nosso repositório do GitHub. -* [Vercel](https://vercel.com/) é uma opção semelhante ao Glitch, mas -focada em aplicativos web estáticos (como os construídos com React). -No entanto, o Vercel também nos permite implantar aplicativos node usando +Você pode escolher o provedor (ou provedores) que preferir, juntamente com o mecanismo de implantação e estratégia de hospedagem. Recomendamos que você explore as seguintes opções: + +Vercel é uma opção focada em aplicativos da web estáticos (como os construídos com React). No entanto, o Vercel também nos permite implantar aplicativos node usando Serverless Functions. +MongoDB Atlas é uma ótima opção para hospedar nosso banco de dados de produção, que pode ser usado em conjunto com qualquer uma das opções mencionadas acima. +Se você tiver dúvidas sobre as diferentes opções de implantação (que são várias), não hesite em consultar seus colegas e seus coaches. + +* [Vercel](https://vercel.com/) é uma opção focada em aplicativos +da web estáticos (como os construídos com React). No entanto, +o Vercel também nos permite implantar aplicativos node usando [Serverless Functions](https://vercel.com/docs/serverless-functions/introduction) +[MongoDB Atlas](https://www.mongodb.com/cloud/atlas) +é uma ótima opção para hospedar nosso banco de dados de produção, +que pode ser usado em conjunto com qualquer uma das opções mencionadas acima. + +Se tiver dúvidas sobre as diferentes opções de implantação (que são várias), +não hesite em consultar seus colegas e seus coaches. + +## 6. Edição Hacker (DevOps) com Docker + +Nossa cliente nos informou que sua equipe de DevOps está sempre +ocupada com muitas tarefas, portanto, ela nos pede como requisito que +o aplicativo seja configurado com `docker-compose` para que possa ser +implantado facilmente em qualquer ambiente. + +O boilerplate já possui uma configuração inicial de `docker-compose` +para o aplicativo Node.js, sua tarefa será estender essa configuração para +incluir a configuração do banco de dados. Tenha em mente que, +como você terá dois servidores sendo executados na mesma configuração, +você precisará expor os serviços em portas diferentes. + +Leia o [guia para docker](./GETTING-STARTED-DOCKER.pt.md) incluído +no projeto para mais informações. + +Para testar sua configuração do Docker, recomendamos que você use o +`docker-compose` localmente (em seu computador) para executar o +aplicativo junto com o banco de dados. + +Quanto à implantação, você pode escolher o provedor (ou provedores) +que preferir, juntamente com o mecanismo de implantação e estratégia +de hospedagem. Recomendamos que você explore as seguintes opções: + * Se quiser explorar opções mais personalizadas e ver o docker do lado do servidor, pode considerar provedores como [AWS (Amazon Web Services)](https://aws.amazon.com/) ou @@ -238,60 +257,14 @@ de serviço experimental gratuito (_free tier_) assim como instâncias de servid virtuais (VPS), onde configuramos nosso próprio Docker ou serviços para implantar aplicações em contêineres (por exemplo [Compute Engine](https://cloud.google.com/compute/docs/containers) de GCP ou [Elastic Container Service](https://aws.amazon.com/ecs/) de AWS). -* Se quiser trabalhar com MongoDB, [MongoDB Atlas](https://www.mongodb.com/cloud/atlas) -é uma opção muito boa para hospedar a base dados de produção, que -podemos usar em conjunto com qualquer uma das opções mencionadas acima. -* Se quiser trabalhar com MySQL, [ClearDB](https://www.cleardb.com/) é uma -boa opção para hospedar a base de dados de produção, que podemos usar em -conjunto com qualquer uma das opções mencionadas acima. - -Se tiver dúvidas sobre as diferentes (e múltiplas) opções de implantação, -não hesite em consultar seus colegas e mentores. -## 6. Pistas, tips e leituras complementares +## 7. Pistas, tips e leituras complementares * [Express](https://expressjs.com/) * [MongoDB](https://www.mongodb.com/) -* [PostgreSQL](https://www.postgresql.org/) -* [MySQL](https://www.mysql.com/) +* [MongoDB Node Driver](https://www.mongodb.com/docs/drivers/node/current/) * [docker](https://docs.docker.com/) * [docker compose](https://docs.docker.com/compose/) * [Postman](https://www.getpostman.com) * [Variável de ambiente - Wikipedia](https://pt.wikipedia.org/wiki/Variável_de_ambiente) * [`process.env` - Node.js docs](https://nodejs.org/api/process.html#process_process_env) - -*** - -## 7 HTTP API Checklist - -### 7.1 `/` - -* [ ] `GET /` - -### 7.2 `/auth` - -* [ ] `POST /auth` - -### 7.3 `/users` - -* [ ] `GET /users` -* [ ] `GET /users/:uid` -* [ ] `POST /users` -* [ ] `PATCH /users/:uid` -* [ ] `DELETE /users/:uid` - -### 7.4 `/products` - -* [ ] `GET /products` -* [ ] `GET /products/:productid` -* [ ] `POST /products` -* [ ] `PATCH /products/:productid` -* [ ] `DELETE /products/:productid` - -### 7.5 `/orders` - -* [ ] `GET /orders` -* [ ] `GET /orders/:orderId` -* [ ] `POST /orders` -* [ ] `PATCH /orders/:orderId` -* [ ] `DELETE /orders/:orderId` From 07487b4718ceabe4ef8404022e9bad665f22a336 Mon Sep 17 00:00:00 2001 From: ivy Date: Wed, 10 May 2023 17:34:56 -0500 Subject: [PATCH 34/43] translations in pt, editions of docker readme --- .../guides/GETTING-STARTED-DOCKER.md | 131 +----- .../guides/GETTING-STARTED-DOCKER.pt.md | 373 ++++++++++++++++++ .../guides/GETTING-STARTED-MONGODB.md | 4 +- .../guides/GETTING-STARTED-MONGODB.pt.md | 258 ++++++++++++ 4 files changed, 641 insertions(+), 125 deletions(-) create mode 100644 projects/04-burger-queen-api/guides/GETTING-STARTED-DOCKER.pt.md create mode 100644 projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.pt.md diff --git a/projects/04-burger-queen-api/guides/GETTING-STARTED-DOCKER.md b/projects/04-burger-queen-api/guides/GETTING-STARTED-DOCKER.md index 1e147459d..0bb9d9e44 100644 --- a/projects/04-burger-queen-api/guides/GETTING-STARTED-DOCKER.md +++ b/projects/04-burger-queen-api/guides/GETTING-STARTED-DOCKER.md @@ -8,13 +8,10 @@ Para ello te recomendamos seguir los pasos a continuación: * [2. Instalar `docker` y `docker-compose`](#2-instalar-docker-y-docker-compose) * [3. Configurar "servicio" de base de datos](#3-configurar-servicio-de-base-de-datos) * [4. Configurar conexión a BBDD en "servicio" node](#4-configurar-conexión-a-bbdd-en-servicio-node) -* [5. Elegir módulo (cliente)](#5-elegir-módulo-cliente) -* [6. Iniciar, re-iniciar y parar los servicios con `docker-compose`](#6-iniciar-re-iniciar-y-parar-los-servicios-con-docker-compose) -* [7. Familiarizarte con admisitración de contenedores](#7-familiarizarte-con-admisitración-de-contenedores) -* [8. Opcionalmente, instalar interfaz gráfica para admisitrar data](#8-opcionalmente-instalar-interfaz-gráfica-para-admisitrar-data) -* [9. Definir esquemas](#9-definir-esquemas) -* [10. Definir estrategia de pruebas unitarias](#10-definir-estrategia-de-pruebas-unitarias) -* [11. Familiarizarte con las pruebas de integración (e2e)](#11-familiarizarte-con-las-pruebas-de-integración-e2e) +* [5. Iniciar, re-iniciar y parar los servicios con `docker-compose`](#5-iniciar-re-iniciar-y-parar-los-servicios-con-docker-compose) +* [6. Familiarizarte con administración de contenedores](#6-familiarizarte-con-admisitración-de-contenedores) +* [7. Opcionalmente, instalar interfaz gráfica para administrar data](#7-opcionalmente-instalar-interfaz-gráfica-para-administrar-data) +* [8. Corre las pruebas de integración (e2e)](#8-corre-las-pruebas-de-integración-e2e) *** @@ -168,80 +165,7 @@ contenedores. Siguiendo con los ejemplos del punto anterior, la variable DB_URL: mysql://bq:secret@db:3306/bq ``` -## 5. Elegir módulo (cliente) - -Ahora que ya tenemos un servidor de bases de datos vamos a necesitar elegir un -módulo o librería diseñado para interactuar con nuestra base de datos desde -Node.js. Existen un montón de opciones, pero para este proyecto te recomendamos -elegir una de estas (que son las más populares para cada una de las bases de -datos): [Mongoose](https://mongoosejs.com/) (MongoDB), -[pg](https://www.npmjs.com/package/pg) (PostgreSQL) o -[mysql](https://www.npmjs.com/package/mysql) (MySQL). - -El _boilerplate_ ya incluye un archivo `config.js` donde se leen las -variables de entorno, y entre ellas está `DB_URL`. Como vemos ese valor lo -estamos asignando en la propiedad `dbUrl` del módulo `config`. - -```js -// `config.js` -exports.dbUrl = process.env.DB_URL || "mongodb://localhost:27017/test"; -``` - -Ahora que ya sabemos dónde encontrar el _connection string_ (en el módulo -config), podemos proceder a establecer una conexión con la base de datos -usando el cliente elegido. - -Ejemplo de conexión usando [Mongoose](https://mongoosejs.com/) (MongoDB): - -```js -const mongoose = require("mongoose"); -const config = require("./config"); - -mongoose - .connect(config.dbUrl, { - useNewUrlParser: true, - useUnifiedTopology: true, - }) - .then(console.log) - .catch(console.error); -``` - -Ejemplo de conexión usando [pg](https://www.npmjs.com/package/pg) -(PostgreSQL): - -```js -const pg = require("pg"); -const config = require("./config"); - -const pgClient = new pg.Client({ connectionString: config.dbUrl }); - -pgClient.connect(); -pgClient.query("SELECT NOW()", (err, res) => { - console.log(err, res); - pgClient.end(); -}); -``` - -Ejemplo de conexión usando [mysql](https://www.npmjs.com/package/mysql) -(MySQL): - -```js -const mysql = require("mysql"); -const config = require("./config"); - -const connection = mysql.createConnection(config.dbUrl); - -connection.connect(); -connection.query("SELECT 1 + 1 AS solution", (error, results) => { - if (error) { - return console.error(error); - } - console.log(`The solution is: ${results[0].solution}`); -}); -connection.end(); -``` - -## 6. Iniciar, re-iniciar y parar los servicios con `docker-compose` +## 5. Iniciar, re-iniciar y parar los servicios con `docker-compose` Ahora que ya tenemos nuestra configuración de `docker-compose` lista, veamos cómo podemos _levantar_ la aplicación. Para eso usamos el comando @@ -294,7 +218,7 @@ docker-compose stop db docker-compose restart db ``` -## 7. Familiarizarte con admisitración de contenedores +## 6. Familiarizarte con administración de contenedores Además de los comandos que ya hemos visto de `docker-compose`, te recomendamos familiarizarte con estos otros comandos (entre otros) para poder _administrar_ @@ -350,7 +274,7 @@ podríamos hacer esto: docker-compose help up ``` -## 8. Opcionalmente, instalar interfaz gráfica para administrar data +## 7. Opcionalmente, instalar interfaz gráfica para administrar data A la hora de trabajar con bases de datos es muy común usar algún tipo de interfaz gráfica que nos permita ver y manipular visualmente nuestra data. @@ -418,46 +342,7 @@ NOTA: Para conectar desde pgAdmin usando un contenedor, usa el _nombre_ del contenedor de la base datos (ie: `XXX-001-burger-queen-api_db_1`) como nombre de host para que pgAdmin se pueda conectar a través de la red _privada_. -## 9. Definir esquemas - -Llegado a este punto ya deberíamos tener una configuración de `docker-compose` -capaz de _levantar_ la base datos y servidor de Node.js. - -Como parte del proceso de diseño de nuestra base de datos vamos a tener que -especificar los _esquemas_ de nuestros _modelos_ de datos. Con esto nos -referimos a que tenemos que _describir_ de alguna forma las colecciones o -tablas que vamos a usar y la _forma_ de los objetos o filas que vayamos a -guardar en esas colecciones. - -Si has elegido MongoDB y Mongoose, este último nos ofrece un mecanismo para -describir esos [_modelos_](https://mongoosejs.com/docs/models.html) y -[_esquemas_](https://mongoosejs.com/docs/guide.html) de datos en JavaScript. - -Si has elegido usar una base de datos SQL, es común incluir algunos scripts -`.sql` con el código SQL que nos permita _crear_ (o alterar) las tablas -necesarias. Alternativamente, podrías también explorar abstracciones más -modernas como [Prisma](https://www.prisma.io/). - -## 10. Definir estrategia de pruebas unitarias - -Además de las pruebas `e2e` que ya incluye el _boilerplate_ del proyecto, se -espera que puedas también usar pruebas _unitarias_ para el desarrollo de los -diferentes _endpoints_ o _rutas_ así como otros módulos internos que decidas -desarrollar. - -Para hacer pruebas unitarias de _rutas_ de Express, te recomendamos explorar la -librería [`supertest`](https://www.npmjs.com/package/supertest), que puedes usar -en combinación con `jest`. - -Otro punto a tener en cuenta en las pruebas unitarias, es cómo _mockear_ la base -de datos. Algunas bases de datos ofrecen herramientas (como -[`mongodb-memory-server`](https://github.com/nodkz/mongodb-memory-server)) que -nos permiten usar una base de datos en memoria y así evitar hacer _mocks_ per -se, pero por lo general querremos considerar cómo abstraer la interacción -con la base de datos para facilitar _mocks_ que nos permitan concentrarnos en -la lógica de las rutas. - -## 11. Familiarizarte con las pruebas de integración (e2e) +## 8. Corre las pruebas de integración (e2e) El _boilerplate_ de este proyecto ya incluye pruebas `e2e` (end-to-end) o de _integración_, que se encargan de probar nuestra aplicación en conjunto, diff --git a/projects/04-burger-queen-api/guides/GETTING-STARTED-DOCKER.pt.md b/projects/04-burger-queen-api/guides/GETTING-STARTED-DOCKER.pt.md new file mode 100644 index 000000000..eb884ee2c --- /dev/null +++ b/projects/04-burger-queen-api/guides/GETTING-STARTED-DOCKER.pt.md @@ -0,0 +1,373 @@ +# Primeiros passos + +Depois de criar o fork e clonar o repositório em seu computador, +antes de começar a codificar, precisamos criar nosso _ambiente de desenvolvimento_. +Recomendamos que você siga as etapas a seguir: + +* [1. Escolher o banco de dados](#1-elegir-base-de-datos) +* [2. Instalar `docker` e `docker-compose`](#2-instalar-docker-y-docker-compose) +* [3. Configurar o "serviço" de banco de dados](#3-configurar-servicio-de-base-de-datos) +* [4. Configurar a conexão com o banco de dados no "serviço" node](#4-configurar-conexión-a-bbdd-en-servicio-node) +* [5. Iniciar, reiniciar e parar os serviços com `docker-compose`](#5-iniciar-re-iniciar-y-parar-los-servicios-con-docker-compose) +* [6. Familiarizar-se com a administração de contêineres](#6-familiarizarte-con-admisitración-de-contenedores) +* [7. Opcionalmente, instalar uma interface gráfica para administrar dados](#7-opcionalmente-instalar-interfaz-gráfica-para-administrar-data) +* [8. Execute os testes de integração (e2e)](#8-corre-las-pruebas-de-integración-e2e) + +*** + +## 1. Escolher o banco de dados + +A primeira decisão que devemos tomar antes de começar a programar é escolher +um banco de dados. Neste projeto, sugerimos 3 opções: duas delas são relacionais +e baseadas em SQL (PostgreSQL e MySQL), e a terceira é não relacional (MongoDB). +As 3 são excelentes opções. Recomendamos o uso do MongoDB +para o seu primeiro projeto backend. + +Alguns pontos a serem considerados: + +* O MongoDB é o mais comum (popular) atualmente no ecossistema Node.js. +* Bancos de dados _relacionais_ normalmente exigem mais design prévio +(definir tabelas, colunas, relacionamentos, ...) enquanto os _não relacionais_ +nos permitem ser mais flexíveis. +* Bancos de dados _relacionais_ nos permitem relacionar dados de forma mais +natural e garantir a consistência dos dados. Eles fornecem rigidez que reduz +a flexibilidade, mas oferecem outros tipos de garantias, além de nos permitir +pensar em tabelas e colunas, que é um conceito com o qual muitos já estão +familiarizados. +* O MySQL, o PostgreSQL e o MongoDB (nessa ordem) são os bancos de dados de +código aberto (open source) mais populares em dezembro de 2020](https://www.statista.com/statistics/809750/worldwide-popularity-ranking-database-management-systems/). +Isso no contexto geral dos bancos de dados, não apenas no ecossistema do Node.js. +* PostgreSQL é um banco de dados _objeto-relacional_ (ORDBMS), enquanto +o MySQL é puramente relacional. O PostgreSQL possui suporte nativo para objetos +JSON e outras características, como indexação de JSON. + +## 2. Instale o docker e o docker-compose + +Independentemente do banco de dados que você escolher, neste projeto iremos executar +localmente (em nosso computador) o servidor de banco de dados usando +contêineres do Docker, em vez de instalar o programa diretamente em nosso +computador. Além disso, também iremos usar a ferramenta `docker-compose` para +orquestrar nossos contêineres: banco de dados e servidor web (node). + +Nos seguintes links, você pode ver como instalar o `docker` e o `docker-compose` em +seu sistema operacional. + +* [Get Docker](https://docs.docker.com/get-docker/) +* [Install Docker Compose](https://docs.docker.com/compose/install/) + +## 3. Configurando o "serviço" de banco de dados + +O boilerplate deste projeto inclui um arquivo +[`docker-compose.yml`](./docker-compose.yml) que já contém parte da +configuração do `docker-compose`. Neste arquivo, você verá que existem dois +serviços listados: `db` e `nod`e. Nossa aplicação consistirá em dois servidores: +um servidor de banco de dados (o serviço `db`) e um servidor web implementado +em Node.js (o serviço `node`). + +Na seção correspondente ao serviço `db`, existem três coisas importantes que +precisaremos completar: + +* Qual _imagem_ (`image`) queremos usar. Imagens recomendadas: + [mongo](https://hub.docker.com/_/mongo), + [postgres](https://hub.docker.com/_/postgres) y + [mysql](https://hub.docker.com/_/mysql). +* Quais volumes (`volumes`), arquivos ou pastas queremos mapear para o + contêiner, como por exemplo, o diretório de dados (a pasta onde o + banco de dados irá armazenar seus arquivos). +* As variáveis de ambiente (`environment`) necessárias para configurar nosso + banco de dados e usuários. Esses dados serão utilizados posteriormente + para configurar a conexão a partir do Node.js. + +Exemplo de serviço `db` usando: [MongoDB](https://hub.docker.com/_/mongo): + +```yml +db: + image: mongo:4 + volumes: + - ./db-data:/data/db + environment: + MONGO_INITDB_ROOT_USERNAME: bq + MONGO_INITDB_ROOT_PASSWORD: secret + restart: always + networks: + - private +``` + +Exemplo de serviço `db` usando [PostgreSQL](https://hub.docker.com/_/postgres): + +```yml +db: + image: postgres:13 + volumes: + - ./db-data:/var/lib/postgresql/data + environment: + POSTGRES_PASSWORD: secret + restart: always + networks: + - private +``` + +Exemplo de serviço `db` usando [MySQL](https://hub.docker.com/_/mysql): + +```yml +db: + image: mysql:5 + volumes: + - ./db-data:/var/lib/mysql + environment: + MYSQL_ROOT_PASSWORD: supersecret + MYSQL_DATABASE: bq + MYSQL_USER: bq + MYSQL_PASSWORD: secret + restart: always + networks: + - private +``` + +## 4. Configurar conexão ao BD no serviço node + +Agora que temos a configuração do serviço db, precisamos completar a configuração do +serviço Node.js. Em particular, queremos definir o valor da variável de ambiente `DB_URL`, +onde colocaremos a connection string correspondente ao nosso banco de dados. +Esta string de conexão segue o formato de URL e se parece com isso: + +```text +protocol://username:password@host:port/dbname?opt1=val1&... +``` + +Aqui, substituiremos `protocol` pelo nome do protocolo do banco de dados +escolhido (`mongodb`, `postgresql` ou `mysql`), e `username`, `password` e `dbname` +pelos valores usados na configuração do serviço db no ponto anterior. +Neste caso, o valor de host será `db`, que é o nome do serviço de banco de dados +na configuração do `docker-compose.yml`, e podemos nos referir a ele pelo nome +na rede interna entre os contêineres. +Seguindo os exemplos do ponto anterior, a variável `DB_URL` no `docker-compose.yml` +seria assim: + +* MongoDB: + + ```yml + DB_URL: mongodb://bq:secret@db:27017/bq?authSource=admin + ``` + +* PostgreSQL: + + ```yml + DB_URL: postgresql://postgres:secret@db:5432/postgres?schema=public + ``` + +* MySQL: + + ```yml + DB_URL: mysql://bq:secret@db:3306/bq + ``` + +## 5. Iniciar, reiniciar e parar os serviços com `docker-compose` + +Agora que temos nossa configuração do docker-compose pronta, +vamos ver como podemos iniciar a aplicação. +Para isso, usamos o comando `docker-compose up` dentro da pasta do +nosso projeto (onde está o arquivo `docker-compose.yml`). + +```sh +docker-compose up +``` + +Para interromper o comando e ter o terminal de volta ao _prompt_, você pode usar a +combinação de teclas `Ctrl + C`. + +Se usarmos o comando dessa forma, sem opções, ele iniciará todos os serviços +descritos no `docker-compose.yml`. Alternativamente, podemos iniciar um serviço +específico adicionando o nome do serviço ao comando. +Por exemplo, se quisermos iniciar apenas o serviço de banco de dados: + +```sh +docker-compose up db +``` + + +Também temos a opção de iniciar os serviços e executá-los em segundo plano, +como _daemons_, usando a opção `-d`, para que o prompt seja +imediatamente retornado e os serviços continuem em execução. + +```sh +docker-compose up -d +``` + +Além do comando `docker-compose up`, que constrói, (re)cria, inicia e se conecta +aos contêineres de um serviço, também temos comandos disponíveis para +iniciar (`start`), reiniciar (`restart`) e parar (`stop`) serviços com contêineres +já existentes. + +```sh +docker-compose start +docker-compose stop +docker-compose restart +``` + +Assim como com `docker-compose up`, com esses outros comandos também podemos +especificar com qual serviço queremos interagir (ou com todos, se não for especificado). +Por exemplo, para iniciar, reiniciar e depois parar o servidor de banco de dados: + +```sh +docker-compose start db +docker-compose stop db +docker-compose restart db +``` + +## 7. Familiarize-se com a administração de contêineres + +Além dos comandos que já vimos com `docker-compose`, recomendamos +que você se familiarize com outros comandos (entre outros) para poder _administrar_ +seus contêineres. + +O comando `docker-compose ps` exibe uma lista com os contêineres _ativos_: + +```sh +docker-compose ps +``` + +Também podemos listar _todos_ os contêineres, incluindo os que estão parados, +usando a opção `-a`: + +```sh +docker-compose ps -a +``` + +Para remover os contêineres dos serviços: + +```sh +docker-compose rm +``` + +Assim como nos comandos anteriores, também podemos remover os contêineres +de um serviço específico indicando seu nome: + +```sh +docker-compose rm db +``` + +Por fim, quando executamos nossos serviços em segundo plano, como_ daemons_, para nos +conectarmos aos contêineres e vermos os _logs_, podemos usar: + +```sh +docker-compose logs +``` + +Podemos adicionar também a opção `-f` para fazer streaming dos logs e ficar ouvindo + assim como especificar um serviço em particular. Por exemplo: + +```sh +docker-compose logs -f db +``` + +Lembre-se de sempre consultar a _ajuda_ do `docker-compose` com o comando `help`. +Por exemplo, se quisermos ver a ajuda do subcomando up, poderíamos fazer isso: + +```sh +docker-compose help up +``` + +## 8. Opcionalmente, instale uma interface gráfica para administrar dados + +Ao trabalhar com bancos de dados, é muito comum usar algum tipo de interface gráfica que +nos permita visualizar e manipular nossos dados de forma visual. +Existem opções para cada banco de dados. Recomendamos as seguintes: + +[Compass](https://www.mongodb.com/products/compass) (MongoDB), +[Workbench](https://www.mysql.com/products/workbench/) (MySQL), +[pgAdmin](https://www.pgadmin.org/) (PostgreSQL). + +Se você deseja usar esse tipo de ferramenta (como o `Compass` ou o `Workbench`), +provavelmente precisará tornar seu banco de dados visível fora do Docker. +Para fazer isso, você pode mapear a porta do banco de dados no contêiner +para uma porta disponível no host do Docker (normalmente, seu computador). +Normalmente, vamos mapear essas portas padrão (por exemplo, `27017` para o MongoDB) +para números de porta diferentes, pois esses programas e/ou suas portas podem estar +em uso. Por exemplo, se estivermos usando o MongoDB, poderíamos adicionar +o seguinte mapeamento de portas ao serviço db em nosso `docker-compose.yml`: + +```yaml +ports: + - 28017:27017 +``` + +Ao listar as portas de um contêiner ou serviço no `docker-compose.yml`, +tenha em mente que o número à direita é a porta no contêiner (rede privada do Docker), +enquanto o número à esquerda é a porta no host do Docker +(geralmente o seu computador - `127.0.0.1` ou `localhost`). +No exemplo acima, estamos "mapeando" a porta `27017` do contêiner para a porta `28017` +do host do Docker. + +Se você estiver usando PostgreSQL ou MySQL, as portas que gostaríamos de mapear +seriam `5432` e `330`6, respectivamente. + +Se estamos "expondo" a porta em nosso computador (o "host"), +também será necessário conectar o contêiner `db` à rede "pública": + +```yaml +networks: + - public + - private +``` + +Após essa alteração, você poderá acessar usando `127.0.0.1` ou `localhost` +e a porta à qual mapeamos, `28017` neste exemplo. + +Se você escolher o [pgAdmin](https://www.pgadmin.org/) (PostgreSQL), +a opção mais fácil é usar o pgAdmin como um contêiner e adicioná-lo +como um novo serviço ao nosso `docker-compose.yml`. Por exemplo: + +```yml +pgadmin: + image: dpage/pgadmin4 + restart: always + environment: + PGADMIN_DEFAULT_EMAIL: user@domain.com + PGADMIN_DEFAULT_PASSWORD: secret + ports: + - 8088:80 + networks: + - public + - private +``` + +NOTA: Para conectar desde pgAdmin usando um contêiner, use o _nome_ do contêiner +do banco de dados (por exemplo: `XXX-001-burger-queen-api_db_1`) como nome do host +para que o pgAdmin possa se conectar através da rede _privada_. + +## 11. Execute os testes de integração (e2e) + +O _boilerplate_ deste projeto já inclui testes `e2e` (end-to-end) ou de integração, +que são responsáveis por testar nossa aplicação como um todo, através da interface HTTP. +Ao contrário dos testes unitários, onde importamos ou requeremos um módulo e testamos +uma função de forma isolada, aqui iremos iniciar toda a aplicação e testá-la como +se estivéssemos usando no mundo real. Para isso, os testes de integração +precisarão de um banco de dados e estarão ouvindo em uma porta de rede. + +Para executar os testes e2e em uma instância local, podemos usar: + +```sh +npm run test:e2e +``` + +Isso iniciará a aplicação com `npm start` e executará os testes na +URL desta instância (por padrão `http://127.0.0.1:8080`). +Isso pressupõe que o banco de dados esteja disponível. + +Alternativamente, e talvez mais fácil de usar, podemos iniciar nossa aplicação +usando `docker-compos`e`, ou até mesmo em produção, e em seguida, executar os +testes e2e passando a URL da aplicação na variável de ambiente `REMOTE_URL`. +Por exemplo: + +```sh +REMOTE_URL=http://127.0.0.1:8080 npm run test:e2e +``` + +Ao especificar R`EMOTE_URL`, os testes não tentarão _iniciar_ um servidor local, +mas usarão diretamente a URL fornecida, assumindo que a aplicação esteja disponível +nessa URL. Isso nos permite testar também em URLs remotas. Por exemplo: + +```sh +REMOTE_URL=https://api.my-super-app.com npm run test:e2e +``` diff --git a/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.md b/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.md index af150d92d..c9e336203 100644 --- a/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.md +++ b/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.md @@ -125,7 +125,7 @@ Hemos marcado las primeras partes esenciales con comentarios `TODO` (del inglés _por hacer_), que es una convención en el desarrollo de software, cuando queda algo pendiente de hacer. -Aquí te guiamos un poco sobre esto ToDo's. +Aquí te guiamos un poco sobre esto TODO's. ### TODO 1: Conectar a la base de datos @@ -144,7 +144,7 @@ el index. ### TODO 2: Crear el usuario _admin_ -EL proyecto depende en la existencia de un usuario en la base de datos que +El proyecto depende en la existencia de un usuario en la base de datos que tiene privilegios de administrador, para así poder crear otros usuarios, etc. En `routes/users.js` invocamos una función `initAdminUser(app, next)` diff --git a/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.pt.md b/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.pt.md new file mode 100644 index 000000000..e6d6cd8e6 --- /dev/null +++ b/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.pt.md @@ -0,0 +1,258 @@ +# Primeiros passos com o MongoDB + +O MongoDB é um banco de dados não relacional e é o mais comum (popular) +atualmente no ecossistema Node.js. + +Se você estiver trabalhando com o MongoDB e Docker, é melhor ler primeiro +o guia "Primeiros passos com o Docker". Se você estiver instalando o MongoDB +e desenvolvendo o projeto sem o Docker neste momento, continue lendo este guia. + +Depois de criar o seu fork e clonar o repositório em seu computador, +execute o comando npm install para instalar as dependências básicas. +Antes de começar a codificar, precisamos criar nosso ambiente de desenvolvimento. +Recomendamos seguir os seguintes passos: + +1. [Instalar o MongoDB e o Compass](#1-instalar-o-mongodb-e-o-compass) +2. [Iniciar o banco de dados e o servidor](#2-iniciar-o-banco-de-dados-e-o-servidor) +3. [Escolher o módulo cliente](#3-escolher-um-módulo-cliente) +4. [Definir esquemas](#4-definir-esquemas) +5. [Implementar as primeiras tarefas (TODOs)](#5-implementar-os-primeiros-todos) +6. [Definir estratégia de testes unitários](#6-definir-estratégia-de-testes-unitários) +7. [Familiarizar-se com os testes de integração (e2e)](#7-familiarizar-se-com-os-testes-de-integração-e2e) + +## 1. Instalar o MongoDB e o Compass + +O site do MongoDB possui tutoriais sobre como instalar a [Community Edition](https://www.mongodb.com/docs/compass/current/install/). +Escolha sua plataforma (Windows, Mac, Ubuntu, etc.) e siga [o tutorial](https://www.mongodb.com/docs/manual/installation/#mongodb-installation-tutorials). + +Nos tutoriais, você irá baixar e instalar o MongoDB em seu sistema, +juntamente com algumas ferramentas e comandos para usar no terminal. + +Recomendamos também que você instale o [Compass](https://www.mongodb.com/products/compass), +que é uma GUI (Interface Gráfica do Usuário) para interagir com o banco de dados. +Você pode interagir com o MongoDB sem o Compass apenas no terminal, mas uma +GUI pode ajudá-lo a visualizar e entender o que está no banco de dados. +Siga [as instruções de instalação do Compass](https://www.mongodb.com/docs/compass/current/install/)). + +## 2. Iniciar o banco de dados e o servidor + +Podemos dizer que este projeto possui dois "serviços": +um é o banco de dados para armazenar produtos, usuários, etc., +e o outro é o servidor para expor a API. + +Esses serviços precisam estar em execução para que a API funcione. + +Iniciar o servidor é bastante simples: execute `npm start` para executar +o arquivo [`index.js`](../index.js), que contém a lógica básica de +um servidor com Express. + +Como iniciar o servidor depende da sua instalação e sistema. +Por exemplo, no macOS, se você instalou com o homebrew, pode usar o comando +`brew services start mongodb-community@6.0` para iniciá-lo. +Ou, sem o homebrew, utilize `mongod --config /usr/local/etc/mongod.conf --fork`. +No Windows, é necessário iniciar o serviço pelo console de serviços. + +Consulte o [guia de instalação para macOS](https://www.mongodb.com/docs/manual/tutorial/install-mongodb-on-os-x/#run-mongodb-community-edition), [guia de instalação para Windows](https://www.mongodb.com/docs/manual/tutorial/install-mongodb-on-windows/#run-mongodb-community-edition-as-a-windows-service) +ou a documentação específica da sua instalação para obter exemplos de como +iniciar o servidor. + +## 3. Escolher um módulo (cliente) + +Agora que já temos um servidor de banco de dados, precisamos escolher +um módulo ou biblioteca projetado para interagir com nosso banco de dados +a partir do Node.js. Existem muitas opções, mas para este projeto, +recomendamos o uso do [Node driver do MongoDB](https://www.mongodb.com/docs/drivers/node/current/) +que é a forma mais direta de interagir com sua instância do MongoDB. + +É necessário instalar o Node Driver neste projeto usando o `npm`. + +O _boilerplate_ já inclui um arquivo config.js onde as variáveis +de ambiente são lidas, e uma delas é DB_URL. Conforme podemos ver, +esse valor está sendo atribuído à propriedade dbUrl do módulo config. + +```js +// `config.js` +exports.dbUrl = process.env.MONGO_URL || process.env.DB_URL || 'mongodb://127.0.0.1:27017/test'; +``` + +Agora que sabemos onde encontrar a _connection string_ (no módulo config), +podemos prosseguir e estabelecer uma conexão com o banco de dados usando +o cliente escolhido. + +### Exemplo de conexão usando o driver do MongoDB para Node.js + +```js +const { MongoClient } = require('mongodb'); +const config = require("./config"); + +const client = new MongoClient(config.dbUrl); + +async function run() { + try { + await client.connect(); + const db = client.db('test'); + // ... + } finally { + // Close the database connection when finished or an error occurs + await client.close(); + } +} +run().catch(console.error); +``` + +Você pode encontrar mais exemplos [na documentação do MongoDB](https://www.mongodb.com/docs/drivers/node/current/). + +## 4. Definir esquemas + +Como parte do processo de design do nosso banco de dados, precisamos especificar os +"esquemas" dos nossos "modelos" de dados. Isso significa que precisamos descrever +de alguma forma a estrutura das coleções que vamos usar e a forma dos objetos +que vamos armazenar nessas coleções. + +Você pode usar [a documentación de API](https://app.swaggerhub.com/apis-docs/ssinuco/BurgerQueenAPI/2.0.0) +que descreve a estrutura de `products`, `orders`, etc. para orientar o design. + +## 5. Implementar os primeiros TODOs + +O boilerplate do projeto vem com arquivos contendo a lógica para iniciar o +servidor e outros que contêm funções de rotas e autenticação, mas muitos deles estão +vazios. Marcamos as primeiras partes essenciais com comentários +"TODO" (em inglês, `a fazer`), que é uma convenção no desenvolvimento de software +para indicar algo a ser feito. + +Aqui vamos orientá-lo um pouco sobre esses TODOs. + +### TODO 1: Conectar a la base de datos + +No arquivo `index.js` onde iniciamos o Express e a API, há: + +```js +const { port, dbUrl, secret } = config; +const app = express(); + +// TODO: Conexión a la Base de Datos +``` + +Aqui você deve usar o `dbUrl` que importamos do arquivo de configuração +para estabelecer a conexão, talvez através de uma função que você define +em um módulo e depois importa no index. + +### TODO 2: Criar o usuário _admin_ + +O projeto depende da existência de um usuário no banco de dados que possui privilégios +de administrador, para que seja possível criar outros usuários, etc. + +No arquivo `routes/users.js` invocamos a função `initAdminUser(app, next)` +no final do arquivo, e definimos essa função acima, no mesmo arquivo. + +A função `initAdminUser` está incompleta e há um TODO para criar o usuário admin, +onde você precisa primeiro verificar se um admin já existe e, caso contrário, +adicioná-lo ao banco de dados. + +```js +const initAdminUser = (app, next) => { + const { adminEmail, adminPassword } = app.get('config'); + if (!adminEmail || !adminPassword) { + return next(); + } + + const adminUser = { + email: adminEmail, + password: bcrypt.hashSync(adminPassword, 10), + roles: { admin: true }, + }; + + // TODO: crear usuaria admin + next(); +}; + +Você pode confirmar se o seu código funciona verificando o banco de +dados e realizando um teste unitário. + +``` + +### TODO 3: Implementar autenticación de usuario + +En routes/auth.js, a rota '/auth' está definida com um + +```js + // TODO: autenticar a la usuarix + ``` + +Aqui é onde você deve verificar se o email e a senha correspondem aos dados de +algum usuário no banco de dados. Se coincidirem, é necessário gerar um +[token JWT](https://jwt.io/introduction) +e enviá-lo na resposta, para que o usuário possa usá-lo em suas futuras solicitações. +Para exemplos mais detalhados, procure tutoriais de autenticação com JWT e node/express. + +### TODO 4: Implementar o middleware de autenticação + +Em `middleware/auth.js`, existem vários TODOs. +Aproveite esta oportunidade para se familiarizar com o [conceito de middleware no express](https://expressjs.com/es/guide/using-middleware.html). + +A aplicação usará esse middleware para verificar se as solicitações que exigem +autenticação são autorizadas, ou seja, se possuem um token válido. + +### TODO 5: Implementar a rota GET `/users` + +Para reunir e verificar todo o trabalho que você fez, seria bom implementar +uma rota básica da API, neste caso, recomendamos `/users` porque você já deve +ter o usuário admin em seu banco de dados, e também porque essa rota usa o +middleware de autenticação. + +Você verá que a rota `/users` usa a função `getUsers` que está definida +em `controller/users.js`. +O conceito de controller é usado para separar ainda mais a lógica da definição +de rotas da implementação que irá interagir com o banco de dados. +É necessário implementar a função `getUsers` para obter a lista de +usuários da coleção em seu banco de dados. + +Consulte o [tutorial de Node.js e express na Mozilla ](https://developer.mozilla.org/en-US/docs/Learn/Server-side/Express_Nodejs/routes) +que aborda os controllers. + +## 6. Definir estratégia de testes unitários + +Além dos testes `e2e` já incluídos no boilerplate do projeto, espera-se +que você também possa usar testes unitários para o desenvolvimento +dos diferentes endpoints ou rotas, bem como outros módulos internos +que decidir desenvolver. + +Para realizar testes unitários em `rotas` do Express, +recomendamos explorar a biblioteca [`supertest`](https://www.npmjs.com/package/supertest), +, que pode ser usada em combinação com o `jest`. + +Outro ponto a ser considerado nos testes unitários é como fazer `mock` do banco de dados. +Alguns bancos de dados oferecem ferramentas (como o +[`mongodb-memory-server`](https://github.com/nodkz/mongodb-memory-server)) que nos +permitem usar um banco de dados em memória e evitar a necessidade de criar `mocks` +propriamente ditos. No entanto, geralmente queremos considerar como +abstrair a interação com o banco de dados para facilitar os `mocks` que nos +permitirão focar na lógica das rotas. + +## 7. Familiarizar-se com os testes de integração (e2e) + +O _boilerplate_ deste projeto já inclui testes `e2e` (end-to-end) ou +de integração, que são responsáveis por testar nossa aplicação como um +todo, por meio da interface HTTP. Ao contrário dos testes unitários, +em vez de importar ou exigir um módulo e testar uma função isoladamente, +iremos iniciar toda a aplicação e testá-la como seria usado no mundo real, +para isso, a aplicação de teste precisará de um banco de dados e escutar em +uma porta de rede. + +Para executar testes `e2e` em uma instância local, podemos usar: + +```sh +npm run test:e2e +``` + +Isso inicia a aplicação com npm start e executa os testes contra a URL desta instância (por padrão, http://127.0.0.1:8080). + +Os testes e2e dependem do código (`globalSetup.js`)[../e2e/globalSetup.js] +que o jest executa primeiro, antes dos testes. Essa etapa de configuração +inicia um banco de dados falso (como mencionamos anteriormente, usando o +[`mongodb-memory-server`](https://github.com/nodkz/mongodb-memory-server)) +e o jest se conecta a esse banco de dados falso. + +Para essa configuração, usamos o mongodb-memory-server e um preset +[`jest-mongodb`](https://github.com/shelfio/jest-mongodb) +que ya están incluido en el boilerplate. From 298d952e2520c321253023a9db92030825ac5d84 Mon Sep 17 00:00:00 2001 From: ivy Date: Wed, 10 May 2023 17:40:36 -0500 Subject: [PATCH 35/43] borra parte 1 de docker, es redundante --- .../guides/GETTING-STARTED-DOCKER.md | 57 +++++-------------- .../guides/GETTING-STARTED-DOCKER.pt.md | 55 +++++------------- 2 files changed, 28 insertions(+), 84 deletions(-) diff --git a/projects/04-burger-queen-api/guides/GETTING-STARTED-DOCKER.md b/projects/04-burger-queen-api/guides/GETTING-STARTED-DOCKER.md index 0bb9d9e44..69f4440b3 100644 --- a/projects/04-burger-queen-api/guides/GETTING-STARTED-DOCKER.md +++ b/projects/04-burger-queen-api/guides/GETTING-STARTED-DOCKER.md @@ -4,46 +4,17 @@ Una vez creado tu fork y clonado el repo en tu computadora, antes de poder comenzar a codear, tenemos primero que crear nuestro _entorno de desarrollo_. Para ello te recomendamos seguir los pasos a continuación: -* [1. Elegir base de datos](#1-elegir-base-de-datos) -* [2. Instalar `docker` y `docker-compose`](#2-instalar-docker-y-docker-compose) -* [3. Configurar "servicio" de base de datos](#3-configurar-servicio-de-base-de-datos) -* [4. Configurar conexión a BBDD en "servicio" node](#4-configurar-conexión-a-bbdd-en-servicio-node) -* [5. Iniciar, re-iniciar y parar los servicios con `docker-compose`](#5-iniciar-re-iniciar-y-parar-los-servicios-con-docker-compose) -* [6. Familiarizarte con administración de contenedores](#6-familiarizarte-con-admisitración-de-contenedores) -* [7. Opcionalmente, instalar interfaz gráfica para administrar data](#7-opcionalmente-instalar-interfaz-gráfica-para-administrar-data) -* [8. Corre las pruebas de integración (e2e)](#8-corre-las-pruebas-de-integración-e2e) +* [1. Instalar `docker` y `docker-compose`](#1-instalar-docker-y-docker-compose) +* [2. Configurar "servicio" de base de datos](#2-configurar-servicio-de-base-de-datos) +* [3. Configurar conexión a BBDD en "servicio" node](#3-configurar-conexión-a-bbdd-en-servicio-node) +* [4. Iniciar, re-iniciar y parar los servicios con `docker-compose`](#4-iniciar-re-iniciar-y-parar-los-servicios-con-docker-compose) +* [5. Familiarizarte con administración de contenedores](#5-familiarizarte-con-admisitración-de-contenedores) +* [6. Opcionalmente, instalar interfaz gráfica para administrar data](#6-opcionalmente-instalar-interfaz-gráfica-para-administrar-data) +* [7. Corre las pruebas de integración (e2e)](#7-corre-las-pruebas-de-integración-e2e) *** -## 1. Elegir base de datos - -La primera decisión que tenemos que tomar, antes de comenzar a programar, es -elegir una base de datos. En este proyecto se sugieren 3 opciones: dos de ellas -_relacionales_ y basadas en SQL, (PostgreSQL y MySQL), y otra _no relacional_ -(MongoDB). Las 3 son excelentes opciones. Recomendamos `MongoDB` para tu primer -proyecto backend. - -Algunos puntos a tener en cuenta: - -* MongoDB es la más _común_ (popular) a día de hoy en el ecosistema de - Node.js. -* Las bases de datos _relacionales_ normalmente requieren más diseño - _a priori_ (definir tablas, columnas, relaciones, ...) mientras que las - _no relacionales_ nos permiten ser más _flexibles_. -* Las bases de datos _relacionales_ nos permiten relacionar datos de forma - más natural y garantizar la consistencia de la data. Nos dan una rigidez - que quita _flexibilidad_ pero agrega otro tipo de garantías, además de - permitirnos pensar en tablas y columnas, que es una idea con la que muchas - ya están familiarizadas. -* MySQL, PostgreSQL y MongoDB (en ese orden) son las [bases de datos de - código abierto (Open Source) más populares a diciembre de 2020](https://www.statista.com/statistics/809750/worldwide-popularity-ranking-database-management-systems/). - Esto en el panorama general de las bases de datos, no solo el ecosistema de - Node.js. -* PostgreSQL es una base datos _objeto-relacional_ (ORDBMS), mientras que - MySQL es puramente relacional. PostgreSQL tiene soporte nativo para objetos - JSON y otras características como indización de JSON. - -## 2. Instalar `docker` y `docker-compose` +## 1. Instalar `docker` y `docker-compose` Independientemente de qué base datos elijas, en este proyecto vamos a ejecutar localmente (en nuestra computadora) el servidor de bases de datos usando @@ -57,7 +28,7 @@ tu sistema opetativo. * [Get Docker](https://docs.docker.com/get-docker/) * [Install Docker Compose](https://docs.docker.com/compose/install/) -## 3. Configurar "servicio" de base de datos +## 2. Configurar "servicio" de base de datos El boilerplate de este proyecto incluye un archivo [`docker-compose.yml`](./docker-compose.yml) que ya contiene parte de la @@ -126,7 +97,7 @@ db: - private ``` -## 4. Configurar conexión a BBDD en "servicio" node +## 3. Configurar conexión a BBDD en "servicio" node Ahora que ya tenemos la configuración del _servicio_ `db`, tenemos que completar la configuración del _servicio_ de Node.js. En particular nos @@ -165,7 +136,7 @@ contenedores. Siguiendo con los ejemplos del punto anterior, la variable DB_URL: mysql://bq:secret@db:3306/bq ``` -## 5. Iniciar, re-iniciar y parar los servicios con `docker-compose` +## 4. Iniciar, re-iniciar y parar los servicios con `docker-compose` Ahora que ya tenemos nuestra configuración de `docker-compose` lista, veamos cómo podemos _levantar_ la aplicación. Para eso usamos el comando @@ -218,7 +189,7 @@ docker-compose stop db docker-compose restart db ``` -## 6. Familiarizarte con administración de contenedores +## 5. Familiarizarte con administración de contenedores Además de los comandos que ya hemos visto de `docker-compose`, te recomendamos familiarizarte con estos otros comandos (entre otros) para poder _administrar_ @@ -274,7 +245,7 @@ podríamos hacer esto: docker-compose help up ``` -## 7. Opcionalmente, instalar interfaz gráfica para administrar data +## 6. Opcionalmente, instalar interfaz gráfica para administrar data A la hora de trabajar con bases de datos es muy común usar algún tipo de interfaz gráfica que nos permita ver y manipular visualmente nuestra data. @@ -342,7 +313,7 @@ NOTA: Para conectar desde pgAdmin usando un contenedor, usa el _nombre_ del contenedor de la base datos (ie: `XXX-001-burger-queen-api_db_1`) como nombre de host para que pgAdmin se pueda conectar a través de la red _privada_. -## 8. Corre las pruebas de integración (e2e) +## 7. Corre las pruebas de integración (e2e) El _boilerplate_ de este proyecto ya incluye pruebas `e2e` (end-to-end) o de _integración_, que se encargan de probar nuestra aplicación en conjunto, diff --git a/projects/04-burger-queen-api/guides/GETTING-STARTED-DOCKER.pt.md b/projects/04-burger-queen-api/guides/GETTING-STARTED-DOCKER.pt.md index eb884ee2c..4bc7853de 100644 --- a/projects/04-burger-queen-api/guides/GETTING-STARTED-DOCKER.pt.md +++ b/projects/04-burger-queen-api/guides/GETTING-STARTED-DOCKER.pt.md @@ -4,44 +4,17 @@ Depois de criar o fork e clonar o repositório em seu computador, antes de começar a codificar, precisamos criar nosso _ambiente de desenvolvimento_. Recomendamos que você siga as etapas a seguir: -* [1. Escolher o banco de dados](#1-elegir-base-de-datos) -* [2. Instalar `docker` e `docker-compose`](#2-instalar-docker-y-docker-compose) -* [3. Configurar o "serviço" de banco de dados](#3-configurar-servicio-de-base-de-datos) -* [4. Configurar a conexão com o banco de dados no "serviço" node](#4-configurar-conexión-a-bbdd-en-servicio-node) -* [5. Iniciar, reiniciar e parar os serviços com `docker-compose`](#5-iniciar-re-iniciar-y-parar-los-servicios-con-docker-compose) -* [6. Familiarizar-se com a administração de contêineres](#6-familiarizarte-con-admisitración-de-contenedores) -* [7. Opcionalmente, instalar uma interface gráfica para administrar dados](#7-opcionalmente-instalar-interfaz-gráfica-para-administrar-data) -* [8. Execute os testes de integração (e2e)](#8-corre-las-pruebas-de-integración-e2e) +* [1. Instalar `docker` e `docker-compose`](#1-instalar-docker-y-docker-compose) +* [2. Configurar o "serviço" de banco de dados](#2-configurar-servicio-de-base-de-datos) +* [3. Configurar a conexão com o banco de dados no "serviço" node](#3-configurar-conexión-a-bbdd-en-servicio-node) +* [4. Iniciar, reiniciar e parar os serviços com `docker-compose`](#4-iniciar-re-iniciar-y-parar-los-servicios-con-docker-compose) +* [5. Familiarizar-se com a administração de contêineres](#5-familiarizarte-con-admisitración-de-contenedores) +* [6. Opcionalmente, instalar uma interface gráfica para administrar dados](#6-opcionalmente-instalar-interfaz-gráfica-para-administrar-data) +* [7. Execute os testes de integração (e2e)](#7-corre-las-pruebas-de-integración-e2e) *** -## 1. Escolher o banco de dados - -A primeira decisão que devemos tomar antes de começar a programar é escolher -um banco de dados. Neste projeto, sugerimos 3 opções: duas delas são relacionais -e baseadas em SQL (PostgreSQL e MySQL), e a terceira é não relacional (MongoDB). -As 3 são excelentes opções. Recomendamos o uso do MongoDB -para o seu primeiro projeto backend. - -Alguns pontos a serem considerados: - -* O MongoDB é o mais comum (popular) atualmente no ecossistema Node.js. -* Bancos de dados _relacionais_ normalmente exigem mais design prévio -(definir tabelas, colunas, relacionamentos, ...) enquanto os _não relacionais_ -nos permitem ser mais flexíveis. -* Bancos de dados _relacionais_ nos permitem relacionar dados de forma mais -natural e garantir a consistência dos dados. Eles fornecem rigidez que reduz -a flexibilidade, mas oferecem outros tipos de garantias, além de nos permitir -pensar em tabelas e colunas, que é um conceito com o qual muitos já estão -familiarizados. -* O MySQL, o PostgreSQL e o MongoDB (nessa ordem) são os bancos de dados de -código aberto (open source) mais populares em dezembro de 2020](https://www.statista.com/statistics/809750/worldwide-popularity-ranking-database-management-systems/). -Isso no contexto geral dos bancos de dados, não apenas no ecossistema do Node.js. -* PostgreSQL é um banco de dados _objeto-relacional_ (ORDBMS), enquanto -o MySQL é puramente relacional. O PostgreSQL possui suporte nativo para objetos -JSON e outras características, como indexação de JSON. - -## 2. Instale o docker e o docker-compose +## 1. Instale o docker e o docker-compose Independentemente do banco de dados que você escolher, neste projeto iremos executar localmente (em nosso computador) o servidor de banco de dados usando @@ -55,7 +28,7 @@ seu sistema operacional. * [Get Docker](https://docs.docker.com/get-docker/) * [Install Docker Compose](https://docs.docker.com/compose/install/) -## 3. Configurando o "serviço" de banco de dados +## 2. Configurando o "serviço" de banco de dados O boilerplate deste projeto inclui um arquivo [`docker-compose.yml`](./docker-compose.yml) que já contém parte da @@ -124,7 +97,7 @@ db: - private ``` -## 4. Configurar conexão ao BD no serviço node +## 3. Configurar conexão ao BD no serviço node Agora que temos a configuração do serviço db, precisamos completar a configuração do serviço Node.js. Em particular, queremos definir o valor da variável de ambiente `DB_URL`, @@ -162,7 +135,7 @@ seria assim: DB_URL: mysql://bq:secret@db:3306/bq ``` -## 5. Iniciar, reiniciar e parar os serviços com `docker-compose` +## 4. Iniciar, reiniciar e parar os serviços com `docker-compose` Agora que temos nossa configuração do docker-compose pronta, vamos ver como podemos iniciar a aplicação. @@ -215,7 +188,7 @@ docker-compose stop db docker-compose restart db ``` -## 7. Familiarize-se com a administração de contêineres +## 5. Familiarize-se com a administração de contêineres Além dos comandos que já vimos com `docker-compose`, recomendamos que você se familiarize com outros comandos (entre outros) para poder _administrar_ @@ -268,7 +241,7 @@ Por exemplo, se quisermos ver a ajuda do subcomando up, poderíamos fazer isso: docker-compose help up ``` -## 8. Opcionalmente, instale uma interface gráfica para administrar dados +## 6. Opcionalmente, instale uma interface gráfica para administrar dados Ao trabalhar com bancos de dados, é muito comum usar algum tipo de interface gráfica que nos permita visualizar e manipular nossos dados de forma visual. @@ -336,7 +309,7 @@ NOTA: Para conectar desde pgAdmin usando um contêiner, use o _nome_ do contêin do banco de dados (por exemplo: `XXX-001-burger-queen-api_db_1`) como nome do host para que o pgAdmin possa se conectar através da rede _privada_. -## 11. Execute os testes de integração (e2e) +## 7. Execute os testes de integração (e2e) O _boilerplate_ deste projeto já inclui testes `e2e` (end-to-end) ou de integração, que são responsáveis por testar nossa aplicação como um todo, através da interface HTTP. From 44a0c7871ac9f51f32f91e2a7b97c3539a418720 Mon Sep 17 00:00:00 2001 From: ivy Date: Thu, 11 May 2023 09:40:47 -0500 Subject: [PATCH 36/43] mdlint fixes --- projects/04-burger-queen-api/README.pt.md | 19 +++--- .../guides/GETTING-STARTED-DOCKER.pt.md | 62 ++++++++++--------- .../guides/GETTING-STARTED-MONGODB.pt.md | 42 +++++++------ 3 files changed, 68 insertions(+), 55 deletions(-) diff --git a/projects/04-burger-queen-api/README.pt.md b/projects/04-burger-queen-api/README.pt.md index 066b7ece2..48cbf20ee 100644 --- a/projects/04-burger-queen-api/README.pt.md +++ b/projects/04-burger-queen-api/README.pt.md @@ -47,7 +47,6 @@ familiarizar com o _stack_ escolhido ([Node.js](https://nodejs.org/) e banco de dados. Recomendamos o uso do [MongoDB](https://www.mongodb.com/) e temos [um guia para começar com o MongoDB.](./GETTING-STARTED-MONGO-DB.pt.md) - [MongoDB](https://www.mongodb.com/), [PostgreSQL](https://www.postgresql.org/) e [MySQL](https://www.mysql.com/). @@ -208,15 +207,21 @@ Nossa aplicação usa as seguintes variáveis de ambiente: ### 5.3 Implantação (Deployment) -Você pode escolher o provedor (ou provedores) que preferir, juntamente com o mecanismo de implantação e estratégia de hospedagem. Recomendamos que você explore as seguintes opções: +Você pode escolher o provedor (ou provedores) que preferir, +juntamente com o mecanismo de implantação e estratégia de hospedagem. +Recomendamos que você explore as seguintes opções: -Vercel é uma opção focada em aplicativos da web estáticos (como os construídos com React). No entanto, o Vercel também nos permite implantar aplicativos node usando Serverless Functions. -MongoDB Atlas é uma ótima opção para hospedar nosso banco de dados de produção, que pode ser usado em conjunto com qualquer uma das opções mencionadas acima. -Se você tiver dúvidas sobre as diferentes opções de implantação (que são várias), não hesite em consultar seus colegas e seus coaches. +Vercel é uma opção focada em aplicativos da web estáticos +(como os construídos com React). No entanto, o Vercel também nos permite +implantar aplicativos node usando Serverless Functions. +MongoDB Atlas é uma ótima opção para hospedar nosso banco de dados de produção, +que pode ser usado em conjunto com qualquer uma das opções mencionadas acima. +Se você tiver dúvidas sobre as diferentes opções de implantação +(que são várias), não hesite em consultar seus colegas e seus coaches. * [Vercel](https://vercel.com/) é uma opção focada em aplicativos da web estáticos (como os construídos com React). No entanto, -o Vercel também nos permite implantar aplicativos node usando +o Vercel também nos permite implantar aplicativos node usando [Serverless Functions](https://vercel.com/docs/serverless-functions/introduction) [MongoDB Atlas](https://www.mongodb.com/cloud/atlas) é uma ótima opção para hospedar nosso banco de dados de produção, @@ -238,7 +243,7 @@ incluir a configuração do banco de dados. Tenha em mente que, como você terá dois servidores sendo executados na mesma configuração, você precisará expor os serviços em portas diferentes. -Leia o [guia para docker](./GETTING-STARTED-DOCKER.pt.md) incluído +Leia o [guia para docker](./GETTING-STARTED-DOCKER.pt.md) incluído no projeto para mais informações. Para testar sua configuração do Docker, recomendamos que você use o diff --git a/projects/04-burger-queen-api/guides/GETTING-STARTED-DOCKER.pt.md b/projects/04-burger-queen-api/guides/GETTING-STARTED-DOCKER.pt.md index 4bc7853de..63042a114 100644 --- a/projects/04-burger-queen-api/guides/GETTING-STARTED-DOCKER.pt.md +++ b/projects/04-burger-queen-api/guides/GETTING-STARTED-DOCKER.pt.md @@ -22,8 +22,8 @@ contêineres do Docker, em vez de instalar o programa diretamente em nosso computador. Além disso, também iremos usar a ferramenta `docker-compose` para orquestrar nossos contêineres: banco de dados e servidor web (node). -Nos seguintes links, você pode ver como instalar o `docker` e o `docker-compose` em -seu sistema operacional. +Nos seguintes links, você pode ver como instalar o `docker` e o `docker-compose` +em seu sistema operacional. * [Get Docker](https://docs.docker.com/get-docker/) * [Install Docker Compose](https://docs.docker.com/compose/install/) @@ -99,10 +99,11 @@ db: ## 3. Configurar conexão ao BD no serviço node -Agora que temos a configuração do serviço db, precisamos completar a configuração do -serviço Node.js. Em particular, queremos definir o valor da variável de ambiente `DB_URL`, -onde colocaremos a connection string correspondente ao nosso banco de dados. -Esta string de conexão segue o formato de URL e se parece com isso: +Agora que temos a configuração do serviço db, precisamos completar a +configuração do serviço Node.js. Em particular, queremos definir o valor +da variável de ambiente `DB_URL`, onde colocaremos a connection string +correspondente ao nosso banco de dados. Esta string de conexão segue +o formato de URL e se parece com isso: ```text protocol://username:password@host:port/dbname?opt1=val1&... @@ -113,7 +114,7 @@ escolhido (`mongodb`, `postgresql` ou `mysql`), e `username`, `password` e `dbna pelos valores usados na configuração do serviço db no ponto anterior. Neste caso, o valor de host será `db`, que é o nome do serviço de banco de dados na configuração do `docker-compose.yml`, e podemos nos referir a ele pelo nome -na rede interna entre os contêineres. +na rede interna entre os contêineres. Seguindo os exemplos do ponto anterior, a variável `DB_URL` no `docker-compose.yml` seria assim: @@ -137,7 +138,7 @@ seria assim: ## 4. Iniciar, reiniciar e parar os serviços com `docker-compose` -Agora que temos nossa configuração do docker-compose pronta, +Agora que temos nossa configuração do docker-compose pronta, vamos ver como podemos iniciar a aplicação. Para isso, usamos o comando `docker-compose up` dentro da pasta do nosso projeto (onde está o arquivo `docker-compose.yml`). @@ -146,8 +147,8 @@ nosso projeto (onde está o arquivo `docker-compose.yml`). docker-compose up ``` -Para interromper o comando e ter o terminal de volta ao _prompt_, você pode usar a -combinação de teclas `Ctrl + C`. +Para interromper o comando e ter o terminal de volta ao _prompt_, +você pode usar a combinação de teclas `Ctrl + C`. Se usarmos o comando dessa forma, sem opções, ele iniciará todos os serviços descritos no `docker-compose.yml`. Alternativamente, podemos iniciar um serviço @@ -158,9 +159,8 @@ Por exemplo, se quisermos iniciar apenas o serviço de banco de dados: docker-compose up db ``` - Também temos a opção de iniciar os serviços e executá-los em segundo plano, -como _daemons_, usando a opção `-d`, para que o prompt seja +como _daemons_, usando a opção `-d`, para que o prompt seja imediatamente retornado e os serviços continuem em execução. ```sh @@ -220,8 +220,8 @@ de um serviço específico indicando seu nome: docker-compose rm db ``` -Por fim, quando executamos nossos serviços em segundo plano, como_ daemons_, para nos -conectarmos aos contêineres e vermos os _logs_, podemos usar: +Por fim, quando executamos nossos serviços em segundo plano, como _daemons_, +para nos conectarmos aos contêineres e vermos os _logs_, podemos usar: ```sh docker-compose logs @@ -234,8 +234,9 @@ Podemos adicionar também a opção `-f` para fazer streaming dos logs e ficar o docker-compose logs -f db ``` -Lembre-se de sempre consultar a _ajuda_ do `docker-compose` com o comando `help`. -Por exemplo, se quisermos ver a ajuda do subcomando up, poderíamos fazer isso: +Lembre-se de sempre consultar a _ajuda_ do `docker-compose` com o +comando `help`. Por exemplo, se quisermos ver a ajuda do subcomando +up, poderíamos fazer isso: ```sh docker-compose help up @@ -243,8 +244,8 @@ docker-compose help up ## 6. Opcionalmente, instale uma interface gráfica para administrar dados -Ao trabalhar com bancos de dados, é muito comum usar algum tipo de interface gráfica que -nos permita visualizar e manipular nossos dados de forma visual. +Ao trabalhar com bancos de dados, é muito comum usar algum tipo de interface +gráfica que nos permita visualizar e manipular nossos dados de forma visual. Existem opções para cada banco de dados. Recomendamos as seguintes: [Compass](https://www.mongodb.com/products/compass) (MongoDB), @@ -266,11 +267,11 @@ ports: ``` Ao listar as portas de um contêiner ou serviço no `docker-compose.yml`, -tenha em mente que o número à direita é a porta no contêiner (rede privada do Docker), -enquanto o número à esquerda é a porta no host do Docker -(geralmente o seu computador - `127.0.0.1` ou `localhost`). -No exemplo acima, estamos "mapeando" a porta `27017` do contêiner para a porta `28017` -do host do Docker. +tenha em mente que o número à direita é a porta no contêiner +(rede privada do Docker), enquanto o número à esquerda é a porta no +host do Docker (geralmente o seu computador - `127.0.0.1` ou `localhost`). +No exemplo acima, estamos "mapeando" a porta `27017` do contêiner para a +porta `28017` do host do Docker. Se você estiver usando PostgreSQL ou MySQL, as portas que gostaríamos de mapear seriam `5432` e `330`6, respectivamente. @@ -312,11 +313,12 @@ para que o pgAdmin possa se conectar através da rede _privada_. ## 7. Execute os testes de integração (e2e) O _boilerplate_ deste projeto já inclui testes `e2e` (end-to-end) ou de integração, -que são responsáveis por testar nossa aplicação como um todo, através da interface HTTP. -Ao contrário dos testes unitários, onde importamos ou requeremos um módulo e testamos -uma função de forma isolada, aqui iremos iniciar toda a aplicação e testá-la como -se estivéssemos usando no mundo real. Para isso, os testes de integração -precisarão de um banco de dados e estarão ouvindo em uma porta de rede. +que são responsáveis por testar nossa aplicação como um todo, através da +interface HTTP. Ao contrário dos testes unitários, onde importamos ou requeremos +um módulo e testamos uma função de forma isolada, aqui iremos iniciar toda a +aplicação e testá-la como se estivéssemos usando no mundo real. Para isso, +os testes de integração precisarão de um banco de dados e estarão ouvindo em +uma porta de rede. Para executar os testes e2e em uma instância local, podemos usar: @@ -329,7 +331,7 @@ URL desta instância (por padrão `http://127.0.0.1:8080`). Isso pressupõe que o banco de dados esteja disponível. Alternativamente, e talvez mais fácil de usar, podemos iniciar nossa aplicação -usando `docker-compos`e`, ou até mesmo em produção, e em seguida, executar os +usando `docker-compose`, ou até mesmo em produção, e em seguida, executar os testes e2e passando a URL da aplicação na variável de ambiente `REMOTE_URL`. Por exemplo: @@ -337,7 +339,7 @@ Por exemplo: REMOTE_URL=http://127.0.0.1:8080 npm run test:e2e ``` -Ao especificar R`EMOTE_URL`, os testes não tentarão _iniciar_ um servidor local, +Ao especificar `REMOTE_URL`, os testes não tentarão _iniciar_ um servidor local, mas usarão diretamente a URL fornecida, assumindo que a aplicação esteja disponível nessa URL. Isso nos permite testar também em URLs remotas. Por exemplo: diff --git a/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.pt.md b/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.pt.md index e6d6cd8e6..f60e38f7a 100644 --- a/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.pt.md +++ b/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.pt.md @@ -52,7 +52,9 @@ Por exemplo, no macOS, se você instalou com o homebrew, pode usar o comando Ou, sem o homebrew, utilize `mongod --config /usr/local/etc/mongod.conf --fork`. No Windows, é necessário iniciar o serviço pelo console de serviços. -Consulte o [guia de instalação para macOS](https://www.mongodb.com/docs/manual/tutorial/install-mongodb-on-os-x/#run-mongodb-community-edition), [guia de instalação para Windows](https://www.mongodb.com/docs/manual/tutorial/install-mongodb-on-windows/#run-mongodb-community-edition-as-a-windows-service) +Consulte o +[guia de instalação para macOS](https://www.mongodb.com/docs/manual/tutorial/install-mongodb-on-os-x/#run-mongodb-community-edition), +[guia de instalação para Windows](https://www.mongodb.com/docs/manual/tutorial/install-mongodb-on-windows/#run-mongodb-community-edition-as-a-windows-service) ou a documentação específica da sua instalação para obter exemplos de como iniciar o servidor. @@ -100,14 +102,15 @@ async function run() { run().catch(console.error); ``` -Você pode encontrar mais exemplos [na documentação do MongoDB](https://www.mongodb.com/docs/drivers/node/current/). +Você pode encontrar mais exemplos +[na documentação do MongoDB](https://www.mongodb.com/docs/drivers/node/current/). ## 4. Definir esquemas -Como parte do processo de design do nosso banco de dados, precisamos especificar os -"esquemas" dos nossos "modelos" de dados. Isso significa que precisamos descrever -de alguma forma a estrutura das coleções que vamos usar e a forma dos objetos -que vamos armazenar nessas coleções. +Como parte do processo de design do nosso banco de dados, precisamos +especificar os "esquemas" dos nossos "modelos" de dados. Isso significa +que precisamos descrever de alguma forma a estrutura das coleções que +vamos usar e a forma dos objetos que vamos armazenar nessas coleções. Você pode usar [a documentación de API](https://app.swaggerhub.com/apis-docs/ssinuco/BurgerQueenAPI/2.0.0) que descreve a estrutura de `products`, `orders`, etc. para orientar o design. @@ -180,15 +183,17 @@ En routes/auth.js, a rota '/auth' está definida com um ``` Aqui é onde você deve verificar se o email e a senha correspondem aos dados de -algum usuário no banco de dados. Se coincidirem, é necessário gerar um +algum usuário no banco de dados. Se coincidirem, é necessário gerar um [token JWT](https://jwt.io/introduction) -e enviá-lo na resposta, para que o usuário possa usá-lo em suas futuras solicitações. -Para exemplos mais detalhados, procure tutoriais de autenticação com JWT e node/express. +e enviá-lo na resposta, para que o usuário possa usá-lo em suas futuras +solicitações. Para exemplos mais detalhados, procure tutoriais de autenticação +com JWT e node/express. ### TODO 4: Implementar o middleware de autenticação -Em `middleware/auth.js`, existem vários TODOs. -Aproveite esta oportunidade para se familiarizar com o [conceito de middleware no express](https://expressjs.com/es/guide/using-middleware.html). +Em `middleware/auth.js`, existem vários TODOs. +Aproveite esta oportunidade para se familiarizar com o +[conceito de middleware no express](https://expressjs.com/es/guide/using-middleware.html). A aplicação usará esse middleware para verificar se as solicitações que exigem autenticação são autorizadas, ou seja, se possuem um token válido. @@ -202,12 +207,12 @@ middleware de autenticação. Você verá que a rota `/users` usa a função `getUsers` que está definida em `controller/users.js`. -O conceito de controller é usado para separar ainda mais a lógica da definição -de rotas da implementação que irá interagir com o banco de dados. +O conceito de controller é usado para separar ainda mais a lógica da +definição de rotas da implementação que irá interagir com o banco de dados. É necessário implementar a função `getUsers` para obter a lista de usuários da coleção em seu banco de dados. -Consulte o [tutorial de Node.js e express na Mozilla ](https://developer.mozilla.org/en-US/docs/Learn/Server-side/Express_Nodejs/routes) +Consulte o [tutorial de Node.js e express na Mozilla](https://developer.mozilla.org/en-US/docs/Learn/Server-side/Express_Nodejs/routes) que aborda os controllers. ## 6. Definir estratégia de testes unitários @@ -221,8 +226,8 @@ Para realizar testes unitários em `rotas` do Express, recomendamos explorar a biblioteca [`supertest`](https://www.npmjs.com/package/supertest), , que pode ser usada em combinação com o `jest`. -Outro ponto a ser considerado nos testes unitários é como fazer `mock` do banco de dados. -Alguns bancos de dados oferecem ferramentas (como o +Outro ponto a ser considerado nos testes unitários é como fazer `mock` do banco +de dados. Alguns bancos de dados oferecem ferramentas (como o [`mongodb-memory-server`](https://github.com/nodkz/mongodb-memory-server)) que nos permitem usar um banco de dados em memória e evitar a necessidade de criar `mocks` propriamente ditos. No entanto, geralmente queremos considerar como @@ -245,11 +250,12 @@ Para executar testes `e2e` em uma instância local, podemos usar: npm run test:e2e ``` -Isso inicia a aplicação com npm start e executa os testes contra a URL desta instância (por padrão, http://127.0.0.1:8080). +Isso inicia a aplicação com npm start e executa os testes contra a +URL desta instância (por padrão, `http://127.0.0.1:8080`). Os testes e2e dependem do código (`globalSetup.js`)[../e2e/globalSetup.js] que o jest executa primeiro, antes dos testes. Essa etapa de configuração -inicia um banco de dados falso (como mencionamos anteriormente, usando o +inicia um banco de dados falso (como mencionamos anteriormente, usando o [`mongodb-memory-server`](https://github.com/nodkz/mongodb-memory-server)) e o jest se conecta a esse banco de dados falso. From 6ede5527f9b61b467babbb98f08bee582a579678 Mon Sep 17 00:00:00 2001 From: ivy Date: Tue, 16 May 2023 12:24:58 -0500 Subject: [PATCH 37/43] cambios de connect y TODOs --- projects/04-burger-queen-api/connect.js | 10 +++++ .../guides/GETTING-STARTED-MONGODB.md | 38 +++++++++++-------- .../guides/GETTING-STARTED-MONGODB.pt.md | 33 ++++++++-------- projects/04-burger-queen-api/index.js | 4 +- projects/04-burger-queen-api/routes/users.js | 2 + 5 files changed, 50 insertions(+), 37 deletions(-) create mode 100644 projects/04-burger-queen-api/connect.js diff --git a/projects/04-burger-queen-api/connect.js b/projects/04-burger-queen-api/connect.js new file mode 100644 index 000000000..8d288c261 --- /dev/null +++ b/projects/04-burger-queen-api/connect.js @@ -0,0 +1,10 @@ +const config = require('./config'); + +// eslint-disable-next-line no-unused-vars +const { dbUrl } = config; + +async function connect() { + // TODO: Conexión a la Base de Datos +} + +module.exports = { connect }; diff --git a/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.md b/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.md index ae98e53c0..dafc1bd96 100644 --- a/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.md +++ b/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.md @@ -65,10 +65,11 @@ o tu instalación en particular, para ejemplos en cómo levantarlo. Ahora que ya tenemos un servidor de base de datos, vamos a necesitar elegir un módulo o librería diseñado para interactuar con nuestra base de datos desde Node.js. Existen un montón de opciones, pero para este proyecto te recomendamos -usar el [Node driver de MongoDB](https://www.mongodb.com/docs/drivers/node/current/) +usar el [Node.js driver de MongoDB](https://www.mongodb.com/docs/drivers/node/current/) que es la forma más directa de interactuar con tu instancia de MongoDB. -Hay que instalar el Node Driver en este proyecto usando `npm`. +Hay que instalar el Node.js Driver en este proyecto usando `npm`, +[revisa los docs por más info](https://www.mongodb.com/docs/drivers/node/current/quick-start/download-and-install/#install-the-node.js-driver). El _boilerplate_ ya incluye un archivo `config.js` donde se leen las variables de entorno, y entre ellas está `DB_URL`. Como vemos ese valor lo @@ -91,17 +92,15 @@ const config = require("./config"); const client = new MongoClient(config.dbUrl); -async function run() { +async function connect() { try { await client.connect(); - const db = client.db('test'); - // ... - } finally { - // Close the database connection when finished or an error occurs - await client.close(); + const db = client.db(); // Reemplaza por el nombre del db + return db; + } catch (error) { + // } } -run().catch(console.error); ``` Puedes encontrar mas ejemplos en [la documentación de MongoDB](https://www.mongodb.com/docs/drivers/node/current/). @@ -129,18 +128,19 @@ Aquí te guiamos un poco sobre esto TODO's. ### TODO 1: Conectar a la base de datos -En el `index.js` donde arrancamos express y el API, hay: +En el `connect.js` hay que conectar al base de datos. ```js -const { port, dbUrl, secret } = config; -const app = express(); +const { dbUrl } = config; -// TODO: Conexión a la Base de Datos +async function connect() { + // TODO: Conexión a la Base de Datos +} ``` -Aquí debes usar el `dbUrl` que importamos del config para establecer la conexión, -quizá a través de una función que defines en un modulo y luego importas desde -el index. +Aquí debes usar el `dbUrl` que importamos del config para establecer la conexión. +Las funciones que van a interactuar con la base de datos tienen que invocar +`connect`. ### TODO 2: Crear el usuario _admin_ @@ -213,6 +213,12 @@ users de la colección en tu base de datos. Revisa [el tutorial de Node y express en Mozilla](https://developer.mozilla.org/en-US/docs/Learn/Server-side/Express_Nodejs/routes) que habla de controllers. +### TODO 6: Implementar a rota POST `/users` + +Os testes e2e invocam a rota POST /users para adicionar a usuária aos testes. +Portanto, antes de poder executar os testes e2e, essa rota deve funcionar +corretamente. + ## 6. Definir estrategia de pruebas unitarias Además de las pruebas `e2e` que ya incluye el _boilerplate_ del proyecto, se diff --git a/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.pt.md b/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.pt.md index f60e38f7a..3bb05f3b5 100644 --- a/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.pt.md +++ b/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.pt.md @@ -63,10 +63,11 @@ iniciar o servidor. Agora que já temos um servidor de banco de dados, precisamos escolher um módulo ou biblioteca projetado para interagir com nosso banco de dados a partir do Node.js. Existem muitas opções, mas para este projeto, -recomendamos o uso do [Node driver do MongoDB](https://www.mongodb.com/docs/drivers/node/current/) +recomendamos o uso do [Node.js driver do MongoDB](https://www.mongodb.com/docs/drivers/node/current/) que é a forma mais direta de interagir com sua instância do MongoDB. -É necessário instalar o Node Driver neste projeto usando o `npm`. +É necessário instalar o Node.js Driver neste projeto usando o `npm`, +[verifique os documentos para mais informações](https://www.mongodb.com/docs/drivers/node/current/quick-start/download-and-install/#install-the-node.js-driver). O _boilerplate_ já inclui um arquivo config.js onde as variáveis de ambiente são lidas, e uma delas é DB_URL. Conforme podemos ver, @@ -87,19 +88,15 @@ o cliente escolhido. const { MongoClient } = require('mongodb'); const config = require("./config"); -const client = new MongoClient(config.dbUrl); - -async function run() { +async function connect() { try { await client.connect(); - const db = client.db('test'); - // ... - } finally { - // Close the database connection when finished or an error occurs - await client.close(); + const db = client.db(); // Reemplaza por el nombre del db + return db; + } catch (error) { + // } } -run().catch(console.error); ``` Você pode encontrar mais exemplos @@ -127,18 +124,18 @@ Aqui vamos orientá-lo um pouco sobre esses TODOs. ### TODO 1: Conectar a la base de datos -No arquivo `index.js` onde iniciamos o Express e a API, há: +No arquivo `connect.js`, é necessário conectar ao banco de dados.. ```js -const { port, dbUrl, secret } = config; -const app = express(); +const { dbUrl } = config; -// TODO: Conexión a la Base de Datos +async function connect() { + // TODO: Conexão com o Banco de Dados +} ``` -Aqui você deve usar o `dbUrl` que importamos do arquivo de configuração -para estabelecer a conexão, talvez através de uma função que você define -em um módulo e depois importa no index. +Aqui você deve usar o `dbUrl` que importamos do config para estabelecer a conexão. +As funções que vão interagir com o banco de dados devem invocar o `connect`. ### TODO 2: Criar o usuário _admin_ diff --git a/projects/04-burger-queen-api/index.js b/projects/04-burger-queen-api/index.js index 7b635e3a4..01495c960 100644 --- a/projects/04-burger-queen-api/index.js +++ b/projects/04-burger-queen-api/index.js @@ -5,11 +5,9 @@ const errorHandler = require('./middleware/error'); const routes = require('./routes'); const pkg = require('./package.json'); -const { port, dbUrl, secret } = config; +const { port, secret } = config; const app = express(); -// TODO: Conexión a la Base de Datos - app.set('config', config); app.set('pkg', pkg); diff --git a/projects/04-burger-queen-api/routes/users.js b/projects/04-burger-queen-api/routes/users.js index 73b446125..2ce774c96 100644 --- a/projects/04-burger-queen-api/routes/users.js +++ b/projects/04-burger-queen-api/routes/users.js @@ -118,6 +118,8 @@ module.exports = (app, next) => { * @code {403} si ya existe usuaria con ese `email` */ app.post('/users', requireAdmin, (req, resp, next) => { + // TODO: implementar la ruta para agregar + // nuevos usuarios }); /** From 2e9010e8f6be60a43d493369ab6e408704ee9e0a Mon Sep 17 00:00:00 2001 From: ivy Date: Tue, 16 May 2023 12:25:13 -0500 Subject: [PATCH 38/43] agregamos status de resp en globalSetup errors --- projects/04-burger-queen-api/e2e/globalSetup.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/projects/04-burger-queen-api/e2e/globalSetup.js b/projects/04-burger-queen-api/e2e/globalSetup.js index 799bff502..6c898104d 100644 --- a/projects/04-burger-queen-api/e2e/globalSetup.js +++ b/projects/04-burger-queen-api/e2e/globalSetup.js @@ -61,13 +61,13 @@ const createTestUser = () => fetchAsAdmin('/users', { }) .then((resp) => { if (resp.status !== 200) { - throw new Error('Could not create test user'); + throw new Error(`Response ${resp.status} - Could not create test user`); } return fetch('/auth', { method: 'POST', body: __e2e.testUserCredentials }); }) .then((resp) => { if (resp.status !== 200) { - throw new Error('Could not authenticate test user'); + throw new Error(`Response ${resp.status} - Could not authenticate test user`); } return resp.json(); }) @@ -79,7 +79,7 @@ const checkAdminCredentials = () => fetch('/auth', { }) .then((resp) => { if (resp.status !== 200) { - throw new Error('Could not authenticate as admin user'); + throw new Error(`Response ${resp.status} - Could not authenticate as admin user`); } return resp.json(); From 279591190c8bb861adc3da8f41468471c9d8cfdc Mon Sep 17 00:00:00 2001 From: Ivy Feraco Date: Tue, 16 May 2023 14:06:50 -0500 Subject: [PATCH 39/43] Update projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Alfredo González <12631491+mfdebian@users.noreply.github.com> --- projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.md b/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.md index dafc1bd96..fa7b1d38d 100644 --- a/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.md +++ b/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.md @@ -128,7 +128,7 @@ Aquí te guiamos un poco sobre esto TODO's. ### TODO 1: Conectar a la base de datos -En el `connect.js` hay que conectar al base de datos. +En el archivo `connect.js` hay que hacer la conexión con la base de datos. ```js const { dbUrl } = config; From 002d4414856546a7bc5adb3bcc620a1241e509fa Mon Sep 17 00:00:00 2001 From: Ivy Feraco Date: Tue, 16 May 2023 14:09:25 -0500 Subject: [PATCH 40/43] Apply suggestions from code review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Alfredo González <12631491+mfdebian@users.noreply.github.com> --- projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.md b/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.md index fa7b1d38d..523c38c11 100644 --- a/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.md +++ b/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.md @@ -69,7 +69,7 @@ usar el [Node.js driver de MongoDB](https://www.mongodb.com/docs/drivers/node/cu que es la forma más directa de interactuar con tu instancia de MongoDB. Hay que instalar el Node.js Driver en este proyecto usando `npm`, -[revisa los docs por más info](https://www.mongodb.com/docs/drivers/node/current/quick-start/download-and-install/#install-the-node.js-driver). +revisa [la documentación oficial para más información](https://www.mongodb.com/docs/drivers/node/current/quick-start/download-and-install/#install-the-node.js-driver). El _boilerplate_ ya incluye un archivo `config.js` donde se leen las variables de entorno, y entre ellas está `DB_URL`. Como vemos ese valor lo From cdf2202307cea18827508dac10d76048203cb5fa Mon Sep 17 00:00:00 2001 From: ivy Date: Tue, 16 May 2023 14:13:27 -0500 Subject: [PATCH 41/43] espanol no pt, error response --- projects/04-burger-queen-api/e2e/globalSetup.js | 6 +++--- .../04-burger-queen-api/guides/GETTING-STARTED-MONGODB.md | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/projects/04-burger-queen-api/e2e/globalSetup.js b/projects/04-burger-queen-api/e2e/globalSetup.js index 6c898104d..1dd242ef7 100644 --- a/projects/04-burger-queen-api/e2e/globalSetup.js +++ b/projects/04-burger-queen-api/e2e/globalSetup.js @@ -61,13 +61,13 @@ const createTestUser = () => fetchAsAdmin('/users', { }) .then((resp) => { if (resp.status !== 200) { - throw new Error(`Response ${resp.status} - Could not create test user`); + throw new Error(`Error: Could not create test user - response ${resp.status}`); } return fetch('/auth', { method: 'POST', body: __e2e.testUserCredentials }); }) .then((resp) => { if (resp.status !== 200) { - throw new Error(`Response ${resp.status} - Could not authenticate test user`); + throw new Error(`Error: Could not authenticate test user - response ${resp.status}`); } return resp.json(); }) @@ -79,7 +79,7 @@ const checkAdminCredentials = () => fetch('/auth', { }) .then((resp) => { if (resp.status !== 200) { - throw new Error(`Response ${resp.status} - Could not authenticate as admin user`); + throw new Error(`Error: Could not authenticate as admin user - response ${resp.status}`); } return resp.json(); diff --git a/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.md b/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.md index dafc1bd96..42aa638ca 100644 --- a/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.md +++ b/projects/04-burger-queen-api/guides/GETTING-STARTED-MONGODB.md @@ -213,11 +213,11 @@ users de la colección en tu base de datos. Revisa [el tutorial de Node y express en Mozilla](https://developer.mozilla.org/en-US/docs/Learn/Server-side/Express_Nodejs/routes) que habla de controllers. -### TODO 6: Implementar a rota POST `/users` +### TODO 6: Implementar la ruta POST `/users` -Os testes e2e invocam a rota POST /users para adicionar a usuária aos testes. -Portanto, antes de poder executar os testes e2e, essa rota deve funcionar -corretamente. +Los tests e2e invocan la ruta POST `/users` para agregar la usuaria para los tests. +Por lo tanto, antes de poder ejecutar los tests e2e, esta ruta debe funcionar +correctamente. ## 6. Definir estrategia de pruebas unitarias From a6a78da85cb2b2891538b543e793c47411a593d0 Mon Sep 17 00:00:00 2001 From: Ivy Feraco Date: Tue, 16 May 2023 20:12:51 -0500 Subject: [PATCH 42/43] Update README.md guides url --- projects/04-burger-queen-api/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/projects/04-burger-queen-api/README.md b/projects/04-burger-queen-api/README.md index 9daa1227c..b61100c0d 100644 --- a/projects/04-burger-queen-api/README.md +++ b/projects/04-burger-queen-api/README.md @@ -45,7 +45,7 @@ Esto implica que tendremos que partir por leer la implementación existente, y familiarizarnos con el _stack_ elegido ([Node.js](https://nodejs.org/) y [Express](https://expressjs.com/)) y complementarlo con un motor de bases de datos. Recomendamos el uso de [MongoDB](https://www.mongodb.com/) y tenemos una -[guía para empezar con MongoDB](./GETTING-STARTED-MONGO-DB.md). +[guía para empezar con MongoDB](./guides/GETTING-STARTED-MONGO-DB.md). La clienta nos ha dado un [link a la documentación](https://app.swaggerhub.com/apis-docs/ssinuco/BurgerQueenAPI/2.0.0) que especifica el comportamiento esperado de la API que expondremos por @@ -231,7 +231,7 @@ la configuración de base de datos. Ten en cuenta que como vas a tener dos servidores corriendo sobre una misma configuración, deberás exponer los servicios en diferentes puertos. -Lee la [**guía para docker**] (./GETTING-STARTED-DOCKER.md) +Lee la [**guía para docker**] (./guides/GETTING-STARTED-DOCKER.md) incluido en el proyecto para mas información. Para probar tu configuración de docker, te recomendamos usar `docker-compose` From e5cb2f8d7b1ebb6e4eedd42be0e551c5eae81504 Mon Sep 17 00:00:00 2001 From: Ivy Feraco Date: Tue, 16 May 2023 20:17:08 -0500 Subject: [PATCH 43/43] Update README.pt.md url guides y texto duplicado --- projects/04-burger-queen-api/README.pt.md | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/projects/04-burger-queen-api/README.pt.md b/projects/04-burger-queen-api/README.pt.md index 48cbf20ee..74e6bc8d5 100644 --- a/projects/04-burger-queen-api/README.pt.md +++ b/projects/04-burger-queen-api/README.pt.md @@ -45,7 +45,7 @@ Isso implica que teremos que começar lendo a implementação existente e nos familiarizar com o _stack_ escolhido ([Node.js](https://nodejs.org/) e [Express](https://expressjs.com/)), além de complementá-lo com um motor de banco de dados. Recomendamos o uso do [MongoDB](https://www.mongodb.com/) -e temos [um guia para começar com o MongoDB.](./GETTING-STARTED-MONGO-DB.pt.md) +e temos [um guia para começar com o MongoDB.](./guides/GETTING-STARTED-MONGO-DB.pt.md) [MongoDB](https://www.mongodb.com/), [PostgreSQL](https://www.postgresql.org/) e [MySQL](https://www.mysql.com/). @@ -211,14 +211,6 @@ Você pode escolher o provedor (ou provedores) que preferir, juntamente com o mecanismo de implantação e estratégia de hospedagem. Recomendamos que você explore as seguintes opções: -Vercel é uma opção focada em aplicativos da web estáticos -(como os construídos com React). No entanto, o Vercel também nos permite -implantar aplicativos node usando Serverless Functions. -MongoDB Atlas é uma ótima opção para hospedar nosso banco de dados de produção, -que pode ser usado em conjunto com qualquer uma das opções mencionadas acima. -Se você tiver dúvidas sobre as diferentes opções de implantação -(que são várias), não hesite em consultar seus colegas e seus coaches. - * [Vercel](https://vercel.com/) é uma opção focada em aplicativos da web estáticos (como os construídos com React). No entanto, o Vercel também nos permite implantar aplicativos node usando @@ -243,7 +235,7 @@ incluir a configuração do banco de dados. Tenha em mente que, como você terá dois servidores sendo executados na mesma configuração, você precisará expor os serviços em portas diferentes. -Leia o [guia para docker](./GETTING-STARTED-DOCKER.pt.md) incluído +Leia o [guia para docker](./guides/GETTING-STARTED-DOCKER.pt.md) incluído no projeto para mais informações. Para testar sua configuração do Docker, recomendamos que você use o