Skip to content

API REST desarrollada en Node.js y Express que simula el check-in de pasajeros de una aerolínea usando una base de datos MySQL

Notifications You must be signed in to change notification settings

sebareibold/api-postulacion-bsale

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

18 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

🛫 API Rest - Simulación de check-in

Node.js Express.js MySQL JavaScript Nodemon

Este proyecto implementa un sistema de asignación automática de asientos en vuelos. Surge como solución a un problema planteado en una postulación de la empresa Bsale. El desafío consiste en asignar asientos a los pasajeros de un vuelo en un avión determinado, considerando que algunos lugares pueden encontrarse ya ocupados.

Las reglas de asignación son las siguientes:

  1. Los asientos ya ocupados deben respetarse y no pueden ser reasignados.
  2. Los pasajeros que viajan con menores de edad deben ser ubicados en asientos adyacentes dentro de la misma fila.
  3. Cuando no hay menores en la reserva, los pasajeros pueden ser distribuidos en asientos libres de forma individual.
  4. La asignación prioriza mantener a los grupos (por compra) lo más juntos posible
  5. En caso de no poder cumplir con la adyacencia por falta de asientos disponibles, se asignan los mejores lugares posibles entre los restantes.
  6. Los pasajeros que ya poseen un asiento asignado (por ejemplo, desde el boarding pass) se consideran como asignados previamente y no se modifican.

¿Cómo se presenta mi solución al problema?

La solución propuesta sigue un flujo progresivo que permite asignar asientos de manera ordenada, cumpliendo con todas las reglas planteadas en el enunciado.

Flujo de la solución

El proceso de asignación de asientos se desarrolla en varias etapas encadenadas.
Cada paso toma el resultado del anterior y lo enriquece hasta llegar al listado final de pasajeros con asiento asignado.

1. Obtener datos del vuelo

Se recibe un flightId y se buscan todos los detalles del vuelo:

  • Horario de salida y llegada
  • Aeropuerto de origen y destino
  • Avión que cubrirá el trayecto

Esta información inicial es necesaria para luego obtener tanto los pasajeros del vuelo como los asientos del avión asociado.

Método:

FlightManager.getPassengersByFlightId(flightId)

2. Recuperar asientos y estado actual

Con el flightId se listan todos los asientos del avión.
Estos se dividen en:

  • Ocupados → ya tienen un boardingPass vinculado a un pasajero.
  • Libres → no están asociados a ningún pasajero todavía.

Esto permite trabajar solo con los libres y respetar los ya asignados.

Método:

SeatManager.getSeatsByFlightIdWithBoardingPasses(flightId)

3. Clasificar asientos por categoría

Los asientos libres se organizan según la categoría:

  • Primera clase
  • Económica Premium
  • Económica

Esta separación es clave, porque cada pasajero tiene asociada una categoría en su pasaje, y no puede ser reasignado a otra distinta.

Método:

SeatManager.PlanningSeatForCategory(name, seats, flightId)

4. Buscar pasajeros pendientes de asiento

Se consultan los pasajeros que:

  • Ya tienen un boardingPass
  • Pero todavía no cuentan con asiento asignado. Estos son los pasajeros que efectivamente deben ser procesados.
    La búsqueda se hace por categoría, para que coincidan con los asientos disponibles.

Método:

SeatManager.getPassengersPendingSeatsByFlightId(flightId, category)

5. Agrupar pasajeros por compra (purchaseId)

Los pasajeros pendientes se agrupan en función de su compra original.
Esto asegura que viajen lo más juntos posible, simulando lo que pasa en la vida real (familias, amigos, etc.).

Método:

SeatManager.groupPassengersByPurchase(passengers)

6. Asignación de asientos

Aquí ocurre la lógica principal de la asignación. Cuando el grupo incluye menores de edad, se intenta encontrar un bloque de asientos adyacentes dentro de la misma fila; si logra ubicarlos, asigna al grupo completo de manera conjunta. En caso de no existir suficientes asientos contiguos disponibles, se procede con una estrategia alternativa, ubicando a los pasajeros en los mejores lugares restantes pero procurando que al menos un adulto quede al lado del menor.

7. Unificación de resultados

Finalmente, se combinan:

  • Pasajeros que ya tenían asiento asignado desde el inicio.
  • Pasajeros que recibieron asiento durante el proceso.

El resultado es una distribución final completa de pasajeros y asientos lista para ser devuelta.

Tecnologías utilizadas

  • Node.js (v18+)
  • Express.js (estructura base de API REST)
  • MySQL (base de datos relacional)
  • MySQL2 (conector para Node.js)
  • ES Modules (import/export)
  • Nodemon (opcional, para desarrollo con autoreload)

Estructura del proyecto

├── src
│   ├── config       # Configuraciones de la Base de datos
│   │   └── db.js
│   ├── managers     # Lógica principal de negocio (controladores/servicios)
│   │   ├── FlightsManager.js    # Permite obtener, valida y coordinar deteminada informacion de los vuelos
│   │   └── SeatManager.js       # Responsable de la gestión de los asientos del avión.
│   ├── routes
│   │   └── flights.routes.js  # Endpoints de vuelos
│   ├── app.js       # Configuración principal de la aplicación Express (middlewares, rutas)
│   └── server.js    # Inicialización del servidor y conexión a la base de datos
│
├── .env             # Variables de entorno (no se suben al repositorio, están en .gitignore)
├── .gitignore
├── airline.sql
├── package-lock.json
├── package.json     # Información del proyecto y dependencias
└── README.md        # Documentación principal del proyecto

Instalación y ejecución

  1. Clonar este repositorio:

    git clone https://github.com/sebareibold/api-postulacion-bsale
    cd api-postulacion-bsale
  2. Instalar dependencias:

    npm install
  3. Configurar la base de datos en config/db.js utilizando las credenciales de MySQL indicadas en el enunciado o, en su defecto, reemplazarlas por tus propias credenciales locales.

    import mysql from "mysql2/promise";
    
    const pool = mysql.createPool({
      host: "localhost",
      user: "root",
      password: "password",
      database: "aerolinea",
    });
    
    export default pool;
  4. Correr el servidor en desarrollo

npm run dev

Luego el servidor quedará disponible en:

http://localhost:3000

Sebastián Alejandro Reibold
Analista Programador Universitario | Fullstack Developer

LinkedIn GitHub

About

API REST desarrollada en Node.js y Express que simula el check-in de pasajeros de una aerolínea usando una base de datos MySQL

Topics

Resources

Stars

Watchers

Forks