Skip to content

RamonFolguera/Backend-for-a-Dental-Clinic-Node-Express-Sequelize-mySQL

Repository files navigation

Proyecto 4 - Backend para una clínica dental

Prueba sync

Contenido 📝
  1. Objetivo
  2. Sobre el proyecto
  3. Stack
  4. Diagrama
  5. Instalación
  6. Work-flow
  7. Endpoints
  8. Futuras funcionalidades
  9. Contribuciones
  10. Licencia
  11. Webgrafia
  12. Desarrollo
  13. Contacto

Objetivo

Este proyecto requería una API funcional conectada a una base de datos con al menos una relación de uno a muchos y una relación de muchos a muchos.

Sobre el proyecto

Para este proyecto en el bootcamp de GeeksHubs se nos entrega el siguiente enunciado: "Desde el departamento de producto nos piden crear el backend correspondiente al sistema de gestión de citas para una Clínica Dental.

Para ello el cliente deberá ser capaz de registrarse en la aplicación, hacer login y acceder a su área de cliente. En su área de cliente deberá poder ver una lista de las citas que tiene a futuro, crear citas, modificarlas y anularlas. También existirá una zona de usuario con sus datos personales, que solo podrá ver él mismo. Además, los dentistas deberán poder registrarse como profesionales, hacer login y ver todas las citas y clientes registrados."

Se valorará la ejecución técnica, así como el trabajo en equipo. Siendo un equipo de dos miembros ha sido importante la comunicación, el apoyo mutuo, la toma de decisiones consensuadas y por supuesto, el manejo de Git y el repositorio de Github: creación de ramas de trabajo, resolución de conflictos, trabajo individual en local ...

Stack

Tecnologías utilizadas:

Diagrama BD

'imagen-db'

Instalación en local

  1. Clonar el repositorio
  2. $ npm install
  3. Conectamos nuestro repositorio con la base de datos
  4. $ Ejecutamos las migraciones
  5. $ Ejecutamos los seeders
  6. $ npm run dev
  7. ...

Workflow

Workflow
  1. Crear package.json con npm init -y.
  2. Crear archivo index.js en la ruta principal. Crear .env y .env.example. Crear .gitignore con /node_modules y .env dentro. Ejecutar comando git init.
  3. Instalar express, nodemon, sequelize, sequelize-cli, mysql2, dotenv, jsonwebtoken y bcrypt.
  4. Sequelize init. Ejecutar sequelize.
  5. Crear script "dev": "nodemon index.js", para mantener el servidor ejecutándose.
  6. $ npm run dev comando para ejecutar el servidor. ctrl + c para pararlo.
  7. Required express en index.js, y la variable instance app. También asignar PORT a nuestro servidor y usar un método listen para ejecutarlo:
const express = require('express');
const app = express();
const PORT = 3000;
app.listen(PORT, () => console.log("Server running on port: " + PORT));
  1. Crear models Role, Doctor, User, Service and Appointment en ese orden:
npx sequelize-cli model:generate --name Users --attributes name:string,...
  1. Añadir las foreign keys de services, doctors y users en appointments migration js file con sus respectivas relaciones. Hacer lo mismo con las que correspondan en todos los modelos.
references: {
          model: "Services",
          key:"id"
        }
  1. Crear carpetas controllers y view. En carpeta view crear las Routes.

  2. Crear router.js en la ruta principal:

const router = require('express').Router();
module.exports = router;
  1. Route.js conectado al index principal:
const router = require('./router'); 
app.use(router);
  1. Refactorizar a route:
const router = require('express').Router();

router.use('/services', servicesRouter);
router.use('/users', usersRouter)

module.exports = router;
  1. Refactorizar controllers:
const serviceController = {};

serviceController.getServices = (req, res) => {return res.send('Get Services')}
serviceController.createServices = (req, res) => {return res.send('Create Services')}

module.exports = serviceController;
  1. Crear seeders para Role, User, Doctor, Service, Appointment y commit a la database
npx sequelize-cli seed:generate --name demo-user
npx sequelize-cli db:seed:all
  1. Crear middlewares para controlar el nivel de acceso a la información o a las funcionalidades de la base de datos según roles.
  2. Crear endpoints, los cuales describimos a continuación:

Endpoints

