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
104 changes: 91 additions & 13 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,41 +1,107 @@
# Prueba de Backend NodeJS
Crear un CRUD para crear productos conectado a MongoDB.

### Instalación
```
npm install
```
¡Hola! Este un CRUD para crear productos conectado a MongoDB.

### Ejecución
```
npm run start
```
La base de datos de prueba en este proyecto es una tienda de productos para la aplicación de pestañas postizas. En esta tienda hay pestañas y pegamento como categorías de producto y se consideran al menos dos marcas de cada uno de los productos.

Puedes usar la aplicación en <https://stormy-forest-37132.herokuapp.com/>

## Cómo usar la aplicación

La aplicación está desplegada en Heroku. Es posible probarla usando los enlaces en Postman o en Insomnia.

### Endpoints de productos

- **Obtener la lista de todos los productos**
Realiza una petición GET con `https://stormy-forest-37132.herokuapp.com/api/products`

- **Retorna un artículo particular**
Añade al enlace anterior un id y realiza una petición GET. Por ejemplo:
`https://stormy-forest-37132.herokuapp.com/api/products/610176b90e09e779cf996665` devuelve pestañas con marca Nagaraku.

- **Crea un producto Nuevo**
En el endpoint `https://stormy-forest-37132.herokuapp.com/api/products/` usa una petición POST y agrega los datos de un nuevo producto.
Por ejemplo, puedes crear unas nuevas pinzas usando el siguiente código de JSON

## Modelos
`{"name":"Pinzas Pequeñas", "price":70, "description": "Pinzas para poner pestañas, tamaño pequeño.", "categoryId":"610312300bd2c18ebb22e7a3","image":"https://http2.mlstatic.com/D_NQ_NP_2X_931080-MLM32548632659_102019-F.jpg"}`

- **Edita un producto**
Por ejemplo, las pinzas azules (id 61046ad6e78b5f001587d6ff) tienen la categoría mal. Editalo usando su id haciendo una petición PUT en el endpoint `https://stormy-forest-37132.herokuapp.com/api/products/61046ad6e78b5f001587d6ff` con el siguiente código JSON

`{"name":"Pinzas Azules", "price":450, "description": "Pinzas para poner pestañas", "categoryId":"610312300bd2c18ebb22e7a3","image":"https://http2.mlstatic.com/D_NQ_NP_2X_931080-MLM32548632659_102019-F.jpg"}`

- **Borrar un producto**
Puedes borrar un producto haciendo una petición DELETE con el endpoint de products seguido por el id del producto. Por ejemplo, puedes borrar las pinzas azules haciendo esta petición al endpoint `https://stormy-forest-37132.herokuapp.com/api/products/61046ad6e78b5f001587d6ff`

### Enpoints de Categorías

- **Ver la lista de las categorías**
Realiza una petición GET con `https://stormy-forest-37132.herokuapp.com/api/products`
- **Retorna una categoría particular**
Añade al enlace anterior un id y realiza una petición GET. Por ejemplo:
`https://stormy-forest-37132.herokuapp.com/api/products/610077b127ff3d7645072de4` devuelve la categoría _pestañas_.
- **Crear una categoría**
Usa el endpoint `https://stormy-forest-37132.herokuapp.com/api/categories/`con una petición POST para crear una categoría nueva. Por ejemplo, podemos crear la categoría _parches_ usando el código JSON

`{"name":"Parchis", "image":"https://http2.mlstatic.com/D_NQ_NP_2X_709890-MLM45468647557_042021-F.jpg"}`

- **Editar una Categoría**
Nos equivocamos en la categoría anterior. Tenemos que cambiar _parchis_ por _parches_ en el código anterior. Usa una petición PUT con el siguiente código JSON en el mismo endpoint
`{"name":"Parchis", "image":"https://http2.mlstatic.com/D_NQ_NP_2X_709890-MLM45468647557_042021-F.jpg"}`

- **Borrar una categoría**
Aún no tenemos nada en stock en la categoría de parches. Vamos a borrarla usando la petición DELETE en la dirección `https://stormy-forest-37132.herokuapp.com/api/categories/:{id}` usando el id que se generó automáticamente en esta categoría al crearla.

- **Ver todos los productos de una categoría**
Podemos ver cuántos productos tenemos de la categoría _Lashes_ usando una petición GET en el endpoint `https://stormy-forest-37132.herokuapp.com/api/categories/610077b127ff3d7645072de4/products`. Prueba la aplicación con la categoría de Pinzas o la de pegamento. También puedes probarlo con las categorías nuevas que hagas, pero necesitas generar productos con esta categoría para que muestre algo más que una lista vacía.

