Este trabajo práctico tiene como objetivo principal que los alumnos adquieran experiencia práctica en la implementación de asociaciones 1 a N y N a M en el contexto de una API REST utilizando un ORM (Object-relational mapping).
-
Asociaciones 1 a N y N a M: Las asociaciones 1 a N y N a M son conceptos fundamentales en el diseño de bases de datos relacionales. En una asociación 1 a N, un registro de una tabla está asociado con uno o más registros de otra tabla. Por otro lado, en una asociación N a M, varios registros de una tabla están asociados con varios registros de otra tabla a través de una tabla de unión intermedia.
-
API REST: Una API REST (Representational State Transfer) es un conjunto de reglas y convenciones para la creación de servicios web que permiten la comunicación entre sistemas. En este trabajo práctico, utilizaremos una API REST para exponer recursos y permitir operaciones CRUD (Create, Read, Update, Delete) sobre estos recursos.
-
Enfoque Práctico: Los alumnos implementarán las asociaciones mencionadas anteriormente en el contexto de una API REST utilizando un ORM específico,Sequelize. Se espera que los alumnos comprendan cómo definir modelos, establecer relaciones entre ellos y utilizar las capacidades del ORM para interactuar con la base de datos.
-
Criterios de Evaluación: Se evaluará la precisión y completitud en la implementación de las asociaciones en la API REST, así como la funcionalidad completa del CRUD para los recursos expuestos por la API.
Han sido contratados/as por una empresa de manufactura para desarrollar un sistema interno de gestión de productos. La empresa fabrica una amplia gama de productos tecnológicos que requieren componentes específicos y son producidos por múltiples fabricantes asociados. Actualmente, el proceso de gestión de esta información es manual y está descentralizado, lo que genera demoras y problemas en la producción. La empresa busca automatizar y centralizar estos datos mediante un sistema web eficiente que permita gestionar los productos, fabricantes y componentes de manera integrada.
Basandose en el siguiente diagrama de entidad-relacion (DER) deberán generar los modelos y la asociaciones en Sequelize para que la API pueda interacturar con la base de datos a través de los Modelos.
- Un Producto puede tener muchos fabricantes, y un Fabricante puede fabricar muchos productos.
- Un Producto puede tener muchos componentes, y un Componente puede formar parte de varios productos.
El motor de base de datos a utilizar podra ser elegido por los alumnos. La recomendacion es utilizar sqlite para pruebas simple y luego probar con otro motor de base de datos tipo MySql o Postgres.
Debera contar con las dependencias de produccion y desarrollo necesarias de un proyecto node. Por ejemplo:
npm i sequelize sqlite3
npm i -D sequelize-cli
- Inicializar un proyecto sequelize
npx sequelize-cli init
- Generar un modelos simple
npx sequelize-cli model:generate --name Carrera --attributes "nombre:string,grado:string,universidad:string"
Implementar la API utilizando el framework express en el entorde de ejecucion de un poryecto NodeJs. Organizar el código en rutas, controlers y middleware utilizando la separación por recurso. A continuación se detallan los endpoinds que deberán estar disponbiles en la API.
Verbo | Recurso | Status code | Descripción |
---|---|---|---|
GET | /productos | 200 | Obtener todos los productos |
GET | /productos/:id | 200, 404 | Obtener un producto en particular |
POST | /productos | 201, 400 | Crear un producto |
PUT | /productos/:id | 200, 404 | Modificar los datos de un producto en particular |
DELETE | /productos/:id | 200, 404, 500 | Borrar un producto en particular |
POST | /productos/:id/fabricantes | 201, 404, 400 | Crear la asociación de producto con 1 o N fabricantes |
GET | /productos/:id/fabricantes | 200, 404 | Obtener todos los fabricantes de un producto |
POST | /productos/:id/componentes | 201, 404, 400 | Crear la asociación de producto con 1 o N componentes |
GET | /productos/:id/componentes | 200, 404 | Obtener todos los componentes de un producto |
GET | /fabricantes | 200 | Obtener todos los fabricantes |
GET | /fabricantes/:id | 200, 404 | Obtener un fabricante en particular |
POST | /fabricantes | 201, 400 | Crear un fabricante |
PUT | /fabricantes/:id | 200, 404 | Modificar los datos de un fabricante en particular |
DELETE | /fabricantes/:id | 200, 404, 500 | Borrar un fabricante en particular |
GET | /fabricantes/:id/productos | 200, 404 | Obtener todos los productos de un fabricante |
GET | /componentes | 200 | Obtener todos los componentes |
GET | /componentes/:id | 200, 404 | Obtener un componente en particular |
POST | /componentes | 201, 400 | Crear un componente |
PUT | /componentes/:id | 200, 404 | Modificar los datos de un componente en particular |
DELETE | /componentes/:id | 200, 404, 500 | Borrar un componente en particular |
GET | /componentes/:id/productos | 200, 404 | Obtener todos los productos de un componente |
A modo de ejemplo se muestra el resultado de algunas respuesta de los endpoind detallado en la tabla de la sección anterior.
Recurso: /fabricantes/1/productos
Obtiene los datos del fabricante registrado con el id 1, con todos los productos que fabrica, incluyendo los atributos de cada producto y los componentes asociados a esos productos.
{
"id": 1,
"nombre": "TechCorp",
"direccion": "1234 Elm St, Ciudad",
"contacto": "+123456789",
"pathImgPerfil": "/images/fabricantes/techcorp.jpg",
"productos": [
{
"id": 1,
"nombre": "Laptop X200",
"descripcion": "Una laptop de alto rendimiento",
"precio": 1200.99,
"pathImg": "/images/productos/laptop-x200.jpg",
"componentes": [
{
"id": 1,
"nombre": "Procesador Intel i7",
"descripcion": "Procesador de octava generación"
},
{
"id": 2,
"nombre": "SSD 1TB",
"descripcion": "Disco sólido de 1TB de capacidad"
}
]
},
{
"id": 2,
"nombre": "Smartphone S5",
"descripcion": "Teléfono inteligente con pantalla OLED",
"precio": 799.99,
"pathImg": "/images/productos/smartphone-s5.jpg",
"componentes": [
{
"id": 3,
"nombre": "Pantalla OLED 6.5 pulgadas",
"descripcion": "Pantalla de alta definición"
},
{
"id": 4,
"nombre": "Batería 4000mAh",
"descripcion": "Batería de larga duración"
}
]
}
]
}
Recurso: /productos/1/fabricantes
Obtiene los datos del producto registrado con el id 1, con todos los fabricantes que lo producen, incluyendo los atributos de cada fabricante.
{
"id": 1,
"nombre": "Laptop X200",
"descripcion": "Una laptop de alto rendimiento",
"precio": 1200.99,
"pathImg": "/images/productos/laptop-x200.jpg",
"fabricantes": [
{
"id": 1,
"nombre": "TechCorp",
"direccion": "1234 Elm St, Ciudad",
"contacto": "+123456789",
"pathImgPerfil": "/images/fabricantes/techcorp.jpg"
},
{
"id": 2,
"nombre": "Innovatech",
"direccion": "4567 Oak Ave, Ciudad",
"contacto": "+987654321",
"pathImgPerfil": "/images/fabricantes/innovatech.jpg"
}
]
}
- El equipo debera entegar un repositorio de github con todas las instrucciones necesarias para correr la api.
- Deberán detallar los commandos necesarios para la instalación y ejecución de la api.
- Dentro del Readme.md deberá tener una imagen del diagrama entidad-relacion
- El puerto de listener deberá ser configurable por variable de entorno
- La entega debe soportar cambiar la configuración del motor de base de datos de forma simple en funcion de probar con distintos motores.