From 505fd73b4c349854a971cec98361e3cf1eb7fc68 Mon Sep 17 00:00:00 2001 From: Luis Martinez Date: Sun, 16 May 2021 20:18:28 -0500 Subject: [PATCH 1/8] deficiendo la estructura del proyecto, creando la base de datos y habilitando el enpoint GET /api/products --- .env-example | 9 ++++- src/app.js | 2 + src/components/products/controller.js | 14 +++++++ src/components/products/index.js | 5 +++ src/components/products/network.js | 21 ++++++++++ src/config/index.js | 3 ++ src/index.js | 3 ++ src/network/response.js | 15 +++++++ src/network/routes.js | 7 ++++ src/store/mongoDB.js | 57 +++++++++++++++++++++++++++ 10 files changed, 135 insertions(+), 1 deletion(-) create mode 100644 src/components/products/controller.js create mode 100644 src/components/products/index.js create mode 100644 src/components/products/network.js create mode 100644 src/network/response.js create mode 100644 src/network/routes.js create mode 100644 src/store/mongoDB.js diff --git a/.env-example b/.env-example index dfce8c4d..074680af 100644 --- a/.env-example +++ b/.env-example @@ -1,7 +1,14 @@ PORT=3000 + +//variables Para pruebas locales MONGO_USER= MONGO_PASSWORD= MONGO_HOST= MONGO_DB_NAME= MONGO_PORT= -MONGO_CONNECTION= \ No newline at end of file +MONGO_CONNECTION= + +//variables para MongoAtlas +ATLAS_USER= +ATLAS_PASSWORD= +ATLAS_DB_NAME= \ No newline at end of file diff --git a/src/app.js b/src/app.js index 62a46b5e..1ec2316a 100644 --- a/src/app.js +++ b/src/app.js @@ -1,5 +1,6 @@ const express = require('express'); const cors = require('cors'); +const router = require("./network/routes"); function createApp() { const app = express(); @@ -7,6 +8,7 @@ function createApp() { app.use(express.json()); // ADD YOUR ROUTES + router(app); return app; } diff --git a/src/components/products/controller.js b/src/components/products/controller.js new file mode 100644 index 00000000..4fa6c44e --- /dev/null +++ b/src/components/products/controller.js @@ -0,0 +1,14 @@ + +const TABLE = "products" + +module.exports = function (injecterStore){ + + async function list(){ + + const prueba = await injecterStore.listAll(TABLE,null); + return prueba; + } + return { + list, + } +} \ No newline at end of file diff --git a/src/components/products/index.js b/src/components/products/index.js new file mode 100644 index 00000000..5b518ff8 --- /dev/null +++ b/src/components/products/index.js @@ -0,0 +1,5 @@ +//index of products +const controller = require('./controller'); +const store = require("../../store/mongoDB"); + +module.exports = controller(new store); \ No newline at end of file diff --git a/src/components/products/network.js b/src/components/products/network.js new file mode 100644 index 00000000..94cd99f0 --- /dev/null +++ b/src/components/products/network.js @@ -0,0 +1,21 @@ +const express = require('express'); + +const controller = require('./index') +const response = require("../../network/response"); + +const router = express.Router(); + +router.get('/', listProducts); + +function listProducts(req,res, next){ + + controller.list() + .then((lista) => { + response.success(req,res,lista,200); + }).catch(next); + +} + + + +module.exports = router \ No newline at end of file diff --git a/src/config/index.js b/src/config/index.js index 21883f8c..0a6edc3a 100644 --- a/src/config/index.js +++ b/src/config/index.js @@ -9,6 +9,9 @@ const config = { dbName: process.env.MONGO_DB_NAME, dbPort: process.env.MONGO_PORT, dbConnection: process.env.MONGO_CONNECTION, + AtlasUser: process.env.ATLAS_USER, + AtlasPasword: process.env.ATLAS_PASSWORD, + AtlasDBName: process.env.ATLAS_DB_NAME }; module.exports = { config }; diff --git a/src/index.js b/src/index.js index 389445c1..78e0f76f 100644 --- a/src/index.js +++ b/src/index.js @@ -8,4 +8,7 @@ app.listen(config.port, err => { console.error("Error: ", err); return; } + else{ + console.log(`Inicio Correcto, app escuchando en el puerto ${config.port}`); + } }); \ No newline at end of file diff --git a/src/network/response.js b/src/network/response.js new file mode 100644 index 00000000..6957af09 --- /dev/null +++ b/src/network/response.js @@ -0,0 +1,15 @@ +exports.success = (req, res, message = 'Ok', status = 201) => { + res.status(status).send({ + error: false, + status: status, + body: message, + }) +} + +exports.error = (req, res, message = 'Internal Server Error', status = 500) => { + res.status(status).send({ + error: false, + status: status, + body: message, + }) +} \ No newline at end of file diff --git a/src/network/routes.js b/src/network/routes.js new file mode 100644 index 00000000..3b995f4c --- /dev/null +++ b/src/network/routes.js @@ -0,0 +1,7 @@ +const products = require("../components/products/network"); + +const routes = (server) => { + server.use('/api/products/',products); + //server.use('/api/categories/'); +} +module.exports = routes \ No newline at end of file diff --git a/src/store/mongoDB.js b/src/store/mongoDB.js new file mode 100644 index 00000000..8434a945 --- /dev/null +++ b/src/store/mongoDB.js @@ -0,0 +1,57 @@ +const {MongoClient, ObjectId} = require("mongodb"); + +const { config } = require("../config"); + +const user = encodeURIComponent(config.AtlasUser); +const password = encodeURIComponent(config.AtlasPasword); +const dbName = config.AtlasDBName; + +const mongoUri = `mongodb+srv://${user}:${password}@cluster0.0pgxi.mongodb.net/${dbName}?retryWrites=true&w=majority`; + +class MongoDB{ + constructor(){ + this.client = new MongoClient(mongoUri, { useNewUrlParser: true, useUnifiedTopology: true}); + this.dbname = dbName; + } + connect(){ + if(!MongoDB.connection){ + MongoDB.connection = new Promise((resolve, reject) => { + this.client.connect(err => { + if(err){ + reject(err); + } + console.log("Connected succesfully to mongoAtlas") + resolve(this.client.db(this.dbName)); + }); + }); + } + return MongoDB.connection; + } + listAll(collection,query){ + return this.connect().then(db => { + return db.collection(collection).find(query).toArray(); + }) + } + list(collection, id){ + return this.connect().then(db => { + return db.collection(collection).findOne({ _id: ObjectId(id)}); + }) + } + create(collection, data){ + return this.connect().then(db => { + return db.collection(collection).insertOne(data) + }).then(result => result.insertId); + } + update(collection, id, data){ + return this.connect().then(db => { + return db.collection(collection).updateOne({ _id:Object(id) },{ $set: data}, { upsert: true}) + }).then(result => result.upsertedId || id); + } + delete(collection, id){ + return this.connect().then(db => { + return db.collection(collection).deleteOne({ _id: ObjectId(id)}); + }).then(() => id); + } + +} +module.exports = MongoDB \ No newline at end of file From 793e929f29cc0e08a7ad9fb74e37f0f698abed00 Mon Sep 17 00:00:00 2001 From: Luis Martinez Date: Sun, 16 May 2021 20:43:40 -0500 Subject: [PATCH 2/8] habilitando el endpoint /api/products/{id} --- README.md | 4 ++-- src/components/products/controller.js | 10 +++++++--- src/components/products/network.js | 13 +++++++++++-- 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index f1ebbc43..5b413503 100644 --- a/README.md +++ b/README.md @@ -29,8 +29,8 @@ Una Categoría debe tener los siguientes atributos: ## Requerimientos ### CRUD de productos -- [ ] GET `/api/products/` Endpoint para retornar la lista de productos. -- [ ] GET `/api/products/{id}/` Endpoint para retornar un producto. +- [X] GET `/api/products/` Endpoint para retornar la lista de productos. +- [X] GET `/api/products/{id}/` Endpoint para retornar un producto. - [ ] POST `/api/products/` Endpoint para crear un producto. - [ ] PUT `/api/products/{id}/` Endpoint para modificar un producto. - [ ] DELETE `/api/products/{id}/` Endpoint para eliminar un producto. diff --git a/src/components/products/controller.js b/src/components/products/controller.js index 4fa6c44e..18498293 100644 --- a/src/components/products/controller.js +++ b/src/components/products/controller.js @@ -4,11 +4,15 @@ const TABLE = "products" module.exports = function (injecterStore){ async function list(){ - - const prueba = await injecterStore.listAll(TABLE,null); - return prueba; + const result = await injecterStore.listAll(TABLE,null); + return result; + } + async function listProduct(id){ + const result = await injecterStore.list(TABLE,id); + return result; } return { list, + listProduct, } } \ No newline at end of file diff --git a/src/components/products/network.js b/src/components/products/network.js index 94cd99f0..a818d5be 100644 --- a/src/components/products/network.js +++ b/src/components/products/network.js @@ -5,9 +5,11 @@ const response = require("../../network/response"); const router = express.Router(); -router.get('/', listProducts); +router.get('/', list); +router.get('/:id', listProduct); -function listProducts(req,res, next){ + +function list(req,res, next){ controller.list() .then((lista) => { @@ -16,6 +18,13 @@ function listProducts(req,res, next){ } +function listProduct(req, res, next){ + controller.listProduct(req.params.id) + .then(product =>{ + response.success(req, res, product, 200); + }).catch(next) +} + module.exports = router \ No newline at end of file From a1166da8e0b97fc6197cd78a3f1511f300fe7a18 Mon Sep 17 00:00:00 2001 From: Luis Martinez Date: Sun, 16 May 2021 20:51:06 -0500 Subject: [PATCH 3/8] habilitando el enpoint para eliminar producto --- README.md | 2 +- src/components/products/controller.js | 5 +++++ src/components/products/network.js | 9 +++++++-- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 5b413503..ef816629 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ Una Categoría debe tener los siguientes atributos: - [X] GET `/api/products/{id}/` Endpoint para retornar un producto. - [ ] POST `/api/products/` Endpoint para crear un producto. - [ ] PUT `/api/products/{id}/` Endpoint para modificar un producto. -- [ ] DELETE `/api/products/{id}/` Endpoint para eliminar un producto. +- [X] DELETE `/api/products/{id}/` Endpoint para eliminar un producto. ### CRUD de categorías - [ ] GET `/api/categories/` Endpoint para retornar la lista de categorías. diff --git a/src/components/products/controller.js b/src/components/products/controller.js index 18498293..a8af0c8e 100644 --- a/src/components/products/controller.js +++ b/src/components/products/controller.js @@ -11,8 +11,13 @@ module.exports = function (injecterStore){ const result = await injecterStore.list(TABLE,id); return result; } + async function deleteProduct(id){ + const result = await injecterStore.delete(TABLE,id); + return result; + } return { list, listProduct, + deleteProduct, } } \ No newline at end of file diff --git a/src/components/products/network.js b/src/components/products/network.js index a818d5be..838ded61 100644 --- a/src/components/products/network.js +++ b/src/components/products/network.js @@ -7,7 +7,7 @@ const router = express.Router(); router.get('/', list); router.get('/:id', listProduct); - +router.delete('/:id', deleteProduct); function list(req,res, next){ @@ -25,6 +25,11 @@ function listProduct(req, res, next){ }).catch(next) } - +function deleteProduct(req, res, next){ + controller.deleteProduct(req.params.id) + .then(product =>{ + response.success(req, res, product, 200); + }).catch(next) +} module.exports = router \ No newline at end of file From ee924fd3bcac7376ab12990b09607df8e13cbbc2 Mon Sep 17 00:00:00 2001 From: Luis Martinez Date: Sun, 16 May 2021 22:10:30 -0500 Subject: [PATCH 4/8] habilitando endpoint para insertar y actualizar producto --- README.md | 4 ++-- package-lock.json | 19 ++++++++++++++++++- package.json | 3 ++- src/components/products/controller.js | 12 ++++++++++++ src/components/products/network.js | 16 ++++++++++++++++ src/store/mongoDB.js | 4 ++-- 6 files changed, 52 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index ef816629..df1ead12 100644 --- a/README.md +++ b/README.md @@ -31,8 +31,8 @@ Una Categoría debe tener los siguientes atributos: ### CRUD de productos - [X] GET `/api/products/` Endpoint para retornar la lista de productos. - [X] GET `/api/products/{id}/` Endpoint para retornar un producto. -- [ ] POST `/api/products/` Endpoint para crear un producto. -- [ ] PUT `/api/products/{id}/` Endpoint para modificar un producto. +- [X] POST `/api/products/` Endpoint para crear un producto. +- [X] PUT `/api/products/{id}/` Endpoint para modificar un producto. - [X] DELETE `/api/products/{id}/` Endpoint para eliminar un producto. ### CRUD de categorías diff --git a/package-lock.json b/package-lock.json index 76a7fcef..1e394721 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,8 @@ "cors": "^2.8.5", "dotenv": "^8.2.0", "express": "^4.17.1", - "mongodb": "^3.6.6" + "mongodb": "^3.6.6", + "nanoid": "^3.1.23" }, "devDependencies": { "jest": "^26.6.3", @@ -6723,6 +6724,17 @@ "dev": true, "optional": true }, + "node_modules/nanoid": { + "version": "3.1.23", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz", + "integrity": "sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, "node_modules/nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", @@ -14982,6 +14994,11 @@ "dev": true, "optional": true }, + "nanoid": { + "version": "3.1.23", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz", + "integrity": "sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==" + }, "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", diff --git a/package.json b/package.json index 279a5416..8d9a0a01 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,8 @@ "cors": "^2.8.5", "dotenv": "^8.2.0", "express": "^4.17.1", - "mongodb": "^3.6.6" + "mongodb": "^3.6.6", + "nanoid": "^3.1.23" }, "devDependencies": { "jest": "^26.6.3", diff --git a/src/components/products/controller.js b/src/components/products/controller.js index a8af0c8e..a9d7cad0 100644 --- a/src/components/products/controller.js +++ b/src/components/products/controller.js @@ -1,3 +1,4 @@ +const { nanoid } = require("nanoid") const TABLE = "products" @@ -15,9 +16,20 @@ module.exports = function (injecterStore){ const result = await injecterStore.delete(TABLE,id); return result; } + async function insertProduct(data,id){ + let result + if(id){ + result = await injecterStore.update(TABLE, data._id, data); + }else{ + data._id = nanoid(); + result = await injecterStore.create(TABLE, data); + } + return result; + } return { list, listProduct, deleteProduct, + insertProduct, } } \ No newline at end of file diff --git a/src/components/products/network.js b/src/components/products/network.js index 838ded61..a0201970 100644 --- a/src/components/products/network.js +++ b/src/components/products/network.js @@ -7,6 +7,8 @@ const router = express.Router(); router.get('/', list); router.get('/:id', listProduct); +router.post('/', insertProduct); +router.put('/:id', alterProduct); router.delete('/:id', deleteProduct); function list(req,res, next){ @@ -25,6 +27,20 @@ function listProduct(req, res, next){ }).catch(next) } +function insertProduct(req, res, next){ + controller.insertProduct(req.body,null) + .then((data => { + response.success(req, res, data, 201) + })).catch(next) +} + +function alterProduct(req, res, next){ + controller.insertProduct(req.body,req.params.id) + .then((data => { + response.success(req, res, data, 202) + })).catch(next) +} + function deleteProduct(req, res, next){ controller.deleteProduct(req.params.id) .then(product =>{ diff --git a/src/store/mongoDB.js b/src/store/mongoDB.js index 8434a945..7c90af18 100644 --- a/src/store/mongoDB.js +++ b/src/store/mongoDB.js @@ -34,7 +34,7 @@ class MongoDB{ } list(collection, id){ return this.connect().then(db => { - return db.collection(collection).findOne({ _id: ObjectId(id)}); + return db.collection(collection).findOne({ _id : id}); }) } create(collection, data){ @@ -44,7 +44,7 @@ class MongoDB{ } update(collection, id, data){ return this.connect().then(db => { - return db.collection(collection).updateOne({ _id:Object(id) },{ $set: data}, { upsert: true}) + return db.collection(collection).updateOne({ _id: id },{ $set: data}, { upsert: true}) }).then(result => result.upsertedId || id); } delete(collection, id){ From 103ac00df2962537fbcf40a53c25b95babe59bcb Mon Sep 17 00:00:00 2001 From: Luis Martinez Date: Sun, 16 May 2021 22:45:51 -0500 Subject: [PATCH 5/8] creando los enpoints de categorias para crear, modificar, eliminar, actualizar, listar todo y listar uno --- README.md | 10 ++--- src/components/categories/controller.js | 37 ++++++++++++++++++ src/components/categories/index.js | 5 +++ src/components/categories/network.js | 51 +++++++++++++++++++++++++ src/network/routes.js | 3 +- src/store/mongoDB.js | 2 +- 6 files changed, 101 insertions(+), 7 deletions(-) create mode 100644 src/components/categories/controller.js create mode 100644 src/components/categories/index.js create mode 100644 src/components/categories/network.js diff --git a/README.md b/README.md index df1ead12..c9ed8efc 100644 --- a/README.md +++ b/README.md @@ -36,11 +36,11 @@ Una Categoría debe tener los siguientes atributos: - [X] DELETE `/api/products/{id}/` Endpoint para eliminar un producto. ### CRUD de categorías -- [ ] GET `/api/categories/` Endpoint para retornar la lista de categorías. -- [ ] GET `/api/categories/{id}/` Endpoint para retornar un categoría. -- [ ] POST `/api/categories/` Endpoint para crear un categoría. -- [ ] PUT `/api/categories/{id}/` Endpoint para modificar un categoría. -- [ ] DELETE `/api/categories/{id}/` Endpoint para eliminar un categoría. +- [X] GET `/api/categories/` Endpoint para retornar la lista de categorías. +- [X] GET `/api/categories/{id}/` Endpoint para retornar un categoría. +- [X] POST `/api/categories/` Endpoint para crear un categoría. +- [X] PUT `/api/categories/{id}/` Endpoint para modificar un categoría. +- [X] DELETE `/api/categories/{id}/` Endpoint para eliminar un categoría. - [ ] GET `/api/categories/{id}/products` Endpoint para retornar la lista de productos que pertenecen a una categoría. ## Instrucciones diff --git a/src/components/categories/controller.js b/src/components/categories/controller.js new file mode 100644 index 00000000..9e7b90ca --- /dev/null +++ b/src/components/categories/controller.js @@ -0,0 +1,37 @@ +const { nanoid } = require("nanoid") + +const TABLE = "categories" + +module.exports = function (injecterStore){ + + async function list(){ + const result = await injecterStore.listAll(TABLE,null); + return result; + } + async function listCategorie(id){ + const result = await injecterStore.list(TABLE,id); + return result; + } + async function deleteCategorie(id){ + const result = await injecterStore.delete(TABLE,id); + return result; + } + async function insertCategorie(data,id){ + let result + if(id){ + console.log("entre a actualizar") + result = await injecterStore.update(TABLE, data._id, data); + }else{ + data._id = nanoid(); + console.log(`entre a crear`) + result = await injecterStore.create(TABLE, data); + } + return result; + } + return { + list, + listCategorie, + deleteCategorie, + insertCategorie, + } +} \ No newline at end of file diff --git a/src/components/categories/index.js b/src/components/categories/index.js new file mode 100644 index 00000000..216133f4 --- /dev/null +++ b/src/components/categories/index.js @@ -0,0 +1,5 @@ +//index of categories +const controller = require('./controller'); +const store = require("../../store/mongoDB"); + +module.exports = controller(new store); \ No newline at end of file diff --git a/src/components/categories/network.js b/src/components/categories/network.js new file mode 100644 index 00000000..cec76fa1 --- /dev/null +++ b/src/components/categories/network.js @@ -0,0 +1,51 @@ +const express = require('express'); + +const controller = require('./index') +const response = require("../../network/response"); + +const router = express.Router(); + +router.get('/', list); +router.get('/:id', listCategorie); +router.post('/', insertCategorie); +router.put('/:id', alterCategorie); +router.delete('/:id', deleteCategorie); + +function list(req,res, next){ + + controller.list() + .then((lista) => { + response.success(req,res,lista,200); + }).catch(next); + +} + +function listCategorie(req, res, next){ + controller.listCategorie(req.params.id) + .then(categorie =>{ + response.success(req, res, categorie, 200); + }).catch(next) +} + +function insertCategorie(req, res, next){ + controller.insertCategorie(req.body,null) + .then((data => { + response.success(req, res, data, 201) + })).catch(next) +} + +function alterCategorie(req, res, next){ + controller.insertCategorie(req.body,req.params.id) + .then((data => { + response.success(req, res, data, 202) + })).catch(next) +} + +function deleteCategorie(req, res, next){ + controller.deleteCategorie(req.params.id) + .then(product =>{ + response.success(req, res, product, 200); + }).catch(next) +} + +module.exports = router \ No newline at end of file diff --git a/src/network/routes.js b/src/network/routes.js index 3b995f4c..1e4d12c9 100644 --- a/src/network/routes.js +++ b/src/network/routes.js @@ -1,7 +1,8 @@ const products = require("../components/products/network"); +const categories = require("../components/categories/network"); const routes = (server) => { server.use('/api/products/',products); - //server.use('/api/categories/'); + server.use('/api/categories/',categories); } module.exports = routes \ No newline at end of file diff --git a/src/store/mongoDB.js b/src/store/mongoDB.js index 7c90af18..d9be5134 100644 --- a/src/store/mongoDB.js +++ b/src/store/mongoDB.js @@ -49,7 +49,7 @@ class MongoDB{ } delete(collection, id){ return this.connect().then(db => { - return db.collection(collection).deleteOne({ _id: ObjectId(id)}); + return db.collection(collection).deleteOne({ _id: id}); }).then(() => id); } From 32a30911d5a26e919c600efdd5400c2777325c73 Mon Sep 17 00:00:00 2001 From: Luis Martinez Date: Sun, 16 May 2021 23:38:32 -0500 Subject: [PATCH 6/8] agregando el endpoint para listar productos que pertenecen a una categoria --- README.md | 2 +- src/components/categories/controller.js | 8 ++++++-- src/components/categories/network.js | 8 +++++++- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index c9ed8efc..60bdecc3 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,7 @@ Una Categoría debe tener los siguientes atributos: - [X] POST `/api/categories/` Endpoint para crear un categoría. - [X] PUT `/api/categories/{id}/` Endpoint para modificar un categoría. - [X] DELETE `/api/categories/{id}/` Endpoint para eliminar un categoría. -- [ ] GET `/api/categories/{id}/products` Endpoint para retornar la lista de productos que pertenecen a una categoría. +- [X] GET `/api/categories/{id}/products` Endpoint para retornar la lista de productos que pertenecen a una categoría. ## Instrucciones diff --git a/src/components/categories/controller.js b/src/components/categories/controller.js index 9e7b90ca..f25c128e 100644 --- a/src/components/categories/controller.js +++ b/src/components/categories/controller.js @@ -19,19 +19,23 @@ module.exports = function (injecterStore){ async function insertCategorie(data,id){ let result if(id){ - console.log("entre a actualizar") result = await injecterStore.update(TABLE, data._id, data); }else{ data._id = nanoid(); - console.log(`entre a crear`) result = await injecterStore.create(TABLE, data); } return result; } + async function searchProduct({id}){ + const query = id && {categoryId: {cat: id}}; + const result = await injecterStore.listAll("products",query); + return result; + } return { list, listCategorie, deleteCategorie, insertCategorie, + searchProduct } } \ No newline at end of file diff --git a/src/components/categories/network.js b/src/components/categories/network.js index cec76fa1..633e395c 100644 --- a/src/components/categories/network.js +++ b/src/components/categories/network.js @@ -9,6 +9,7 @@ router.get('/', list); router.get('/:id', listCategorie); router.post('/', insertCategorie); router.put('/:id', alterCategorie); +router.get('/:id/products', searchProduct); router.delete('/:id', deleteCategorie); function list(req,res, next){ @@ -19,7 +20,12 @@ function list(req,res, next){ }).catch(next); } - +function searchProduct(req, res, next){ + controller.searchProduct({id: req.params.id}) + .then((data => { + response.success(req, res, data, 200) + })).catch(next) +} function listCategorie(req, res, next){ controller.listCategorie(req.params.id) .then(categorie =>{ From 82a5df6de28fb638ae13347bb62e5a49eb27be17 Mon Sep 17 00:00:00 2001 From: Luis Martinez Date: Sun, 16 May 2021 23:58:42 -0500 Subject: [PATCH 7/8] se agregaron comentarios utiles --- src/app.js | 1 + src/components/categories/controller.js | 7 ++++++- src/components/categories/index.js | 4 +++- src/components/categories/network.js | 2 +- src/components/products/controller.js | 6 +++++- src/components/products/index.js | 3 ++- src/components/products/network.js | 2 +- src/network/response.js | 1 + src/network/routes.js | 2 +- 9 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/app.js b/src/app.js index 1ec2316a..e103f3ce 100644 --- a/src/app.js +++ b/src/app.js @@ -8,6 +8,7 @@ function createApp() { app.use(express.json()); // ADD YOUR ROUTES + //yo elegí crear un archivo separado para manejar las rutas este se encuentra en ./network/routes.js router(app); return app; } diff --git a/src/components/categories/controller.js b/src/components/categories/controller.js index f25c128e..b6a0466b 100644 --- a/src/components/categories/controller.js +++ b/src/components/categories/controller.js @@ -1,10 +1,12 @@ const { nanoid } = require("nanoid") - +//en este archivo se mandan a llamar las funciones para consultar la BD +//si es necesario cambiar la BD cambiar la base de datos en el archivo ./index.js const TABLE = "categories" module.exports = function (injecterStore){ async function list(){ + //no se envia el query debido a que se desea listar todo const result = await injecterStore.listAll(TABLE,null); return result; } @@ -16,6 +18,8 @@ module.exports = function (injecterStore){ const result = await injecterStore.delete(TABLE,id); return result; } + //dado los requisitos dados no se implenetó la comprobacion de la existenca de la categorias + //tampoco su existencia previa async function insertCategorie(data,id){ let result if(id){ @@ -28,6 +32,7 @@ module.exports = function (injecterStore){ } async function searchProduct({id}){ const query = id && {categoryId: {cat: id}}; + //a quí sirvio el query :v const result = await injecterStore.listAll("products",query); return result; } diff --git a/src/components/categories/index.js b/src/components/categories/index.js index 216133f4..7a19166d 100644 --- a/src/components/categories/index.js +++ b/src/components/categories/index.js @@ -1,5 +1,7 @@ //index of categories const controller = require('./controller'); const store = require("../../store/mongoDB"); - +//a este punto elegí separar la base de datos del resto del codigo, por si llegado el caso se requiere cambiar +//la base de datos será necesario implementar las funciones y simplemente cambiar la ubicacion de store +//tambien me permite reutilizar codigo ya hecho module.exports = controller(new store); \ No newline at end of file diff --git a/src/components/categories/network.js b/src/components/categories/network.js index 633e395c..35c7c574 100644 --- a/src/components/categories/network.js +++ b/src/components/categories/network.js @@ -4,7 +4,7 @@ const controller = require('./index') const response = require("../../network/response"); const router = express.Router(); - +//este archivo gestiona las rutas para las categorias hechas a /api/categories router.get('/', list); router.get('/:id', listCategorie); router.post('/', insertCategorie); diff --git a/src/components/products/controller.js b/src/components/products/controller.js index a9d7cad0..c3ab8b23 100644 --- a/src/components/products/controller.js +++ b/src/components/products/controller.js @@ -1,10 +1,13 @@ const { nanoid } = require("nanoid") - +//en este archivo se mandan a llamar las funciones para consultar la BD +//si es necesario cambiar la BD cambiar la base de datos en el archivo ./index.js const TABLE = "products" module.exports = function (injecterStore){ async function list(){ + //el parametro que se esta enviando como null es un query por si se necesita filtrar + //con respecto a una parametro en especifico const result = await injecterStore.listAll(TABLE,null); return result; } @@ -16,6 +19,7 @@ module.exports = function (injecterStore){ const result = await injecterStore.delete(TABLE,id); return result; } + //dado los requisitos dados no se implenetó la comprobacion de la existenca de la categorias async function insertProduct(data,id){ let result if(id){ diff --git a/src/components/products/index.js b/src/components/products/index.js index 5b518ff8..7448aacf 100644 --- a/src/components/products/index.js +++ b/src/components/products/index.js @@ -1,5 +1,6 @@ //index of products const controller = require('./controller'); const store = require("../../store/mongoDB"); - +//a este punto elegí separar la base de datos del resto del codigo, por si llegado el caso se requiere cambiar +//la base de datos será necesario implementar las funciones y simplemente cambiar la ubicacion de store module.exports = controller(new store); \ No newline at end of file diff --git a/src/components/products/network.js b/src/components/products/network.js index a0201970..489fdd81 100644 --- a/src/components/products/network.js +++ b/src/components/products/network.js @@ -4,7 +4,7 @@ const controller = require('./index') const response = require("../../network/response"); const router = express.Router(); - +//este archivo gestiona las peticiones que se queden hacer a /api/products router.get('/', list); router.get('/:id', listProduct); router.post('/', insertProduct); diff --git a/src/network/response.js b/src/network/response.js index 6957af09..46e36b91 100644 --- a/src/network/response.js +++ b/src/network/response.js @@ -1,3 +1,4 @@ +//estas funciones estan pensadas para estandarizar las respuestas que de el servicio exports.success = (req, res, message = 'Ok', status = 201) => { res.status(status).send({ error: false, diff --git a/src/network/routes.js b/src/network/routes.js index 1e4d12c9..f7dc037f 100644 --- a/src/network/routes.js +++ b/src/network/routes.js @@ -1,6 +1,6 @@ const products = require("../components/products/network"); const categories = require("../components/categories/network"); - +//cree una carpeta llamada componestes, en esta carpeta manejaré cada servicio separado en carpetas const routes = (server) => { server.use('/api/products/',products); server.use('/api/categories/',categories); From 2d466a12a531e1000d8d0b4a71680690c930a85f Mon Sep 17 00:00:00 2001 From: Luis Martinez Date: Mon, 17 May 2021 00:04:38 -0500 Subject: [PATCH 8/8] =?UTF-8?q?agregu=C3=A9=20mi=20nombre=20y=20datos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 60bdecc3..19cb183f 100644 --- a/README.md +++ b/README.md @@ -60,6 +60,9 @@ npm run test:e2e ## Enviar solución de reto Debes de crear un "Fork" de este proyecto, revolverlo desde tu cuenta personal. - +esta propuesta de solucion fue hecha por +Jorge Luis Martinez Hernandez +correo usado en platzi s_k_ap3@hotmail.com +id platzi: SoyLuis ### Licencia La licencia [MIT](https://opensource.org/licenses/MIT).