Endpoints
  • AUTH
    • REGISTRO DE USUARIOS

        POST http://localhost:3000/auth/register/
      

      body:

          
        {
          "name":"Ramón",
          "first_surname":"Folguera",
          "second_surname":"Carbonell",
          "phone": "666666666",
          "address":"Abbey Road 1",
          "email": "ramon@ramon.com",
          "password": "mipassword123"
        }
    • LOGIN DE USUARIOS

        POST http://localhost:3000/auth/login/  
      

      body:

          {
              "email": "ramon@ramon.com",
              "password": "mipassword123"
          }
  • USER
    • PERFIL DE USUARIO

      Copia el TOKEN generado por el AUTH del LOGIN:

          "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOjMsImVtYWlsIjoiYW1wYXJvQGFtcGFyby5jb20iLCJyb2xlSWQiOjMsImlhdCI6MTY3ODAwNzMzNSwiZXhwIjoxNjc4MDE0NTM1fQ.4K6BNC2bhhrW_vyCQh7hiWI2-i-c4C-KOOgo0nHeQOg"
      

      En AUTHORIZATION. Type BEARER TOKEN. Pega el TOKEN generado.

        GET http://localhost:3000/users/me
      
    • MODIFICACIÓN DE DATOS DE PERFIL

      Copia el TOKEN generado por el AUTH del LOGIN:

          "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOjMsImVtYWlsIjoiYW1wYXJvQGFtcGFyby5jb20iLCJyb2xlSWQiOjMsImlhdCI6MTY3ODAwNzMzNSwiZXhwIjoxNjc4MDE0NTM1fQ.4K6BNC2bhhrW_vyCQh7hiWI2-i-c4C-KOOgo0nHeQOg"
      

      En AUTHORIZATION. Type BEARER TOKEN. Pega el TOKEN generado.

        PUT http://localhost:3000/users/me
      

      body:

          {
              "attribute":"name",
              "value":"Rodrigo",
              "changes":{
                  "name": "Francisco",
                  "first_surname": "Martínez"
                  }
          }
    • VER TODAS LOS CLIENTES REGISTRADOS (COMO DENTISTA)

      LOGIN con USER con role de DOCTOR:

      body:

          {
            "email":"amparo@amparo.com",
            "password": "456789"
          }

      Copia el TOKEN generado por el AUTH del LOGIN:

          "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOjMsImVtYWlsIjoiYW1wYXJvQGFtcGFyby5jb20iLCJyb2xlSWQiOjMsImlhdCI6MTY3ODAwNzMzNSwiZXhwIjoxNjc4MDE0NTM1fQ.4K6BNC2bhhrW_vyCQh7hiWI2-i-c4C-KOOgo0nHeQOg"
      

      En AUTHORIZATION. Type BEARER TOKEN. Pega el TOKEN generado.

      GET http://localhost:3000/users

  • APPOINTMENT
    • CREACIÓN DE CITAS

        POST http://localhost:3000/appointments/
      

      body:

          {
              "date": "2023-03-01 00:00:00",
              "service_id": 1,
              "doctor_id":1
          }

      El cliente crea una cita en estado Pendiente de Verificar por el doctor.

    • MODIFICACIÓN DE CITAS

      Copia el TOKEN generado por el AUTH del LOGIN:

          "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOjMsImVtYWlsIjoiYW1wYXJvQGFtcGFyby5jb20iLCJyb2xlSWQiOjMsImlhdCI6MTY3ODAwNzMzNSwiZXhwIjoxNjc4MDE0NTM1fQ.4K6BNC2bhhrW_vyCQh7hiWI2-i-c4C-KOOgo0nHeQOg"
      

      En AUTHORIZATION. Type BEARER TOKEN. Pega el TOKEN generado.

        PUT http://localhost:3000/appointments
      

      body:

          {
              "id":"7",
              "changes":{
                  "service_id":2
              }
          }
    • ANULACIÓN DE CITAS

      Copia el TOKEN generado por el AUTH del LOGIN:

          "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOjMsImVtYWlsIjoiYW1wYXJvQGFtcGFyby5jb20iLCJyb2xlSWQiOjMsImlhdCI6MTY3ODAwNzMzNSwiZXhwIjoxNjc4MDE0NTM1fQ.4K6BNC2bhhrW_vyCQh7hiWI2-i-c4C-KOOgo0nHeQOg"
      

      En AUTHORIZATION. Type BEARER TOKEN. Pega el TOKEN generado.

        DELETE http://localhost:3000/appointments
      

      body:

          {
              "id":"7"
          }
    • VER TODAS LAS CITAS QUE TENGO COMO CLIENTE (SOLO LAS PROPIAS)

      Copia el TOKEN generado por el AUTH del LOGIN:

          "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOjMsImVtYWlsIjoiYW1wYXJvQGFtcGFyby5jb20iLCJyb2xlSWQiOjMsImlhdCI6MTY3ODAwNzMzNSwiZXhwIjoxNjc4MDE0NTM1fQ.4K6BNC2bhhrW_vyCQh7hiWI2-i-c4C-KOOgo0nHeQOg"
      

      En AUTHORIZATION. Type BEARER TOKEN. Pega el TOKEN generado.

        GET http://localhost:3000/appointments/user
      
    • VER TODAS LAS CITAS EXISTENTES (COMO DENTISTA)

      LOGIN con USER con role de DOCTOR:

      body:

          {
            "email":"amparo@amparo.com",
            "password": "456789"
          }

      Copia el TOKEN generado por el AUTH del LOGIN:

          "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOjMsImVtYWlsIjoiYW1wYXJvQGFtcGFyby5jb20iLCJyb2xlSWQiOjMsImlhdCI6MTY3ODAwNzMzNSwiZXhwIjoxNjc4MDE0NTM1fQ.4K6BNC2bhhrW_vyCQh7hiWI2-i-c4C-KOOgo0nHeQOg"
      

      En AUTHORIZATION. Type BEARER TOKEN. Pega el TOKEN generado.

        GET  http://localhost:3000/appointments/doctor
      
    • COMO MÉDICO, PODER VER SOLO MIS CITAS

      LOGIN con USER con role de DOCTOR:

      body:

          {
            "email":"amparo@amparo.com",
            "password": "456789"
          }

      Copia el TOKEN generado por el AUTH del LOGIN:

          "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOjMsImVtYWlsIjoiYW1wYXJvQGFtcGFyby5jb20iLCJyb2xlSWQiOjMsImlhdCI6MTY3ODAwNzMzNSwiZXhwIjoxNjc4MDE0NTM1fQ.4K6BNC2bhhrW_vyCQh7hiWI2-i-c4C-KOOgo0nHeQOg"
      

      En AUTHORIZATION. Type BEARER TOKEN. Pega el TOKEN generado.

        GET  http://localhost:3000/appointments/doctor/my
      
    • CONSULTAR CITAS DE UN DOCTOR SIN VERIFICAR

      LOGIN con USER con role de DOCTOR:

      body:

          {
            "email":"amparo@amparo.com",
            "password": "456789"
          }

      Copia el TOKEN generado por el AUTH del LOGIN:

          "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOjMsImVtYWlsIjoiYW1wYXJvQGFtcGFyby5jb20iLCJyb2xlSWQiOjMsImlhdCI6MTY3ODAwNzMzNSwiZXhwIjoxNjc4MDE0NTM1fQ.4K6BNC2bhhrW_vyCQh7hiWI2-i-c4C-KOOgo0nHeQOg"
      

      En AUTHORIZATION. Type BEARER TOKEN. Pega el TOKEN generado.

        GET  http://localhost:3000/appointments/doctor/my-verified
      
    • VERIFICAR CITA COMO DOCTOR

      LOGIN con USER con role de DOCTOR:

      body:

          {
            "email":"amparo@amparo.com",
            "password": "456789"
          }

      Copia el TOKEN generado por el AUTH del LOGIN:

          "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOjMsImVtYWlsIjoiYW1wYXJvQGFtcGFyby5jb20iLCJyb2xlSWQiOjMsImlhdCI6MTY3ODAwNzMzNSwiZXhwIjoxNjc4MDE0NTM1fQ.4K6BNC2bhhrW_vyCQh7hiWI2-i-c4C-KOOgo0nHeQOg"
      

      En AUTHORIZATION. Type BEARER TOKEN. Pega el TOKEN generado.

        PUT  http://localhost:3000/appointments/verify
      
      body:
      
          {
            "email":"amparo@amparo.com",
            "password": "456789"
          }

