Esta es una aplicación de ejemplo que permite gestionar una base de datos de películas utilizando Node.js y MySQL.
En el desarrollo de esta aplicación, he utilizado y aprendido sobre varias tecnologías clave:
- Node.js: Un entorno de ejecución para JavaScript en el lado del servidor.
- MySQL: Un sistema de gestión de bases de datos relacional.
- MySQL2: Un cliente MySQL mejorado para Node.js, con soporte para promesas.
- Express.js: Un framework de aplicación web minimalista para Node.js.
- Zod: Una biblioteca de validación de esquemas para TypeScript y JavaScript.
- HTTPie: Una herramienta para hacer solicitudes HTTP y probar APIs.
-
Configuración del Servidor:
- Aprendí a configurar un entorno de ejecución de Node.js para manejar tanto solicitudes HTTP como conexiones con bases de datos.
-
Gestión de Bases de Datos:
- Gané experiencia en la configuración y gestión de una base de datos MySQL, incluyendo la creación de tablas y la ejecución de consultas SQL.
-
Modelado de Datos:
- Desarrollé habilidades en la estructuración de modelos de datos relacionales y en la gestión de relaciones entre diferentes entidades.
-
Validación de Datos:
- Implementé validaciones robustas para asegurar la integridad y consistencia de los datos ingresados.
-
Desarrollo de API RESTful:
- Aprendí a diseñar y construir endpoints para la gestión de recursos utilizando las mejores prácticas en la creación de API RESTful.
-
Pruebas de API:
- Utilicé herramientas para realizar solicitudes HTTP y probar la funcionalidad de la API de manera efectiva.
-
Asegúrate de tener MySQL instalado y funcionando en tu máquina.
-
Crea una base de datos llamada
moviesdb
en tu servidor MySQL. -
Configura tus credenciales de MySQL en el archivo de configuración:
const config = {
host: 'localhost',
port: 3306,
user: 'root',
password: '',
database: 'moviesdb'
};
- Inicializa la base de datos con las tablas necesarias. Puedes utilizar el siguiente script SQL como ejemplo:
CREATE TABLE movies (
id BINARY(16) PRIMARY KEY DEFAULT (UUID_TO_BIN(UUID())),
title VARCHAR(255) NOT NULL,
year INT NOT NULL,
director VARCHAR(255) NOT NULL,
duration INT NOT NULL,
poster TEXT,
rate DECIMAL(2, 1) UNSIGNED NOT NULL
);
CREATE TABLE genres (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL UNIQUE
);
CREATE TABLE movies_genre (
PRIMARY KEY (id_movie, id_genre),
id_movie BINARY(16),
id_genre INT,
FOREIGN KEY (id_movie) REFERENCES movies(id),
FOREIGN KEY (id_genre) REFERENCES genres(id)
);
Los controladores de la aplicación están definidos en controllers/movieController.js
y proporcionan las siguientes funcionalidades:
- getAll: Obtiene todas las películas, con opción de filtrarlas por género.
- getById: Obtiene una película por su ID.
- create: Crea una nueva película.
- update: Actualiza una película existente.
- delete: Elimina una película por su ID.
Los modelos de la aplicación están definidos en models/mysql/movie.js
y proporcionan las siguientes funcionalidades:
- getAll: Obtiene todas las películas con sus géneros.
- getById: Obtiene una película por su ID con sus géneros.
- create: Crea una nueva película y sus géneros.
- update: Actualiza una película y sus géneros.
- delete: Elimina una película y sus géneros.
Las funciones de validación están definidas en schemas/movies.js
utilizando zod
para validar los datos de las películas.
El archivo api.http
contiene ejemplos de solicitudes HTTP para probar la API de la aplicación. Aquí hay algunos ejemplos de cómo utilizarlo:
- Recupera todas las películas
GET http://localhost:1234/movies
- Recupera películas por id
GET http://localhost:1234/movies/2704e434-e3f7-11ef-b114-f0795930848c
GET http://localhost:1234/movies/1c910c8a-e25c-11ef-8a3b-f0795930848c
- Recupera todas las películas por género
GET http://localhost:1234/movies?genre=animation
- Crea una película
POST http://localhost:1234/movies
Content-Type: application/json
{
"title": "Pacific Rim",
"year": 2013,
"director": "Guillermo del Toro",
"duration": 131,
"poster": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTN85QeuAWcYaiMOLKbwDJRKH37QBj5Dk9sgw&s",
"genre": [
"Comedy"
],
"rate": 7.1
}
- Crea una película con datos erróneos
POST http://localhost:1234/movies
Content-Type: application/json
{
"title": 100,
"year": "No tiene año",
"director": 656,
"duration": -56,
"poster": "imagen.jpg",
"genre": [
"Algo",
"Rara"
],
"rate": -5
}
- Actualiza una película
PATCH http://localhost:1234/movies/2704e434-e3f7-11ef-b114-f0795930848c
Content-Type: application/json
{
"year": 2013
}
- Actualiza el género de una película
PATCH http://localhost:1234/movies/2704e434-e3f7-11ef-b114-f0795930848c
Content-Type: application/json
{
"genre": [
"Action",
"Sci-fi"
]
}
- Elimina una película
DELETE http://localhost:1234/movies/670ca5fc-e315-11ef-86a2-f0795930848c
Este proyecto está bajo la licencia MIT.
Este proyecto de gestión de películas ha sido una gran oportunidad para aplicar mis conocimientos en desarrollo backend con Node.js y MySQL, así como para aprender nuevas tecnologías y mejorar mis habilidades de desarrollo. La implementación de controladores, modelos y validaciones ha sido fundamental para estructurar la aplicación de manera eficiente y escalable.
Agradezco cualquier feedback y contribuciones al proyecto. Si tienes alguna pregunta o sugerencia, ¡no dudes en contactarme!