## Características del modelo de la Base de Datos

### Product
Un Producto debe tener los siguientes atributos:

El producto tiene los siguientes atributos:

- name
- price
- description
- categoryId
- image

### Category
Una Categoría debe tener los siguientes atributos:

La Categoría tiene los siguientes atributos:

- name
- image

## Requerimientos

### Instalación

````

npm install

```

### Ejecución

```

npm run start

```

### 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.

### 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.
Expand All @@ -51,15 +117,27 @@ Una Categoría debe tener los siguientes atributos:
4. Realizar el deploy de tu aplicación.

### Correr pruebas en local

```

npm run test:e2e

```

1. Debes tener mongoDB en local corriendo para hacer las pruebas.
2. Y poner las variables de ambiente en el archivo `.env`.


## Enviar solución de reto

Debes de crear un "Fork" de este proyecto, revolverlo desde tu cuenta personal.

### Licencia

La licencia [MIT](https://opensource.org/licenses/MIT).

```

```

```
````
164 changes: 164 additions & 0 deletions app/controllers/category.controller.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,164 @@
/* -----------------------------------------
Controllers for categories
---------------------------------------*/
const Category = require("../models/category.model.js");
const Product = require("../models/product.model.js");

// Return list of categories
exports.findAllCategories = (req, res) => {
Category.find()
.then(categories => {
res.send(categories);
})
.catch(err => {
message: err.message ||
"Some error occurred while retrieving your categories";
});
};

// Return category by id
exports.findOneCategory = (req, res) => {
Category.findById(req.params.categoryId)
.then(category => {
if (!category) {
return res.status(404).send({
message: "Category not found by id" + req.params.categoryId
});
}
res.send(category);
})
.catch(err => {
if (err.kind === "ObjectId") {
return res.status(404).send({
message: "Category not found using id " + req.params.categoryId
});
}
return res.status(500).send({
message:
"There was an error retrieving category using id " +
req.params.categoryId
});
});
};

// Create a category
exports.createCategory = (req, res) => {
// Validate request
if (!req.body.name) {
return res.status(400).send({
message: "field 'name' cannot be empty"
});
}

// Create a Category
const category = new Category({
name: req.body.name || "Unnamed category",
image: req.body.image
});

// Save category in the database
category
.save()
.then(data => {
res.send(data);
})
.catch(err => {
res.status(500).send({
message: err.message || "There was an error while creating the category"
});
});
};

// Modify a category
exports.editCategory = (req, res) => {
// Validate request
if (!req.body.name) {
return res.status(400).send({
message: "Name cannot be empty!"
});
}

// Find category and update it with request body
Category.findByIdAndUpdate(
req.params.categoryId,
{
name: req.body.name,
image: req.body.image
},
{ new: true }
)
.then(category => {
// Validate if not empty
if (!category) {
return res.status(404).send({
message:
"I couln't retrieve category with id " + req.params.categoryId
});
}
res.send(category);
})
.catch(err => {
if (err.kind === "ObjectId") {
return res.status(404).send({
message: "Category not found using id " + req.params.categoryId
});
}
return res.status(500).send({
message:
"There was an error updating category with id " +
req.params.categoryId
});
});
};

exports.deleteCategory = (req, res) => {
Category.findByIdAndRemove(req.params.categoryId)
.then(category => {
if (!category) {
return res.status(404).send({
message: "I didn't find any category with id " + req.params.categoryId
});
}
res.send({ message: "Category was correctly deleted" });
})
.catch(err => {
if (err.kind === "ObjectId" || err.name === "NotFound") {
return res.status(404).send({
message: "I couldn't find item with id " + req.params.categoryId
});
}
return res.status(500).send({
message:
"Sorry, I wasn't able to delete item with id " + req.params.categoryId
});
});
};

// Return list of products from a category
exports.allProductsInCategory = (req, res) => {
Product.find({
categoryId: req.params.categoryId
})
.then(products => {
if (!products) {
return res.status(404).send({
message:
"There are no products with category id " + req.params.categoryId
});
}
res.send(products);
})
.catch(err => {
if (err.kind === "ObjectId") {
return res.status(404).send({
message:
"There are no products with category id " + req.params.categoryId
});
}
return res.status(500).send({
message:
"There was an error retrieving products with category id " +
req.params.categoryId
});
});
};
Loading