Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion .env-example
Original file line number Diff line number Diff line change
@@ -1,7 +1,14 @@
PORT=3000

//variables Para pruebas locales
MONGO_USER=
MONGO_PASSWORD=
MONGO_HOST=
MONGO_DB_NAME=
MONGO_PORT=
MONGO_CONNECTION=
MONGO_CONNECTION=

//variables para MongoAtlas
ATLAS_USER=
ATLAS_PASSWORD=
ATLAS_DB_NAME=
27 changes: 15 additions & 12 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,19 +29,19 @@ 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.
- [ ] 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] GET `/api/products/` Endpoint para retornar la lista de productos.
- [X] GET `/api/products/{id}/` Endpoint para retornar 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
- [ ] 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.
- [ ] GET `/api/categories/{id}/products` Endpoint para retornar la lista de productos que pertenecen a una 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.
- [X] GET `/api/categories/{id}/products` Endpoint para retornar la lista de productos que pertenecen a una categoría.

## Instrucciones

Expand All @@ -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).
19 changes: 18 additions & 1 deletion package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
3 changes: 3 additions & 0 deletions src/app.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
const express = require('express');
const cors = require('cors');
const router = require("./network/routes");

function createApp() {
const app = express();
app.use(cors());
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;
}

Expand Down
46 changes: 46 additions & 0 deletions src/components/categories/controller.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
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;
}
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;
}
//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){
result = await injecterStore.update(TABLE, data._id, data);
}else{
data._id = nanoid();
result = await injecterStore.create(TABLE, data);
}
return result;
}
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;
}
return {
list,
listCategorie,
deleteCategorie,
insertCategorie,
searchProduct
}
}
7 changes: 7 additions & 0 deletions src/components/categories/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +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);
57 changes: 57 additions & 0 deletions src/components/categories/network.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
const express = require('express');

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);
router.put('/:id', alterCategorie);
router.get('/:id/products', searchProduct);
router.delete('/:id', deleteCategorie);

function list(req,res, next){

controller.list()
.then((lista) => {
response.success(req,res,lista,200);
}).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 =>{
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
39 changes: 39 additions & 0 deletions src/components/products/controller.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
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;
}
async function listProduct(id){
const result = await injecterStore.list(TABLE,id);
return result;
}
async function deleteProduct(id){
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){
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,
}
}
6 changes: 6 additions & 0 deletions src/components/products/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +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);
51 changes: 51 additions & 0 deletions src/components/products/network.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
const express = require('express');

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);
router.put('/:id', alterProduct);
router.delete('/:id', deleteProduct);

function list(req,res, next){

controller.list()
.then((lista) => {
response.success(req,res,lista,200);
}).catch(next);

}

function listProduct(req, res, next){
controller.listProduct(req.params.id)
.then(product =>{
response.success(req, res, product, 200);
}).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 =>{
response.success(req, res, product, 200);
}).catch(next)
}

module.exports = router
3 changes: 3 additions & 0 deletions src/config/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -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 };
3 changes: 3 additions & 0 deletions src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -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}`);
}
});
16 changes: 16 additions & 0 deletions src/network/response.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
//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,
status: status,
body: message,
})
}

exports.error = (req, res, message = 'Internal Server Error', status = 500) => {
res.status(status).send({
error: false,
status: status,
body: message,
})
}
8 changes: 8 additions & 0 deletions src/network/routes.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
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);
}
module.exports = routes
Loading