API de Películas
Aplicación del lado del servidor construida con NestJS y TypeScript para gestionar películas, favoritos de usuario, autenticación y claves API.
🌍 Descripción General
La API de Películas es una aplicación del lado del servidor construida con NestJS y TypeScript. Proporciona endpoints para gestionar películas, favoritos de usuario, autenticación y claves API. La API está diseñada con arquitectura modular, validación robusta y mecanismos de autenticación seguros.
⚡ Funcionalidades
- 🔒 Autenticación: Inicio de sesión seguro, registro y autenticación basada en tokens.
- 🎬 Películas: Obtener películas populares, en tendencia, mejor valoradas y próximas desde TMDB.
- 👾 Favoritos: Gestionar películas favoritas por usuario.
- 🔑 Claves API: Generar, validar y gestionar claves API para integraciones externas.
- 📚 Documentación Swagger: Documentación interactiva de la API.
🛠️ Stack Tecnológico
El proyecto está construido usando las siguientes tecnologías:
- 🚀 TypeScript
- 🦸♂️ NestJS
- 🗄️ MongoDB
- 🐳 Docker
- 📚 Swagger
📚 Documentación de la API
🔐 Endpoints de Autenticación
📍 POST /auth/login
Autentica un usuario y retorna tokens de acceso y refresco.
📥 Cuerpo de la Solicitud
{
"email": "user@mail.com",
"password": "secure@pass123"
}
📤 Respuesta
{
"user": {
"id": "123",
"email": "user@mail.com",
"name": "User"
},
"accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}
📍 POST /auth/register
Registrar un nuevo usuario.
📥 Cuerpo de la Solicitud
{
"name": "User",
"email": "user@mail.com",
"password": "secure@pass123"
}
📤 Respuesta
{
"user": {
"id": "123",
"email": "user@mail.com",
"name": "User"
},
"accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}
📍 POST /auth/refresh
Refresca el token de acceso usando un token de refresco.
📥 Cuerpo de la Solicitud
{
"refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}
📤 Respuesta
{
"accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}
🎬 Endpoints de Películas
📍 GET /movies/popular
Obtener películas populares desde TMDB.
- Parámetros de consulta: page (opcional): Número de página para paginación.
📤 Respuesta
{
"page": 1,
"results": [
{
"id": 550,
"title": "Fight Club",
"overview": "A ticking-time-bomb insomniac...",
"poster_path": "/poster.jpg",
"release_date": "1999-10-15",
"vote_average": 8.4
}
],
"total_results": 1000,
"total_pages": 50
}
📍 GET /movies/trending
Obtener películas en tendencia.
- Parámetros de consulta: timeWindow (opcional): day o week.
📤 Respuesta
{
"page": 1,
"results": [
{
"id": 550,
"title": "Fight Club",
"overview": "A ticking-time-bomb insomniac...",
"poster_path": "/poster.jpg",
"release_date": "1999-10-15",
"vote_average": 8.4
}
],
"total_results": 1000,
"total_pages": 50
}
📍 GET /movies/:id
Obtener información detallada de una película.
- Parámetros de ruta: id: ID de la película en TMDB.
📤 Respuesta
{
"id": 550,
"title": "Fight Club",
"overview": "A ticking-time-bomb insomniac...",
"poster_path": "/poster.jpg",
"release_date": "1999-10-15",
"vote_average": 8.4,
"genres": [{"id": 18, "name": "Drama"}]
}
👾 Endpoints de Favoritos
📍 POST /favorites
Agregar una película a favoritos.
📥 Cuerpo de la Solicitud
{
"movieId": "550"
}
📤 Respuesta
{
"id": "123",
"movieId": "550",
"title": "Fight Club",
"overview": "A ticking-time-bomb insomniac...",
"releaseDate": "1999-10-15",
"tmdbRating": 8.4
}
📍 GET /favorites
Obtener todos los favoritos del usuario autenticado.
- Parámetros de consulta: page (opcional): Número de página para paginación. limit (opcional): Número de elementos por página.
📤 Respuesta
{
"results": [
{
"id": "123",
"movieId": "550",
"title": "Fight Club",
"overview": "A ticking-time-bomb insomniac...",
"releaseDate": "1999-10-15",
"tmdbRating": 8.4
}
],
"total": 10,
"page": 1,
"limit": 10
}
🔑 Endpoints de Claves API
📍 POST /api-keys
Generar una nueva clave API.
📥 Cuerpo de la Solicitud
{
"description": "Mobile application integration",
"expiresInDays": 30
}
📤 Respuesta
{
"id": "123",
"key": "abcd1234-5678-efgh-ijkl-9876543210mn",
"description": "Mobile application integration",
"expiresAt": "2025-12-31T23:59:59Z",
"createdAt": "2025-07-01T12:00:00Z"
}
📍 GET /api-keys
Obtener todas las claves API (solo admin).
📤 Respuesta
[
{
"id": "123",
"description": "Mobile application integration",
"expiresAt": "2025-12-31T23:59:59Z",
"createdAt": "2025-07-01T12:00:00Z",
"isActive": true,
"usageCount": 10
}
]