Merge branch 'main' into 'julio-final'
julio moreno authored
# Conflicts:
#   README.md
28ae439d

CARRICOCHE

En este proyecto se realizará un servidor web en el que se aloje una página de renting y venta de coches.

ESQUEMA DEL PROYECTO

/Carricoche

├── /carricoche                 Directorio donde se almacena BBDD y docker
│   ├── /scripts                Directorio donde se almacena el SQL
│   ├── .env                    Variables de entorno
│   └── /docker                 Archivos de configuración de Docker

├── /controllers/               Lógica de los controladores (manejo de las rutas)
│   ├── comprasController.js
│   ├── clientesController.js
│   ├── sessionController.js
│   └── ventasController.js

├── /models/                    Modelos para interactuar con la base de datos
│   └── userModel.js            Modelo de usuario (si existe)

├── /routers/                   Definición de las rutas y su asignación a controladores
│   ├── clientesRouter.js
│   ├── movimientosRouter.js
│   └── sessionRouter.js

├── /views/                     Vistas para renderizar (plantillas Pug)
│   ├── clientes/
│   │   ├── list.pug
│   │   ├── add.pug
│   │   ├── edit.pug
│   │   └── compras/
│   │       ├── compras_cliente.pug
│   │       ├── add.pug
│   │       └── edit.pug
│   ├── compras/
│   │   ├── list.pug
│   │   ├── add.pug
│   │   └── edit.pug
│   ├── ventas/
│   │   ├── list.pug
│   │   ├── add.pug
│   │   └── edit.pug
│   ├── login/
│   │   ├── login.pug
│   │   ├── register.pug
│   │   ├── forgot.pug
│   │   └── reset.pug
│   ├── error.pug               
│   ├── index.pug               Vista principal
│   └── movimientos.pug         

├── app.js                      Archivo principal que arranca el servidor Express
├── db.js                       Archivo principal que establece una conexión con la base de datos
├── .gitignore                  Archivos y carpetas que Git debe ignorar
├── package.json                Dependencias, scripts y metadatos del proyecto
└── README.md                   Descripción del proyecto

INSTALACIÓN

1. Dependencias

Lo primero será instalar las dependecias, para ello las instalaremos con npm:

npm install body-parser
npm install dotenv
npm install express
npm install express-session
npm install mysql2
npm install pug
npm install bcrypt
npm install nodemailer
npm install crypto
npm install jsonwebtoken

o instalarlas directamente desde el package.json

npm install 

Explicación de cada dependencia:

  • Express: Framework de Node.js que permite crear aplicaciones web de manera rápida y sencilla. Maneja solicitudes HTTP, enruta URLs y renderiza plantillas de HTML.

  • Express-Session: Middleware que gestiona sesiones en aplicaciones web construidas con Express, permitiendo almacenar y recuperar información de sesión para cada usuario.

  • MySQL2: Driver de base de datos que permite interactuar con bases de datos MySQL desde una aplicación Node.js, facilitando consultas, inserciones, actualizaciones y eliminaciones de datos.

  • Pug: Motor de plantillas que permite renderizar HTML dinámico en aplicaciones web, separando la lógica de negocio de la presentación de la interfaz de usuario.

  • Body-Parser: Middleware que parsea los datos de formulario enviados en solicitudes HTTP y los convierte en objetos JSON que pueden ser manejados por la aplicación.

  • Dotenv: Librería que carga variables de entorno desde un archivo .env en aplicaciones Node.js, separando la configuración de la aplicación de su código fuente.

  • Bcrypt: Librería que cifra contraseñas de manera segura, permitiendo almacenar contraseñas cifradas en la base de datos y verificarlas al autenticar usuarios.

  • Nodemailer: Librería que permite enviar correos electrónicos desde una aplicación Node.js, útil para enviar correos de activación, restablecimiento de contraseña y notificaciones.

  • Crypto: Librería que proporciona funciones criptográficas para generar tokens y hashes seguros, utilizada para crear tokens de activación y restablecimiento de contraseña.

  • Jsonwebtoken: Librería que permite generar y verificar tokens JSON Web Tokens (JWT) para autenticar y autorizar usuarios en aplicaciones web.

2. Creación del docker

Lo que hay que hacer es crear un contenedor en el directorio carricoche utilizando un docker-compose. Para ello se creará un archivo que contenga un servicio de adminer y otro de mysql, añadiendo la siguientes líneas , dentro del servicio mysql, para que al iniciarse reconozca automáticamente el archivo .sql.

volumes:
    - ./scripts:/docker-entrypoint-initdb.d

Se puede acceder a un ejemplo de docker-compose en este enlace : https://hub.docker.com/_/adminer

2. Creación del fichero .env

El fichero .env se deberá crear forzosamente en el directorio carricoche,no el raíz, manteniedo el siguiente formato:

MYSQL_ROOT_PASSWORD = contraseña deseada
MYSQL_USERNAME = root
MYSQL_PORT = puerto deseado
DATABASE = carricoche
MYSQL_HOST = localhost
ADMINER_PORT = puerto deseado
SERVICE_PORT = puerto deseado

La creación de este fichero es vital para el funcionamiento tanto del contenedor docker como de la aplicación en sí.

INICIAR APLICACIÓN

node app.js
npm start #comando definido en el package.json

END POINTS

Compras

Método Ruta Endpoint
GET /movimientos/compras Obtener todas las compras
GET /movimientos/compras/add Formulario para agregar una compra
POST /movimientos/compras/add Agregar una compra
GET /movimientos/compras/del/:id Eliminar una compra por ID
GET /movimientos/compras/edit/:id Formulario para editar una compra por ID
POST /movimientos/compras/edit/:id Editar una compra por ID

Ventas

Método Ruta Endpoint
GET /movimientos/ventas Obtener todas las ventas
GET /movimientos/ventas/add Formulario para agregar una venta
POST /movimientos/ventas/add Agregar una venta
GET /movimientos/ventas/del/:id Eliminar una venta por ID
GET /movimientos/ventas/edit/:id Formulario para editar una venta por ID
POST /movimientos/ventas/edit/:id Editar una venta por ID

Clientes

Método Ruta Endpoint
GET /clientes Obtener todos los clientes
GET /clientes/:id/compras Obtener las compras de un cliente por ID
GET /clientes/:id/ventas Obtener las ventas de un cliente por ID
GET /clientes/:id/compras/del/:id_compra Eliminar una compra de un cliente por ID
GET /clientes/:id/compras/edit/:id_compra Formulario para editar una compra de un cliente por ID
POST /clientes/:id/compras/edit/:id_compra Editar una compra de un cliente por ID
GET /clientes/:id/compras/add Formulario para agregar una compra a un cliente por ID
POST /clientes/:id/compras/add Agregar una compra a un cliente por ID
GET /clientes/:id/ventas/del/:id_venta Eliminar una venta de un cliente por ID
GET /clientes/:id/ventas/edit/:id_venta Formulario para editar una venta de un cliente por ID
POST /clientes/:id/ventas/edit/:id_venta Editar una venta de un cliente por ID
GET /clientes/:id/ventas/add Formulario para agregar una venta a un cliente por ID
POST /clientes/:id/ventas/add Agregar una venta a un cliente por ID

DOCUMENTACIÓN DEL CÓDIGO

Escrita mediante comentarios en los distintos ficheros del proyecto