Futuras funcionalidades

[ ] Añadir un rol SuperAdmin que sea el rol del programador con acceso a todo el sistema menos a los datos privados de los pacientes y doctores. [ ] Añadir funcionalidades para crear, modificar y eliminar servicios por los doctores.
[ ] Añadir funcionalidades para crear, modificar o eliminar roles por el SuperAdmin [ ] Especificar que el rol admin será para administración desde recepción con los privilegios necesarios para llevar a cabo su trabajo, como por ejemplo (añadido en el siguiente punto): [ ] Añadir funcionalidad para crear, modificar y eliminar doctores.

Contribuciones

Las sugerencias y aportaciones son siempre bienvenidas.

Puedes hacerlo de dos maneras:

  1. Abriendo una issue
  2. Crea un fork del repositorio
    • Crea una nueva rama
      $ git checkout -b feature/nombreUsuario-mejora
      
    • Haz un commit con tus cambios
      $ git commit -m 'feat: mejora X cosa'
      
    • Haz push a la rama
      $ git push origin feature/nombreUsuario-mejora
      
    • Abre una solicitud de Pull Request

Licencia

Este proyecto se encuentra bajo licencia de MIT License.

Webgrafia:

Para conseguir mi objetivo hemos recopilado información de:

Desarrollo:

 const developers = "Ramón" + "Jose";

Proyecto realizado por:

  • Ramón

  • Jose

##Contacto

  • Ramón

  • Jose

About

Proyecto 4 - Backend de una clínica dental

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published