Versión: 23 de Enero de 2024
- Aprender a desarrollar operaciones CRUD (Create, Read, Update and Delete) a través de un ORM.
- Aprender a desarrollar operaciones de consulta (queries) a través de un ORM..
- Afianzar las ventajas de usar ORMs en el desarrollo de aplicaciones.
Para realizar la práctica el alumno deberá tener instalado en su ordenador:
- Herramienta GIT para gestión de repositorios Github
- Entorno de ejecución de javascript NodeJS versión 20.
La práctica simula una aplicación de gestión de pacientes utilizando el ORM Sequelize para poder gestionar los datos de la aplicación en una base de datos SQLite.
El siguiente modelo relacional sirve de guía para identificar los modelos y relaciones definidas:
En esta práctica se va a desarrollar un programa de ejemplo src/app.js que se ejecuta con el comando
node src/app.js
El fichero src/app.js contiene el programa principal y se usa solamente para probar las funciones que el alumno tiene que desarrollar en los ficheros controladores del directorio src/controllers.
El programa usa tres modelos: Doctor, Hospital y Patient. El alumno debe definir estos modelos y las relaciones entre ellos, completando los ficheros que se proporcionan en la carpeta src/models. Entre los doctores y pacientes hay que definir una relación M-a-N. Entre los hospitales y pacientes hay que definir una relación 1-a-N.
Los controladores que ejecutan las acciones sobre los modelos se implementan en los ficheros src/controllers/patient.js, src/controllers/hospital.js y src/controllers/doctor.js. El alumno debe codificar las funciones propuestas para estos controladores para que las acciones que se realizan en src/app.js funcionen correctamente. Para ello, desarrollará las operaciones correspondientes con Sequelize implementando las operaciones CRUD sobre los objetos patiente, hospital y doctor, así como otra serie de queries.
Instrucciones aquí.
El alumno deberá completar los siguientes ficheros:
-
src/models/patient.js, src/models/doctor.js, src/models/hospital.js. El alumno debe completar estos ficheros con la definición los modelos de acuerdo al esquema relacional aportado.
-
src/models/index.js. El alumno debe completar este fichero para inicializar un objeto sequelize con la BBDD a usar, importar las definiones de los modelos, y definir las relaciones siguientes:
- Relación 1-a-N entre Hospital y Paciente.
- Relación N-a-M entre Paciente y Doctor.
-
src/controllers/patient.js, src/controllers/hospital.js y src/controllers/doctor.js. Contienen las funciones que deberá completar el alumno. Se debe usar el ORM Sequelize para realizar todas las operaciones relacionadas con la base de datos y devolver un resultado de la operación.
NOTA: recuerde que las peticiones a las bases de datos son asíncronas, por lo que
los métodos que ejecutan deben ser asíncronos (como puede observar en la cabecera
de los mismos), y por tanto, las operaciones con Sequelize deben ir precedidas
del término await. Por ejemplo,
const pacientes = await Pacient.findAll()
guardaría en la variable
pacientes
el resultado de ejecutar la operación findAll()
del modelo Pacient definido con Sequelize.
Las funciones que debe completar el alumno en el controlador src/controllers/patient.js son las siguientes:
Descripción:
- Busca los datos de un paciente.
Parámetros:
- patientId - id del paciente a buscar.
Returns:
- Un objeto paciente.
Descripción:
- Crea un paciente dentro de un hospital. Parámetros:
- hospitalId - id del hospital que se asociara con el paciente creado.
- name - Nombre del paciente.
- surname - Apellido del paciente.
- dni - DNI del paciente.
Returns:
- El objeto paciente creado.
Descripción:
- Actualiza los datos del paciente identificado por patientId.
Parámetros:
- patientId - id del paciente.
- name - Nuevo nombre del paciente.
- surname - Nuevo apellido del paciente.
- dni - Nuevo DNI del paciente.
Returns:
- El objeto paciente actualizado.
Descripción:
- Borra un paciente de la base de datos.
Parámetros:
- patientId - Id del paciente.
Returns:
- El resultado de la operación de borrado.
Descripción:
- Busca todos los pacientes de un hospital, los ordena por su nombre
Parámetros:
- hospitalId - clave primaria (id) del hospital.
Returns:
- Un array de pacientes, ordenados por nombre.
Las funciones que debe completar el alumno en el controlador src/controllers/hospital.js son las siguientes:
Descripción:
- Crea un nuevo hospital.
Parámetros:
- name - nombre del hospital.
- city - ciudad donde está el hospital.
Returns:
- El objeto hospital creado,
Descripción:
- Busca todos los hospitales almacenados en al BBDD.
Returns:
- Un array de hospitales.
Descripción:
- Busca todos los hospitales situados en la ciudad indicada.
Parámetros:
- city - ciudad donde buscar los hospitales.
Returns:
- Un array de hospitales.
Las funciones que debe completar el alumno en el controlador src/controllers/doctor.js son las siguientes:
Descripción:
- Crea un doctor.
Parámetros:
- name - Nombre del doctor.
- surname - Apellido del doctor.
- speciality - especialidad del doctor.
Returns:
- El objeto doctor creado.
Descripción:
- Añade una relacion ente un doctor y un paciente, es decir, se registra a un doctor como doctor de un paciente.
Parámetros:
- patientId - clave primaria (id) del paciente.
- doctorId - clave primaria (id) del doctor.
Returns:
- El objeto paciente.
Descripción:
- Busca todos los doctores de un paciente.
Parámetros:
- patientId - clave primaria (id) del paciente.
Returns:
- Un array de doctoresd.
En muy recomendable usar un cliente SQLite para verificar que la estructura de las tablas creadas y que los datos guardados en ellas con correctos.
Puede usar el cliente que prefiera: sqlite3, Liya, SQLiteStudio, ...
Veamos cómo se puede hacer usando el cliente sqlite3.
Abrir un terminal e iniciar el cliente de sqlite3 ejecutando:
sqlite3
Aparecerá un prompt para indicar que ya pueden introducirse órdenes.
Para conectarse desde a la base de datos se debe usar el comando .open indicando la ruta en donde se encuentra el fichero p5.slite (normalmente se encuentra en la carpeta raíz del proyecto). Por ejemplo:
.open /la_ruta_hasta_el_directorio_de_trabajo/P5_ORM/p5.sqlite3
Tambíén se puede lanzar el programa sqlite3 pasando como argumento el path al fichero de la base de datos.
El comando para listar las tablas que se han creado es:
.tables
Para mostrar la estructura de las tablas, ejecute el comando:
.schema
Para mostrar los registros guardados de las tablas, ejecute los comandos:
select * from Hospitals;
select * from Doctors;
select * from Patients;
El alumno debe verificar que se han creado las tablas con la estructura solicitada y adjuntar una captura de pantalla con el resultado.
Instrucciones aquí.
Instrucciones aquí.
Capturas a entregar con esta práctica:
- Captura 1: Captura del terminal ejecutando
node app.js
:
- Captura 2: Captura de varios clientes SQLite mostrando información de la BBDD:
Instrucciones aquí.
El autocorector probará todas las funciones desarrolladas por el alumno, y asignará una nota parcial a cada una de ellas.
La nota de la entrega será la suma de todas las notas parciales.