¡Bienvenido al Platubot Admin! Este es el portal de administración central y consola de gestión premium para el ecosistema Platubot. Diseñado con una estética ciberpunk/futurista impactante basada en glassmorphism y efectos de neón, este panel web permite a los administradores autorizados interactuar con las colecciones de datos del bot, realizar copias de seguridad automáticas en GitHub y ejecutar operaciones CRUD en tiempo real con la máxima seguridad.
Note
Este proyecto actúa como una interfaz administrativa y depende de la API del servidor principal de Platubot (ejecutándose en Bun) para procesar y almacenar físicamente la información.
- 🔒 Acceso Seguro vía Discord OAuth2: Sistema de autenticación de alta seguridad que restringe el acceso al panel. Solo los usuarios con el rol administrativo específico en el servidor oficial de Discord pueden iniciar sesión.
- ⚡ Dashboard CRUD en Tiempo Real: Visualiza, filtra, edita, crea y elimina registros directamente sobre las colecciones del bot de forma instantánea.
- 📁 Navegación Dinámica de Colecciones: Un menú lateral reactivo autodetecta y lista todas las colecciones de datos disponibles en el bot.
- 📝 Editor JSON Avanzado: Interfaz que soporta campos planos y arrays u objetos anidados, incluyendo un validador de sintaxis JSON del lado del cliente antes de enviar cualquier cambio.
- 🛡️ Doble Confirmación de Mutaciones: Para prevenir cambios o eliminaciones accidentales en producción, las operaciones críticas requieren una doble validación: aceptar los riesgos en un checkbox de seguridad y escribir textualmente el nombre de la colección objetivo.
- 💾 Integración Automática con Backups: Cada cambio guardado o eliminado de forma segura notifica al bot para sincronizar el estado e iniciar un push automático a GitHub (
origin/main), manteniendo un historial de cambios infalible. - 🔮 Interfaz Visual Premium: Diseño de alto impacto que incluye fondos dinámicos con gradientes radiales pulsantes, tipografía moderna (
OutfityJetBrains Mono), componentes de carga fluidos e interacciones animadas.
El panel se ha estructurado con tecnologías modernas de desarrollo web, priorizando la velocidad, la seguridad y una excelente experiencia de desarrollo:
- Framework: Next.js v16.2.6 con la arquitectura App Router para un renderizado híbrido óptimo y enrutamiento simplificado.
- Biblioteca UI: React v19.2.4 para el manejo del estado del dashboard y la interactividad reactiva.
- Iconografía: Lucide React para un conjunto de iconos modernos y consistentes.
- Estilos: Vanilla CSS moderno con variables HSL globales, transiciones fluidas de aceleración bezier y estilos embebidos mediante
<style jsx>para un control de componentes aislado y escalable. - Encriptación: Módulo nativo de Node.js
cryptoaplicando algoritmos simétricosaes-256-cbcy derivación de llaves mediantescryptSync. - Gestor de Paquetes / Runtime: Compatible con Bun y Node.js / npm.
A continuación se detalla la distribución de archivos y directorios clave del proyecto:
admin-web/
├── public/ # Recursos estáticos públicos (imágenes, favicon)
├── src/
│ └── app/
│ ├── api/ # Rutas de API en el Servidor (Backend)
│ │ ├── auth/ # Módulo de Autenticación
│ │ │ ├── discord/
│ │ │ │ ├── login/ # GET: Redirecciona al usuario a Discord OAuth2
│ │ │ │ └── callback/ # GET: Intercambia código, valida rol, inicia sesión
│ │ │ └── logout/ # GET: Elimina la cookie de sesión y redirige a la Landing
│ │ └── database/
│ │ └── [[...path]]/ # API Route dinámica (Proxy para GET, POST, PUT, DELETE)
│ ├── components/ # Componentes reactivos del lado del cliente
│ │ └── Dashboard.js # Core UI del Panel (Visualización de datos, CRUD, Búsqueda, Modales)
│ ├── utils/ # Utilidades auxiliares
│ │ └── session.js # Helpers de Encriptación y Decodificación de sesiones (AES-256-CBC)
│ ├── favicon.ico # Icono del sitio
│ ├── globals.css # Estilos globales, variables HSL, fuentes y animaciones de fondo
│ ├── layout.js # Layout raíz, inyecta texturas de fondo y metadatos SEO
│ └── page.js # Página de entrada (Landing Page para login o render del Dashboard)
├── .env.example # Plantilla de variables de entorno requeridas
├── eslint.config.mjs # Configuración del linter ESLint
├── jsconfig.json # Configuración de rutas relativas y JavaScript
├── next.config.mjs # Configuración del compilador de Next.js
└── package.json # Dependencias del proyecto y scriptsPara ejecutar la aplicación localmente o en producción, debes crear un archivo .env.local en la raíz del proyecto. Toma como referencia el archivo .env.example:
# CONFIGURACIÓN DE DISCORD OAUTH2 (Crear App en https://discord.com/developers/applications)
DISCORD_CLIENT_ID="TU_CLIENT_ID_DE_DISCORD"
DISCORD_CLIENT_SECRET="TU_CLIENT_SECRET_DE_DISCORD"
DISCORD_REDIRECT_URI="http://localhost:3000/api/auth/discord/callback"
# COMUNICACIÓN CON EL BOT (Servidor API de Bun)
BOT_API_URL="http://localhost:3001"
BOT_API_SECRET="platubot-super-secret-key-1234"
# VARIABLE DE SESIÓN (Texto aleatorio largo de 32+ caracteres)
SESSION_SECRET="generar-clave-segura-simetrica-de-32-caracteres"- Entra al Discord Developer Portal.
- Crea una aplicación llamada Platubot Admin (o similar).
- Ve a la sección OAuth2, copia el
Client IDy genera un nuevoClient Secret. - En Redirects, añade exactamente la URL configurada en
DISCORD_REDIRECT_URI(por ejemplo,http://localhost:3000/api/auth/discord/callbackpara desarrollo local).
La seguridad es el pilar fundamental del panel. El flujo de autenticación opera de la siguiente manera:
sequenceDiagram
autonumber
actor Admin as Administrador
participant Web as Web (Next.js Front)
participant Server as Web Server (Next.js API)
participant Discord as Discord API
participant Bot as Bot API (Bun Server)
Admin->>Web: Clic en "Ingresar con Discord"
Web->>Server: Solicita inicio de sesión (/api/auth/discord/login)
Server-->>Admin: Redirección a Discord OAuth2 Authorization URL
Admin->>Discord: Aprueba permisos (Scope: identify)
Discord-->>Server: Redirige al Callback con código de autorización (?code=xxx)
rect rgb(20, 20, 30)
note right of Server: Proceso del Callback (/api/auth/discord/callback)
Server->>Discord: POST /api/oauth2/token (Intercambia código por Access Token)
Discord-->>Server: Retorna Access Token
Server->>Discord: GET /api/users/@me (Obtiene datos del usuario)
Discord-->>Server: Retorna ID, Username, Avatar de Discord
end
rect rgb(30, 20, 20)
note right of Server: Validación de Rol Administrativo
Server->>Bot: POST /api/auth-check { userId: XXX } (Con token Bearer del Bot)
Bot-->>Server: Retorna { authorized: true/false, user: { displayName } }
end
alt No Autorizado (Sin el rol en el Servidor Discord)
Server-->>Admin: Redirección a Landing con ?error=unauthorized
else Autorizado
note right of Server: Creación de Sesión Segura
Server->>Server: Genera JSON de sesión + Encripta con AES-256-CBC (SESSION_SECRET)
Server-->>Admin: Redirige a "/" y establece Cookie "platubot_session" (HttpOnly, Secure, SameSite: Lax)
end
- Cookie Encriptada: La cookie
platubot_sessiones totalmente ilegible para el navegador del cliente. UtilizaHttpOnlypara evitar ataques XSS ySecureen producción para transmitirse únicamente a través de HTTPS. - Algoritmo Simétrico: El helper
encryptSessionrealiza una derivación criptográfica de la contraseña (SESSION_SECRET) usando un "salt" estático para generar una clave simétrica de 32 bytes. Luego aplica un vector de inicialización (IV) único por sesión para blindar la encriptación.
Las operaciones a la base de datos no se realizan directamente desde el cliente hacia la base de datos ni hacia el bot. En su lugar, Next.js expone una ruta dinámica comodín (catch-all) que actúa como un Proxy Reverso Seguro:
- Ruta local:
/api/database/[[...path]]/route.js - Funcionamiento:
- Cualquier petición a
/api/database/...intercepta las cookies del navegador para extraerplatubot_session. - Si la sesión no es válida o está ausente, retorna inmediatamente un error 401 Unauthorized.
- Si la sesión es válida, el servidor Next.js reconstruye la petición, le inyecta la cabecera
Authorization: Bearer <BOT_API_SECRET>y la redirige al backend del bot enBOT_API_URL. - El proxy mapea las rutas automáticamente de la siguiente forma:
- Cualquier petición a
| Método HTTP | Ruta Frontend | Ruta Bot API Equivalente | Acción Realizada |
|---|---|---|---|
| GET | /api/database |
/api/collections |
Obtener la lista de nombres de colecciones. |
| GET | /api/database/[col] |
/api/collections/[col] |
Obtener todos los registros de una colección. |
| POST | /api/database/[col] |
/api/collections/[col] |
Crear un nuevo registro dentro de una colección. |
| PUT | /api/database/[col]/[id] |
/api/collections/[col]/[id] |
Actualizar un registro específico por su ID. |
| DELETE | /api/database/[col]/[id] |
/api/collections/[col]/[id] |
Eliminar un registro específico por su ID. |
Debido a que el panel tiene permisos de escritura directa sobre la base de datos de producción de Platubot, y a que cada cambio desencadena un push inmediato al repositorio de GitHub para sincronización y backups, se ha diseñado un sistema de doble confirmación visual obligatoria en el frontend para evitar cualquier error humano.
Al intentar realizar un Guardado, Edición o Eliminación, el sistema desplegará un modal emergente bloqueante que requiere dos pasos de validación:
- Checkbox de Aceptación de Riesgo: El administrador debe marcar una casilla reconociendo que entiende las consecuencias de la operación y el backup automatizado en GitHub.
- Verificación de Nombre de Colección: Se le exige al administrador que escriba exactamente el nombre de la colección en la que está operando (por ejemplo, escribir
"users"o"configurations"). El botón de ejecución permanecerá deshabilitado e inactivo hasta que el texto coincida exactamente y la casilla esté marcada.
Asegúrate de contar con alguno de los siguientes entornos instalados:
- Bun (Recomendado por su extrema velocidad y compatibilidad nativa con el bot).
- Node.js (Versión 18 o superior) junto con
npmoyarn.
Ejecuta el comando correspondiente en la raíz del proyecto para descargar los módulos:
# Con Bun (Recomendado)
bun install
# Con npm
npm installInicia el servidor local de desarrollo en http://localhost:3000:
# Con Bun
bun dev
# Con npm
npm run devPara generar el bundle optimizado para despliegues de producción:
# Con Bun
bun run build
# Con npm
npm run buildValida que el código siga las mejores prácticas estilísticas y de calidad:
# Con Bun
bun run lint
# Con npm
npm run lintEl equipo de desarrollo de Platubot se compromete a mantener la estabilidad y robustez del sistema. Ante cualquier duda o inconveniente en la configuración, por favor consulta el repositorio principal o contacta al administrador del sistema. 🌌