- Sobre el Proyecto
- Características
- Tecnologías
- Instalación y Configuración
- API Endpoints
- Estructura del Proyecto
- Documentación API
- Licencia
- Autor
Fliverse Backend es la API REST desarrollada como Proyecto de Fin de Grado (TFG) que proporciona todos los servicios y funcionalidades necesarias para la plataforma web Fliverse.
Proporcionar una API robusta y escalable que permita:
- Autenticación segura de usuarios con JWT y OAuth2 (Google)
- Gestión completa de contenido audiovisual
- Administración de listas personalizadas y valoraciones
- Sistema de comentarios y interacción social
- Integración con servicios externos (Azure Storage)
-
Sistema de Autenticación
- Registro e inicio de sesión con JWT
- Integración con Google OAuth2
- Middleware de autenticación y autorización
- Sistema de recuperación de contraseñas
-
Gestión de Contenido
- CRUD completo para películas y series
- Sistema de búsqueda avanzada
- Gestión de imágenes con Azure Blob Storage
-
Listas y Valoraciones
- Creación y gestión de listas personalizadas
- Sistema de valoraciones (0-10)
- Seguimiento de contenido visto/por ver
-
Sistema Social
- Comentarios en contenido
- Perfiles de usuario
- Sistema de notificaciones por email
- Seguridad: Rate limiting, validación de datos, encriptación
- Documentación: Swagger/OpenAPI integrado
- Almacenamiento de imágenes: Azure Storage Account
- Node.js - Runtime de JavaScript
- Express.js - Framework web
- PostgreSQL - Base de datos relacional
- Sequelize - ORM para Node.js
- JSON Web Tokens - Autenticación
- BCrypt - Hash de contraseñas
- Google Auth Library - OAuth2 con Google
- Express Rate Limit - Rate limiting
- Azure Blob Storage - Almacenamiento de archivos
- Nodemailer - Envío de emails
- Multer - Manejo de archivos
- Swagger UI Express - Documentación interactiva
- Swagger JSDoc - Generación de documentación
- Nodemon - Desarrollo con hot reload
- Dotenv - Variables de entorno
- Generate Password - Generación de contraseñas aleatorias
Asegúrate de tener instalado:
- Node.js (versión 18 o superior)
- npm (viene con Node.js)
- PostgreSQL (versión 14 o superior)
# Verificar versiones
node --version
npm --version
psql --version-
Clonar el repositorio
git clone https://github.com/BetaGun03/fliverse-backend.git cd fliverse-backend -
Instalar dependencias
npm install
-
Configurar variables de entorno
# Crear archivo .env en la raíz del proyecto touch .envConfigurar las siguientes variables en
.env:# Puerto del servidor PORT=3000 # Base de datos PGUSER=tu_usuario PGPASSWORD=tu_contraseña PGSERVER=direccion_del_servidor # Google OAuth GOOGLE_CLIENT_ID=tu_google_client_id # JWT JWT_SECRET=tu_jwt_secret # Autenticación para Swagger SWAGGER_USER=tu_usuario_swagger SWAGGER_PASSWORD_HASH=tu_contraseña_swagger_hasheada # Email de Zoho ZOHO_USER=tu_email ZOHO_PASSWORD=tu_contraseña_email # Azure Storage Account AZURE_STORAGE_ACCOUNT_NAME=tu_azure_storage_account_name AZURE_STORAGE_ACCOUNT_KEY=tu_azure_storage_account_key AZURE_STORAGE_CONTAINER_NAME=tu_contenedor AZURE_STORAGE_CONNECTION_STRING=tu_connection_string_para_azure # CORS ALLOWED_ORIGIN=http://tu_dominio_frontend ALLOWED_ORIGIN_LOCAL=http://localhost:3000
-
Iniciar el servidor
nodemon ./app.js
-
Verificar instalación
Servidor local (redirecciona hacia la documentación): http://localhost:3000 Documentación de la API: http://localhost:3000/api-docs
| Método | Endpoint | Descripción |
|---|---|---|
POST |
/users/register |
Registro de usuario |
POST |
/users/login |
Inicio de sesión |
POST |
/users/loginGoogle |
Autenticación con Google |
POST |
/users/logout |
Cierre de sesión |
POST |
/users/logoutAll |
Cerrar sesión en todos los dispositivos |
GET |
/users/me |
Obtener perfil del usuario autenticado |
PATCH |
/users/me |
Actualizar perfil del usuario |
DELETE |
/users/me |
Eliminar cuenta del usuario |
GET |
/users/me/profile_pic |
Obtener imagen de perfil |
| Método | Endpoint | Descripción |
|---|---|---|
POST |
/contents |
Crear nuevo contenido |
PATCH |
/contents/:id |
Actualizar contenido específico |
GET |
/contents/searchById |
Buscar contenido por ID |
GET |
/contents/searchByTitle |
Buscar contenido por título |
GET |
/contents/posterById |
Obtener póster por ID |
GET |
/contents/posterByTitle |
Obtener póster por título |
GET |
/contents/random |
Obtener contenido aleatorio |
GET |
/contents/latest |
Obtener contenido más reciente |
GET |
/contents/genres |
Obtener géneros disponibles |
| Método | Endpoint | Descripción |
|---|---|---|
POST |
/lists |
Crear nueva lista |
GET |
/lists |
Obtener listas del usuario |
GET |
/lists/:id |
Obtener lista específica por ID |
PATCH |
/lists/:id |
Actualizar lista específica |
POST |
/lists/:id/contents |
Añadir contenido a lista específica |
| Método | Endpoint | Descripción |
|---|---|---|
POST |
/comments |
Crear nuevo comentario |
GET |
/comments/:id |
Obtener comentario específico |
GET |
/comments/content/:contentId |
Obtener comentarios de un contenido |
| Método | Endpoint | Descripción |
|---|---|---|
POST |
/ratings |
Crear nueva valoración |
GET |
/ratings |
Obtener valoraciones del usuario |
GET |
/ratings/:contentId |
Obtener valoración específica por contenido |
PATCH |
/ratings/:contentId |
Actualizar valoración de contenido |
DELETE |
/ratings/:contentId |
Eliminar valoración de contenido |
GET |
/ratings/average/:contentId |
Obtener valoración promedio de contenido |
| Método | Endpoint | Descripción |
|---|---|---|
POST |
/contents_user |
Marcar contenido como visto/por ver |
GET |
/contents_user |
Obtener relaciones contenido-usuario |
GET |
/contents_user/watched |
Obtener contenido marcado como visto |
GET |
/contents_user/:contentId |
Obtener relación específica contenido-usuario |
PATCH |
/contents_user/:contentId |
Actualizar estado de contenido |
DELETE |
/contents_user/:contentId |
Eliminar seguimiento de contenido |
├── 📄 app.js # Archivo principal de la aplicación
├── 📄 package.json # Dependencias y scripts
├── 📄 vercel.json # Configuración de despliegue en Vercel
├── 📁 api-docs/ # Configuración de la documentación Swagger
│ └── 📄 swagger.js # Configuración de Swagger
├── 📁 config/ # Configuraciones
│ ├── 📄 azureStorage.js # Configuración Azure Storage
│ └── 📄 mailer.js # Configuración de email
├── 📁 db/ # Base de datos
│ └── 📄 sequelizeConnection.js # Conexión Sequelize para la base de datos
├── 📁 html-templates/ # Plantillas de email
│ ├── 📄 loginEmail.html # Email de inicio de sesión
│ ├── 📄 logoutFromAllDevices.html # Email de cierre de sesión en todos los dispositivos
│ ├── 📄 registerEmail.html # Email de registro
│ └── 📄 userUpdatedInfo.html # Email de actualización de información del usuario
├── 📁 middlewares/ # Middlewares personalizados
│ ├── 📄 auth.js # Middleware de autenticación
│ ├── 📄 express-rate-limit.js # Rate limiting
│ ├── 📄 swaggerAuth.js # Autenticación Swagger
│ └── 📄 upload.js # Manejo de archivos
├── 📁 models/ # Modelos de Sequelize
│ ├── 📄 comment.js # Modelo de comentarios
│ ├── 📄 content_list.js # Modelo de contenido-lista
│ ├── 📄 content_user.js # Modelo de contenido-usuario
│ ├── 📄 content.js # Modelo de contenido
│ ├── 📄 list.js # Modelo de listas
│ ├── 📄 rating.js # Modelo de valoraciones
│ ├── 📄 relations.js # Relaciones entre modelos
│ └── 📄 user.js # Modelo de usuario
└── 📁 routers/ # Rutas de la API
├── 📄 comment.js # Rutas de comentarios
├── 📄 content_user.js # Relaciones usuario-contenido
├── 📄 content.js # Rutas de contenido
├── 📄 list.js # Rutas de listas
├── 📄 rating.js # Rutas de valoraciones
└── 📄 user.js # Rutas de usuarios
La API incluye documentación interactiva generada automáticamente con Swagger/OpenAPI.
- Desarrollo: http://localhost:3000/api-docs
- Interfaz Interactiva: Probar endpoints directamente desde el navegador
- Esquemas Detallados: Modelos de datos completos
- Ejemplos de Uso: Requests y responses de ejemplo
- Autenticación: Soporte para testing con JWT
Este proyecto está bajo la Licencia MIT. Ver el archivo LICENSE para más detalles.
Jaime Hedrera Rosa - Desarrollador Full Stack
- Portafolio: jaimehedrera.es
- LinkedIn: Jaime Hedrera Rosa
- Email: business@jaimehedrera.es
- GitHub: @BetaGun03
Desarrollado como TFG por Jaime Hedrera Rosa.
