En este desafío se crearon 1000 productos con la función "npm run product" que ejecuta un script para crear de forma aleatoria información usando una dependencia de "fakers" para traer información aleatoria.
También se incorporó compresión al servidor.
En este desafío se implemento un Custom Logger utilizando la dependendencia "Winston". Se creó un endpoint "api/loggers" donde se puede probar que el logger está funcionando correctamente.
Se condicionó que si se inicializa el servidor en entorno de desarollo sólo se muestra la consola con los diferentes Logs correspondientes. En cambio si se inicializa en producción entonces los errores se guardan también en un archivo dentro de utils/errors/errors.log
la biblioteca Commander para facilitar la creación de comandos personalizados. Además, se han configurado diferentes archivos .env para gestionar de forma segura las variables de entorno. La carpeta services ha sido creada para establecer la conexión con los diferentes modelos de datos utilizados en la aplicación.
la biblioteca Commander para facilitar la creación de comandos personalizados. Además, se han configurado diferentes archivos .env para gestionar de forma segura las variables de entorno. La carpeta services ha sido creada para establecer la conexión con los diferentes modelos de datos utilizados en la aplicación.
Algunas características y funcionalidades clave de este código son:
En el constructor de la clase, se inicializa un enrutador de Express que se puede obtener y utilizar para definir rutas.
Se define un conjunto de funciones para facilitar la creación de respuestas HTTP comunes, como respuestas exitosas con diferentes códigos de estado (200, 201) y respuestas de error (400, 401, 403, 404).
Se implementa una función de middleware policies que verifica si se cumplen las políticas de autorización especificadas antes de permitir el acceso a una ruta. Estas políticas pueden ser de tipo "PUBLIC", "USER" o "ADMIN", dependiendo del rol del usuario.
Se proporcionan métodos create, read, update, y destroy que permiten definir fácilmente rutas para la creación, lectura, actualización y eliminación de recursos, respectivamente. Estas rutas pueden estar protegidas por políticas de autorización.
A través de la función applyCbs, se pueden aplicar callbacks (funciones middleware) de forma dinámica a cada ruta, lo que facilita la modularización y reutilización del código.
Al integrar esta clase CustomRouter en una aplicación Express, se pueden definir y proteger rutas de manera estructurada y segura, asegurando que solo los usuarios autorizados tengan acceso a ciertas funcionalidades.
Se ha implementado un nuevo sistema de sesiones que permite a los usuarios registrarse, iniciar sesión, verificar su estado en línea y cerrar sesión de manera segura. Esta mejora proporciona una mayor seguridad y una mejor experiencia de usuario en la aplicación.
En el front se realizaron las funciones necesarias para renderizar el carrito solo si el usuario está logueado y solo puede agregar al carrito un usuario son su sesión activa.
Esta es una aplicación web simple que permite a los usuarios navegar, agregar productos a su carrito y realizar compras. La aplicación incluye funciones como registro de usuario, inicio de sesión y gestión de carrito. Está construida utilizando Node.js y MongoDB para el almacenamiento de datos.
- Clonar este repositorio
- Ejecutar
npm install
para instalar las dependencias - Configurar una base de datos MongoDB y actualizar los detalles de conexión en el archivo
.env
- Ejecutar
npm run dev
para iniciar el servidor
- Operaciones CRUD para productos, usuarios y carritos
- Paginación para ver todos los recursos
- Manejo de errores con errorHandler y pathHandler
- Registro de solicitudes con morgan
- API REST 100% en inglés
- Conexión a MongoDB
- Autenticación básica de usuario con roles
- Página de inicio con listado de productos y filtrado por categoría
- Página de detalle del producto con funcionalidad de agregar al carrito
- Formularios de registro e inicio de sesión de usuario
- Página de carrito para ver y gestionar elementos en el carrito
- id (identificador hexadecimal de 12 bytes)
- título (obligatorio)
- foto (valor por defecto)
- categoría (valor por defecto)
- precio (por defecto 1)
- stock (por defecto 1)
- id (identificador hexadecimal de 12 bytes)
- foto (valor por defecto)
- email (obligatorio)
- contraseña (obligatorio)
- rol (por defecto 0)
- user_id (referencia al usuario que agregó el producto)
- product_id (referencia al producto agregado al carrito)
- cantidad (numérico, obligatorio)
- estado (estado de la compra: "reservado", "pagado", "entregado")
/api/productos
: Operaciones CRUD para productos/api/usuarios
: Operaciones CRUD para usuarios/api/carritos
: Operaciones CRUD para carritos/api/sessions/register
: Similar al create de un usuario, implementa la estrategia de passport correspondiente y hashea la contraseña/api/sessions/login
: Para iniciar sesión, implementa la estrategia de passport correspondiente y compara la contraseña/api/sessions
: Para ver los datos del usuario online (y renderizar el perfil de usuario o condicionar la barra de navegación), implementa la estrategia de passport correspondiente- Login/register con Google
localhost:8080/
: Página de inicio con listado de productos y filtradolocalhost:8080/products/:pid
: Página de detalle del producto con botón de agregar al carritolocalhost:8080/users/register
: Formulario de registro de usuario (funcional)localhost:8080/users/login
: Formulario de inicio de sesión de usuario (funcional)localhost:8080/users
: Página de perfil de usuario, funciona sin el parámetro (usa los datos de la sesión para enviar el id del usuario)localhost:8080/carts
: Página de carrito, funciona sin el parámetro (usa los datos de la sesión para enviar el id del usuario)
- Barra de navegación con la correspondiente protección de rutas (si el usuario está o no con sesión iniciada)
- Alertas de éxito/fracaso de registro, inicio y cierre de sesión funcionales
- Sebastián Ávila
- Pablo Messa