API REST para gestionar las reservas de vehículos, desarrollada con Flask y MongoDB.
- Permite crear, leer, actualizar y eliminar usuarios, vehículos. -Permite gestionar reservas
- Consultar el historial de reservas de los usuarios.
- Documentación automática con Swagger.
- Pruebas automatizadas con Pytest.
- Contenerización con Docker.
- Flask - Framework principal.
- MongoDB - Base de datos.
- PyMongo - Conector para MongoDB.
- Flasgger - Para generar la documentación de la API con Swagger.
- Pytest - Pruebas unitarias e integración.
- Docker - Contenerización de la aplicación.
git clone https://github.com/Alberto7526/flask_mongo_docker.git
cd flask_mongo_dockerdocker-compose up -dEsto iniciará la API y MongoDB en contenedores.
- Swagger UI: http://localhost:5000/apidocs
| Método | Endpoint | Descripción |
|---|---|---|
| POST | /users/ |
Crear un usuario |
| GET | /users/ |
Obtener todos los usuarios |
| GET | /users/{id} |
Obtener un usuario por ID |
| PUT | /users/{id} |
Actualizar un usuario |
| DELETE | /users/{id} |
Eliminar un usuario |
| Método | Endpoint | Descripción |
|---|---|---|
| POST | /vehicles/ |
Crear un vehículo |
| GET | /vehicles/ |
Obtener todos los vehículos |
| GET | /vehicles/{id} |
Obtener un vehículo por ID |
| PUT | /vehicles/{id} |
Actualizar un vehículo |
| DELETE | /vehicles/{id} |
Eliminar un vehículo |
| Método | Endpoint | Descripción |
|---|---|---|
| POST | /reserve/ |
Crear una reserva |
| GET | /reserve/ |
Obtener todas las reservas |
| PUT | /reserve/{id} |
Cancelar una reserva |
| GET | /reserve/user/{id} |
Obtener todas las reservas de un usuario |
| PUT | /reserve/user/{id} |
Activa el usuario bloqueado |
| GET | /reserve/vehicle/ |
Obtener el vehículo más reservado |
| GET | /reserve/users/{limit} |
Usuarios con más cancelaciones |
Para ejecutar las pruebas dentro del contenedor:
docker-compose exec api bash -c "export PYTHONPATH=/app && pytest --import-mode=importlib"La base de datos está compuesta por las siguientes colecciones: usuarios, vehículos, reservas, y cancelaciones. A continuación se detallan cada uno de ellos
La colección usuarios almacena la información de los usuarios que pueden realizar reservas.
{
"_id": ObjectId("..."),
"nombre": "String", // Nombre del usuario
"email": "String", // Correo electrónico del usuario (único)
"estado": "Boolean", // Estado del usuario (Para penalización)
"reservas": [ObjectId] // Lista de las reservas realizadas por el usuario
}La colección vehículos almacena los datos relacionados con los vehículos disponibles para ser reservados.
{
"_id": ObjectId("..."),
"tipo": "String", // Tipo de vehículo (sedan, SUV, etc.)
"placa": "String", // Placa del vehículo (unico)
"disponibilidad": "Boolean" // Disponibilidad del vehículo para ser reservado
}La colección reservas almacena las reservas realizadas por los usuarios.
{
"_id": ObjectId("..."),
"id_usuario": ObjectId, // ID del usuario que realizó la reserva
"id_vehiculo": ObjectId, // ID del vehículo reservado
"fecha_inicio": "Date", // Fecha y hora de inicio de la reserva
"fecha_fin": "Date", // Fecha y hora de finalización de la reserva
"estado": "String" // Estado de la reserva (confirmada, terminado, cancelado)
}La colección cancelaciones almacena información sobre las reservas canceladas para penalización de usuarios por más de 3 cancelaciones en los ultimos 7 días.
{
"_id": ObjectId("..."),
"fecha": "Date", // Fecha y hora de la cancelación
"id_reserva": ObjectId, // ID de la reserva cancelada
"id_usuario": ObjectId, // ID del usuario de la reserva
}Se creó la colección cancelaciones, la cual es alimentada cada vez que se realiza una cancelación, al mismo tiempo se valida la cantidad de cancelaciones por usuario y se cambia el estado en la colección de usuarios a true por defecto false cuando este tiene más de 3 cancelaciones.
Cuando un usuario va a realizar una reserva se valdia este dato y si es verdadero devolvera un mensaje como este:
{
"error": "User temporarily blocked from making reservations.",
"message": "This user has temporary restrictions on making new reservations. Please try again later."
}Para habilitarlo nuevamente se debe usar el siguiente endpoint
PUT | `/reserve/user/{id}` | Activa el usuario bloqueado