Un administrador de productos que permite agregar, consultar, actualizar y borrar una lista de productos, así como guardarlos en un archivo en el sistema de archivos local.
Se desarrollará un servidor que contenga los endpoints y servicios necesarios para gestionar los productos y carritos de compra en el e-commerce.
Desarrollar el servidor basado en Node.JS y
Express, que escuche en el puerto 8080
y
disponga de dos grupos de rutas: /products
y /carts
. Dichos endpoints
estarán implementados con el router de Express, con las siguientes
especificaciones:
- Para el manejo de productos, el cual tendrá su router en
/api/products/
, configurar las siguientes rutas:- La ruta raíz
/
, mediante el método GET, deberá listar todos los productos de la base (incluyendo la limitación?limit
del desafío anterior) - La ruta
/:pid
, mediante el método GET, deberá traer sólo el producto con el id proporcionado. - La ruta raíz
/
, mediante el método POST, deberá agregar un nuevo producto con los campos:id
:number
/string
(a tu elección). El id NO se manda desde el body. El id se autogenera como lo hemos visto desde los primeros entregables, asegurando que NUNCA se repetirán los ids en el archivo.title
:string
,description
:string
,code
:string
,price
:number
,status
:boolean
, verdadero (true
) por defecto,stock
:number
,category
:string
,thumbnails
:Array
destring
que contengan las rutas donde están almacenadas las imágenes referentes a dicho producto.
Todos los campos son obligatorios, a excepción de
thumbnails
. - La ruta
/:pid
, mediante el método PUT, deberá tomar un producto y actualizar o eliminar el id al momento de hacer dicha actualización. - La ruta
/:pid
, mediante el método DELETE, deberá eliminar el producto con el pid indicado.
- La ruta raíz
- Para el carrito, el cual tendrá su router en
/api/carts/
, configurar dos rutas:- La ruta raíz
/
, mediante el método POST, deberá crear un nuevo carrito con la siguiente estructura:id
:number
/string
(a tu elección). De igual manera, como con los productos, debes asegurar que nunca se dupliquen los ids y que éste se genere automáticamente.products
:Array
que contendrá objetos que representen a cada producto
- La ruta
/:cid
, mediante el método GET, deberá listar los productos que pertenezcan al carrito con el parámetro cid proporcionado. - La ruta
/:cid/product/:pid
, mediante el método POST, deberá agregar el producto al arregloproducts
del carrito seleccionado, agregándose como objeto bajo el siguiente formato:product
: SÓLO DEBE CONTENER EL ID DEL PRODUCTO. Es crucial que no agregues el producto completo.quantity
: debe contener el número de ejemplares de dicho producto. El producto de momento, se agregará de uno en uno.
- La ruta raíz
- Además, si un producto ya existente se intenta agregar al arreglo de
productos, incrementar el campo
quantity
de dicho producto. - La persistencia de la información se implementará utilizando el file
system, donde los archivos
productos.json
ycarrito.json
respaldan la información. - No es necesario realizar ninguna implementación visual. Todo el flujo se puede realizar por Postman o por el cliente de tu preferencia.
Link al repositorio de GitHub
con el proyecto completo, sin la carpeta de node_modules
.
- No olvides
app.use(express.json())
. - No es necesario implementar multer.
- Link al vídeo donde se explica.
- Incluí la suite de pruebas, que se puede ejecutar mediante el comando
node --test
, mediante la cual se realizarán todas las pruebas para verificar que se cumpla con los requerimientos listados en Se debe entregar.
Desarrollar un servidor basado en Express donde podamos hacer consultas a nuestro archivo de productos.
- Se deberá incluir la clase
ProductManager
que actualmente utilizamos con persistencia de archivos. - Desarrollar un Servidor Express que, en su archivo
app.js
importe el archivo deProductManager
que actualmente tenemos. - El servidor debe contar con los siguientes enpoints:
- Ruta
/products
, la cual debe leer el archivo de productos y devolverlos dentro de un objeto. Agregar el soporte para recibir por query params el valor "?limit=
" el cual recibirá un límite de resultados. Si no se recibe query de límite, se devolverán todos los productos. Si se recibe un límite, sólo devolver el número de productos solicitados. - Ruta
/products/:pid
la cual debe recibir porreq.params
elpid
(product Id), y devolver sólo el producto solicitado, en lugar de todos los productos.
- Ruta
- Tu clase lee archivos con promesas. Recuerda usar
async
/await
en tus endpoints. - Utiliza un archivo que ya tenga productos, pues el desafío sólo es para gets.
Liga al repositorio de GitHub con el proyecto completo, el cual debe incluir:
- Carpeta
src
con el archivoapp.js
dentro y tuProductManager
dentro. - Archivo
package.json
con la info del proyecto. - No incluir los
node_modules
generados.
- Se instalarán las dependencias a partir del comando
npm install
. - Se echará a andar el servidor.
- Se revisará que el archivo YA CUENTE CON, AL MENOS, DIEZ PRODUCTOS CREADOS al momento de su entrega. Es importante para que los tutores no tengan que crear los productos por sí mismos, y así agilizar el proceso de tu evaluación.
- Se corroborará que el servidor esté corriendo en el puerto
8080
. - Se mandará a llamar desde el navegador a la url
http://localhost:8080/products
sin query, eso debe devolver todos los productos. - Se mandará a llamar desde el navegador a la url
http://localhost:8080/products?limit=5
, eso debe devolver sólo los primeros 5 productos. - Se mandará a llamar desde el navegador a la url
http://localhost:8080/products/2
, eso debe devolver sólo el producto con elid = 2
. - Se mandará a llamar desde el navegador a la url
http://localhost:8080/products/34123123
, al no existir un producto con elid = 34123123
, debe devolver un objeto con un error indicando que el producto no existe.
- Se agregó el script
start
, en el archivopackage.json
, para iniciar el servidor desde la consola con el comandonpm start
. - Se agregó el archivo
initialInsert.js
que se encarga de verificar que exista un archivoProductManager.json
en la carpeta raíz con, por lo menos, 10 productos para realizar las pruebas. - Se agregó el script
prestart
, en el archivopackage.json
, para ejecutar el código del archivoinitialInsert.js
antes de arrancar el servidor Express. - Se agregó el script
dev
, en el archivopackage.json
para iniciar el servidor en modo depuración. - Se agregó el prefijo
api/
a las rutas indicadas en la consigna del desafío, de modo que, a partir de esta etapa del proyecto, la ruta para desplegar los productos eshttp://localhost:8080/api/products
en vez dehttp://localhost:8080/products
.
Realizar una clase de nombre ProductManager
, el cual permitirá trabajar
con múltiples productos. Éste debe poder agregar, consultar, modificar y
eliminar un producto y manejarlo en persistencia de archivos (basado en
entregable 1).
- La clase debe contar con una variable
this.path
, el cual se inicializará desde el constructor y debe recibir la ruta a trabajar desde el momento de generar su instancia. - Debe guardar objetos con el siguiente formato:
id
(se debe incrementar automáticamente, no enviarse desde el cuerpo)title
(nombre del producto)description
(descripción del producto)price
(precio)thumbnail
(ruta de imagen)code
(código identificador)stock
(número de piezas disponibles)
- Debe tener un método
addProduct
el cual debe recibir un objeto con el formato previamente especificado, asignarle unid
autoincrementable y guardarlo en el arreglo (recuerda siempre guardarlo como un array en el archivo). - Debe tener un método
getProducts
, el cual debe leer el archivo de productos y devolver todos los productos en formato de arreglo. - Debe tener un método
getProductById
, el cual debe recibir unid
, y tras leer el archivo, debe buscar el producto con elid
especificado y devolverlo en formato objeto. - Debe tener un método
updateProduct
, el cual debe recibir elid
del producto a actualizar, así también como el campo a actualizar (puede ser el objeto completo, como en una DB), y debe actualizar el producto que tenga eseid
en el archivo. NO DEBE BORRARSE SU ID. - Debe tener un método
deleteProduct
, el cual debe recibir unid
y debe eliminar el producto que tenga eseid
en el archivo.
Archivo de JavaScript con el nombre ProductManager.js
.
Opcionalmente, liga al repositorio de GitHub al que se subió el código.
- Se creará una instancia de la clase
ProductManager
. - Se llamará
getProducts
recién creada la instancia, debe devolver un arreglo vacío[]
. - Se llamará al método
addProduct
con los campos:title
: "producto prueba"description
: "Este es un producto prueba"price
: 200thumbnail
: "Sin imagen"code
: "abc123"stock
: 25
El objeto debe agregarse satisfactoriamente con un
id
generado automáticamente SIN REPETIRSE. - Se llamará el método
getProducts
nuevamente, esta vez debe aparecer el producto recién agregado. - Se llamará al método
getProductById
y se corroborará que devuelva el producto con elid
especificado, en caso de no existir, debe arrojar un error. - Se llamará al método
updateProduct
y se intentará cambiar un campo de algún producto, se evaluará que no se elimine elid
y que sí se haya hecho la actualización. - Se llamará al método
deleteProduct
, se evaluará que realmente se elimine el producto o que arroje un error en caso de no existir.
Realizar una clase ProductManager
que gestione un conjunto de productos.
Te acercamos esta ayuda: Hands on lab sobre creación de clases (Clase 1)
- Debe crearse desde su constructor con el elemento
products
, el cual será un arreglo vacío. - Cada producto que gestione debe contar con las propiedades:
title
(nombre del producto)description
(descripción del producto)price
(precio)thumbnail
(ruta de imagen)code
(código identificador)stock
(número de piezas disponibles)
- Debe contar con un método
addProduct
el cual agregará un producto al arreglo de productos inicial.- Validar que no se repita el campo
code
y que todos los campos sean obligatorios. - Al agregarlo, debe crearse con un
id
automáticamente.
- Validar que no se repita el campo
- Debe contar con un método
getProducts
el cual debe devolver el arreglo con todos los productos creados hasta ese momento. - Debe contar con un método
getProductById
el cual debe buscar en el arreglo en producto que coincida con elid
- En caso de no coincidir ningún
id
, mostrar en la consola un error "Not found".
- En caso de no coincidir ningún
Archivo de JavaScript, listo para ejecutarse desde node.
Opcionalmente, liga al repositorio de GitHub al que se subió el código.
- Se creará una instancia de la clase
ProductManager
. - Se llamará
getProducts
recién creada la instancia, debe devolver un arreglo vacío[]
. - Se llamará al método
addProduct
con los campos:title
: "producto prueba"description
: "Este es un producto prueba"price
: 200thumbnail
: "Sin imagen"code
: "abc123"stock
: 25
El objeto debe agregarse satisfactoriamente con un
id
generado automáticamente SIN REPETIRSE. - Se llamará al método
getProducts
nuevamente, esta vez debe aparecer el producto recién agregado. - Se llamará al método
addProduct
con los mismos campos de arriba, debe arrojar un error porque el código estará repetido. - Se evaluará que
getProductById
devuelva error si no encuentra el producto o el producto en caso de encontrarlo.