Este es un servidor web creado utilizando NodeJS como requisito de proyecto final para el curso de Backend de CoderHouse.
Te permite crear una cuenta en la Taberna y añadir artículos al carrito para generar ordenes de compra.
Es una aplicación en NodeJS utilizando el framework Express y como base de datos MongoDB, utilizando Mongoose como ODM.
Para producción se utilza pm2 para manejar los procesos de Node, de manera que los procesos hijos de la aplicación pueden compartir todos los núcleos disponibles.
Para la autenticación y la autorización utilicé la libreria Passport con su estrategia Passport-Local para autenticación con usuario y contraseña. La encriptación de las contraseñas se hace con la libreria bcrypt.
Las notificaciones al correo electrónico para usuarios recien creados y ordenes realizadas se manejan con Nodemailer.
El chat está implementado en base a la tecnología Websocket utilizando la libreria socket.io.
Para las vistas se utilizó como motor de plantillas Handlebars.
- express-sessions
- express-handlebars
- compression
- connect-mongo
- cookie-parser
- cors
- multer
- sweetalert2
- winston
- dotenv
- nodemon
.
├───logs
└───src
├───auth
│ └───strategies
├───config
├───controllers
│ └───modules
├───dal
│ ├───memory
│ │ └───dao
│ │ └───modules
│ └───mongoDB
│ ├───dao
│ │ └───modules
│ ├───dto
│ └───models
│ └───modules
├───middleware
├───public
│ ├───css
│ ├───images
│ │ └───products
│ └───js
│ └───modules
├───routes
│ └───modules
├───server
├───services
│ └───modules
├───utils
└───views
├───layouts
├───pages
└───partials
En este repositorio se encuentra una arquitectura de software por capas.
Una arquitectura por capas describe un sistema de (normalmente) 3-4 capas que son responsables de tareas separadas. Cada capa puede utilizar la capa directamente inferior, pero no a la inversa. Esta aplicación posee las siguientes capas:
- Capa del servidor (Configuración, cargado de dependencias y puesta en marcha del servidor.)
- Capa de presentación (Vistas)
- Capa de rutas (Definicion de rutas y endpoints )
- Capa de controladores (Funciones que manejan)
- Capa de servicios (Lógica de negócio)
- Capa de acceso a los datos (Manejo de peticiones y transformación de los datos)
Cada capa posee un archivo index donde se reunen y exportan los modulos de cada capa, y ademas es en donde se realiza la inyección de dependencias de las capas inferiores (Modulos de la capa inferior necesarios para su funcionamiento).
Esto lo realicé utilizando principalmente el paradigma de objetos para asi solo instanciar cada modulo una sola vez y utilizar esas instancias en la capa superior.
De todas maneras en algunos casos se utilizó un paradigma más funcional para realizar esto mismo, utilizando closures y manejando el scope.
Ademas de estas capas tambien existen carpetas para:
- Auth (Configuración de estrategias de autenticación y autorización)
- Middlewares (Funciones de validación pre-controlador)
- Utils (Funciones y servicios auxiliares)
- Config (Acceso a variables de entorno)
Dentro de esta capa podemos encontrar un index que posee una clase con un patrón de diseño Factory que permite instanciar, de acuerdo a la persistencia utilizada por el entorno, la clase correspondiente. Esto permite agregar nuevos tipos de persistencias para intercambiar sin necesidad de modificar las capas superiores
App deployada en:
https://taberna-tienda.herokuapp.com/
git clone https://github.com/jesusmpds/e-commerce-store-coder.git
cd e-commerce-store-coder
npm install
Para correr la aplicación en local necesitarás un servidor de mongodb corriendo en tu maquina, o un cluster en la nube en MongoAtlas. Para añadir el string de tu base de datos puedes modificar la variable de entorno llamada MONGO_URI. Más sobre las variables de entorno a continuación.
No hace falta que creees la base de datos o las colecciones. Ya que estas se crean de manera automatica gracias a Moongose ODM al inciarse la conexión con la base de datos.
- Encontrarás un archivo llamado
.env.example
en el directorio raíz del proyecto. - Crea un nuevo archivo copiando y pegando el archivo y renombrándolo como
.env
.cp .env.ejemplo .env
- El archivo
.env
ya se ignora por defecto, por lo que nunca se comprometen las credenciales que utilizas. - Cambia los valores del archivo para tu entorno. He añadido comentarios útiles en el archivo
.env.example
para entender las constantes.
-
Modo producción:
npm start
-
Modo Desarrollo usando Nodemon:
npm run watch
-
Modo de debugging:
npm run debug