Se realiza el desarrollo de una API RESTful para una plataforma de gestión de eventos. Esta plataforma permitirá a los usuarios crear, promocionar y gestionar eventos de manera efectiva. Los usuarios podrán registrarse para asistir a eventos al igual que ver detalles sobre los eventos como información detallada o lugares cercanos.
- Gestión de usuarios:
- Permite registrar nuevos usuarios.
- Permite la autenticación de usuarios para poder gestionar eventos.
- Permite ver el perfil del usuario con los eventos creados y en los que va a participar [Auth].
- Gestión de eventos:
- Permite ver todos los eventos.
- Permite consultar los eventos por su id [Auth].
- Permite consultar los asistentes a un evento por su id [Auth].
- Permite crear/modificar/eliminar eventos [Auth].
- Permite registrar asistentes a un evento [Auth].
- Carga masiva de datos:
- Con el uso de una plantilla en Excel, se pueden cargar los usuarios y eventos de manera masiva [Auth].
- Consulta de ubicaciones cercanas:
- Permite la consulta de las ubicaciones cercanas al evento, con su georeferenciación [Auth].
- Consulta de asistencia:
- Permite ver el consolidado de asistencia semanal dia por dia [Auth].
- Tener conexión a internet .
- Tener instalado docker.
- Se requieren los puertos 3000 y 5432 libres para el correcto funcionamiento de la app y posgreSQL.
- Para despliegue local requiere:
- Node v20.11.1
- PostgreSQL v15
- En la raiz del proyecto se debe crear un archivo .env que contiene las siguientes variables:
DB_USER=usuario
DB_HOST=base_datos
DB_NAME=nombre_base_datos
DB_PASSWORD=contraseña
DB_PORT=puerto
DATABASE_URL=postgresql://${DB_USER}:${DB_PASSWORD}@db:${DB_PORT}/${DB_NAME}
JWT_SECRET=s3cr3t
MAPBOX_ACCESS_TOKEN=token_mapbox
- Inicie docker.
- Descargue una copia del repositorio y descomprimala en algun directorio.
- Abra una terminal en el directorio del proyecto y ejecute:
$ chmod +x run_docker.sh
$ ./run_docker.sh
- Espere un momento a que los contenedores se levanten y se ejecute la inicialización de la base de datos.
- Inicie docker.
- Descargue una copia del repositorio y descomprimala en algun directorio.
- Abra una terminal en el directorio del proyecto y ejecute:
$ run_docker.bat
- Espere un momento a que los contenedores se levanten y se ejecute la inicialización de la base de datos.
En su navegador de preferencia ingrese al Swagger de la app con la siguiente URL:
http://localhost:3000/api-docs/
Esta API permite crear, promocionar y gestionar eventos. Proporciona endpoints para la autenticación de usuarios, registro de nuevos usuarios, gestión de perfiles de usuario, así como para la creación, actualización y eliminación de eventos. También incluye funcionalidades avanzadas como la carga masiva de datos desde archivos Excel y consultas sobre lugares cercanos a los eventos.
Para más información, contacta a Fabian Callejas en [email protected].
Algunos edpoints estan protegidos con autenticación. Utilizamos el esquema de autenticación Bearer con JWT. Incluya el token JWT en la cabecera Authorization
de sus solicitudes.
Bearer <token>
La aplicación se compone de 13 endpoints disponibles y agrupados. A continuación la descripción de cada uno:
- Método:
POST
- Endpoint:
/users/login
- Descripción: Este endpoint autentica a un usuario mediante su nombre de usuario y contraseña.
- Autenticación Requerida: No
- Request Body:
{
"username": "nombre_usuario",
"email": "[email protected]",
}
- Respuestas:
200 OK
: Usuario autenticado exitosamente. 🔑 Devuelve un token JWT.401 Unauthorized
: Fallo de autenticación.
- Método:
POST
- Endpoint:
/users/register
- Descripción: Este endpoint registra un nuevo usuario.
- Autenticación Requerida: No
- Request Body:
{
"username": "nombre_usuario",
"email": "[email protected]",
"password": "contraseña"
}
- Respuestas:
201 Created
: Usuario registrado exitosamente.400 Bad Request
: Datos de entrada inválidos o usuario ya existe.
- Método:
GET
- Endpoint:
/users/profile
- Descripción: Este endpoint devuelve los detalles del perfil del usuario autenticado.
- Autenticación Requerida: Sí, mediante JWT
- Respuestas:
200 OK
: Perfil de usuario recuperado exitosamente.401 Unauthorized
: No autorizado.
- Método:
GET
- Endpoint:
/events/{eventId}
- Descripción: Recupera un evento específico por su ID.
- Autenticación Requerida: Sí, mediante JWT
- Parámetros de URL:
eventId
: ID único del evento a recuperar.
- Respuestas:
200 OK
: Objeto del evento.404 Not Found
: Evento no encontrado.500 Internal Server Error
: Error del servidor.
- Método:
GET
- Endpoint:
/events/{eventId}/attendees
- Descripción: Recupera una lista de los asistentes al evento especificado por su ID.
- Autenticación Requerida: Sí, mediante JWT
- Parámetros de URL:
eventId
: ID del evento del cual se desean obtener los asistentes.
- Respuestas:
200 OK
: Lista de asistentes al evento.404 Not Found
: Evento no encontrado o sin asistentes.
- Método:
GET
- Endpoint:
/events
- Descripción: Recupera una lista de eventos.
- Respuestas:
200 OK
: Lista de eventos.
- Método:
PUT
- Endpoint:
/events/{eventId}
- Descripción: Actualiza un evento existente.
- Autenticación Requerida: Sí, mediante JWT
- Request Body:
{
"event_id": 0,
"title": "nombre_evento",
"description": "descripcion_evento",
"start_time": "2024-04-22T01:41:45.735Z",
"end_time": "2024-04-22T01:41:45.735Z",
"location": "string",
"latitude": 0,
"longitude": 0,
"organizer_id": 0
}
- Parámetros de URL:
eventId
: ID numérico del evento a actualizar.
- Respuestas:
200 OK
: Evento actualizado exitosamente.404 Not Found
: Evento no encontrado.
- Método:
DELETE
- Endpoint:
/events/{eventId}
- Descripción: Elimina un evento por su ID.
- Autenticación Requerida: Sí, mediante JWT
- Parámetros de URL:
eventId
: ID numérico del evento a eliminar.
- Respuestas:
200 OK
: Evento eliminado exitosamente.404 Not Found
: Evento no encontrado.
- Método:
POST
- Endpoint:
/events/{eventId}/attendees
- Descripción: Registra un usuario como asistente al evento especificado por su ID, esta diseñado para registrar uno a la vez.
- Autenticación Requerida: Sí, mediante JWT
- Parámetros de URL:
eventId
: ID del evento al cual se desea agregar el asistente.
- Parámetros de Cuerpo:
userId
: ID del usuario que se está registrando como asistente.
- Respuestas:
201 Created
: Asistente registrado exitosamente.400 Bad Request
: Solicitud incorrecta, posiblemente debido a un ID de usuario faltante o ID de evento inválido.404 Not Found
: Evento no encontrado.
- Método:
POST
- Endpoint:
/events
- Descripción: Crea un nuevo evento con los datos proporcionados en el cuerpo de la solicitud.
- Autenticación Requerida: Sí, mediante JWT
- Request Body:
{
"title": "nombre_evento",
"description": "descripcion_evento",
"start_time": "2024-04-22T01:44:08.457Z",
"end_time": "2024-04-22T01:44:08.457Z",
"location": "nombre_o_direccion_evento,_ciudad,_pais",
"organizer_id": 0
}
- Consideraciones:
- La dirección del evento debe especificar bien la ciudad y el pais separados por comas para una mejor georeferenciación. Por ejemplo: Jardín Botanico, Medellin, Colombia.
- Respuestas:
201 Created
: Evento creado exitosamente.400 Bad Request
: Cuerpo de solicitud inválido o parámetros.500 Internal Server Error
: Error al crear el evento.
- Método:
POST
- Endpoint:
/bulk-upload/upload
- Descripción: Permite a los usuarios cargar archivos Excel con información de eventos para procesar y almacenar en la base de datos.
- Autenticación Requerida: Sí, mediante JWT
- Plantilla: La plantilla para la carga masiva se encuentra en
/static/templates/template.xlsx
- Respuestas:
200 OK
: Datos cargados exitosamente.401 Unauthorized
: Token JWT inválido o faltante.500 Internal Server Error
: Error interno del servidor.
- Método:
GET
- Endpoint:
/events/{eventId}/nearby_places
- Descripción: Recupera una lista de lugares cerca de la ubicación del evento.
- Autenticación Requerida: Sí, mediante JWT
- Parámetros de URL:
eventId
: ID del evento.
- Respuestas:
200 OK
: Lista de lugares cercanos.404 Not Found
: Evento no encontrado.
- Método:
GET
- Endpoint:
/events/attendees_by_weekday
- Descripción: Devuelve un objeto JSON con el recuento de asistentes por día de la semana.
- Autenticación Requerida: Sí, mediante JWT
- Respuestas:
200 OK
: Objeto JSON con los recuentos de asistentes por día de la semana.400 Bad Request
: Solicitud incorrecta.500 Internal Server Error
: Error interno del servidor.
Para obtener información detallada sobre los esquemas de datos utilizados, consulta el archivo /src/config/swagger.yaml.
Se utiliza el motor de base de datos PosgreSQL.
- Nombre: users
- Descripción: Esta tabla se utiliza para gestionar el registro de usuarios y la autenticación.
Campo | Tipo | Restricciones |
---|---|---|
user_id | SERIAL | PRIMARY KEY |
username | VARCHAR(50) | UNIQUE, NOT NULL |
VARCHAR(100) | UNIQUE, NOT NULL | |
password_hash | VARCHAR(255) | NOT NULL |
created_at | TIMESTAMP WITH TIMEZONE | DEFAULT CURRENT_TIMESTAMP |
- Nombre: events
- Descripción: Esta tabla almacena detalles de eventos organizados.
Campo | Tipo | Restricciones |
---|---|---|
event_id | SERIAL | PRIMARY KEY |
organizer_id | INT | NOT NULL |
title | VARCHAR(255) | NOT NULL |
description | TEXT | |
start_time | TIMESTAMP WITH TIMEZONE | NOT NULL |
end_time | TIMESTAMP WITH TIMEZONE | NOT NULL |
latitude | DECIMAL(9,6) | |
longitude | DECIMAL(9,6) | |
location | VARCHAR(255) | |
created_at | TIMESTAMP WITH TIMEZONE | DEFAULT CURRENT_TIMESTAMP |
updated_at | TIMESTAMP WITH TIMEZONE | DEFAULT CURRENT_TIMESTAMP |
FOREIGN KEY (organizer_id) REFERENCES users (user_id) |
- Nombre: attendees
- Descripción: Esta tabla registra usuarios en eventos.
Campo | Tipo | Restricciones |
---|---|---|
attendee_id | SERIAL | PRIMARY KEY |
event_id | INT | NOT NULL |
user_id | INT | NOT NULL |
registered_at | TIMESTAMP WITH TIMEZONE | DEFAULT CURRENT_TIMESTAMP |
FOREIGN KEY (event_id) REFERENCES events (event_id) | ||
FOREIGN KEY (user_id) REFERENCES users (user_id) |
- Nombre: nearby_places
- Descripción: Esta tabla almacena lugares cercanos a eventos (opcional).
Campo | Tipo | Restricciones |
---|---|---|
place_id | SERIAL | PRIMARY KEY |
event_id | INT | NOT NULL |
name | VARCHAR(255) | NOT NULL |
address | TEXT | |
latitude | DECIMAL(9,6) | |
longitude | DECIMAL(9,6) | |
FOREIGN KEY (event_id) REFERENCES events (event_id) |
- Acá DevOps se tiene una documentación detallada sobre los Triggers, Despliegues y Rollback en el contexto de la implementación de CI/CD con Jenkins y Docker para este reto técnico.
- Acá Arquitectura se tiene una documentación de como realizar una arquitectura híbrida para una API resiliente, idempotente y escalable, combinando on-premise y cloud, para el manejo de este reto técnico.
- 🧑💻 Desarrollado por Fabián A. Callejas Varela
- 😎 Contacto: LinkedIn