Es un conjunto de APIs que permite gestionar una flota de pasajeros y conductores, creando y manejando viajes. Ahora mismo las APIs permiten:
- Obtener una lista de todos los conductores
- Obtener una lista de todos los conductores disponibles
- Obtener una lista de todos los conductores disponibles en un radio de 3km para una ubicación específica
- Obtener un conductor específico mediante su ID
- Obtener todos los pasajeros
- Obtener un pasajero específico por su ID
- Obtener una lista de los 3 conductores más cercanos al punto de partida
- Crear un Viaje asignando a un conductor
- Aceptar, Completar, Cancelar y finalizar un viaje
- Obtener una lista de los viajes activos
Las APIs utilizan 5 modelos:
- Persona
- Pasajero
- Ubicación (o Punto geográfico)
- Conductor
- Viaje
Todas las tablas se dividen en: Modelo, controlador y Router para una mejor lectura.
POST /api/pasajeros, crea un pasajero. Recibe como cuerpo: nombre, email y telefono.GET /api/pasajeros, devuelve un json con todos los pasajeros.GET /api/pasajeros/:id, recibe el id como parámetro. Devuelve un JSON.
POST /api/conductores, crea un conductor. Recibe como cuerpo: nombre, email, telefono, latitud y longitud.GET /api/conductores, devuelve todos los conductores.GET /api/conductores/disponibles, devuelve todos los conductores disponibles.GET /api/conductores/disponibles/cercanos, devuelve todos los conductores cercanos. Recibe como query: latitud y longitud.GET /api/conductores/:id, devuelve un conductor. Recibe el id como parámetro.PUT /api/conductores/:id/ubicacion, actualiza la ubicación de un conductor.
POST /api/viajes/nuevo, crea un viaje. Recibe como cuerpo: idPasajero, latitudLlegada, longitudLlegada, latitudSalida, longitudSalida.POST /api/viajes/aceptar, coloca el estado del viaje como Aceptado. Recibe como cuerpo: id.POST /api/viajes/finalizar, coloca el estado del viaje como Finalizado. Recibe como cuerpo: id.POST /api/viajes/cancelar, coloca el estado del viaje como Cancelado. Recibe como cuerpo: id.GET /api/viajes/activos, devuelve los viajes Pendientes y Aceptados.GET /api/viajes/:id, devuelve un viaje según su ID. Recibe el id como parámetro.
Para encontrar los conductores cercanos a un punto en específico se utiliza la fórmula del Semiverseno (Haversine) que se encuentra como utilidad en src/utils/. Nota: En los seeds, todos los puntos se encuentran alrededor de un punto central (el Parque Iberoamérica), específicamente:
latitud: 18.4664349279385longitud: -69.91984024623967
Para poder utilizar este proyecto, se debe tener instalado Docker (o Docker Desktop). Además, es necesario crear un archivo .env en la raíz del proyecto con las siguientes variables:
DB_PORT
DB_USER
DB_PASSWORD
PORTPor ejemplo:
DB_PORT=20
DB_USER='userTesting'
DB_PASSWORD='change-this'
PORT=3000Para poner en marcha el proyecto, se debe utilizar Docker Compose para subir los contenedores. Se puede utilizar:
docker compose up --build -dUna vez que los contenedores están en funcionamiento, es necesario ejecutar las migraciones con:
docker exec taxi24-server-1 npm run migrateDespués, se pueden ejecutar las seeds (ojo: algunas pruebas pueden dar un error debido a limitaciones técnicas) utilizando:
docker exec taxi24-server-1 npm run seedFinalmente, para probar los endpoints de la aplicación, es necesario abrir un navegador o una aplicación para peticiones HTTP y acceder a localhost:PORT.
Para detener los contenedores, se puede utilizar:
docker compose down --remove-orphans- Sencilla instalación.
- Arquitectura robusta y escalable.
- Uso de middlewares como manejadores de errores y excepciones.
- Modularidad.
- Cursor de base de datos pseudo-nativo (Usando
pga través deknex.js). - Dependencias minimalistas (pocas dependencias).
- Falta de verificación y seguridad en algunos procedimientos.
- Falta de pruebas.
- Falta de aislamiento entre ambientes testing y producción para el contenedor de la base de datos.
- Falta de aislamiento entre ambientes testing y producción para las pruebas existentes.