diff --git a/.agente/ideas.md b/.agente/ideas.md index 2b70431..1d9e13c 100644 --- a/.agente/ideas.md +++ b/.agente/ideas.md @@ -8,10 +8,14 @@ ## Ideas pendientes -_(anota aquí las ideas con algo de forma)_ +- **Protección con PIN o contraseña opcional:** Permitir que quien comparte un archivo pueda agregar un PIN de 4 dígitos o contraseña opcional para mayor privacidad al compartir enlaces sensibles. +- **Descargas comprimidas ZIP multi-archivo:** Si un usuario sube un lote de varios archivos a la vez, empaquetarlos en un solo enlace con opción "Descargar todo como ZIP". +- **Límite de un solo uso (Burn after reading):** Opción para que un archivo o secreto en texto se auto-elimine inmediatamente después de la primera visualización o descarga. +- **Integración con bot del ecosistema (sigma-robot):** Enviar alerta o notificación opcional a un canal cuando un archivo clave haya sido descargado o abierto. --- ## Ideas en borrador -_(anota aquí lo que se te ocurra, sin filtro)_ +- Modo P2P / WebRTC para transferir archivos pesados gigabytes directamente entre navegadores en la misma red local sin almacenarlos en el servidor. +- Mini editor de texto con syntax highlighting enriquecido (Monaco Editor o CodeMirror ligero). diff --git a/.agente/infraestructura.md b/.agente/infraestructura.md index 2a0c20b..8c0c5b7 100644 --- a/.agente/infraestructura.md +++ b/.agente/infraestructura.md @@ -1328,6 +1328,55 @@ Plataforma de lealtad desarrollada para gestionar clientes y acumulación de pun --- +### app_compartir — Plataforma de Transferencia y Visor Rápido de Archivos + +**Descripción:** +Aplicación web en Go para transferencia inmediata de archivos, fotos, documentos y texto/código entre dispositivos (PC y móvil) sin depender de WhatsApp. Incluye un visor universal integrado con reproductores multimedia, lector de PDF y visualizador de código, además de generación instantánea de código QR para escaneo móvil. + +| Parámetro | Valor | +|-----------|-------| +| Repositorio Git | [pendiente — crear repo en git.telcotronics.net] | +| Tecnología principal | Go 1.22+ / 1.27 (`net/http` nativo) + SQLite + Tailwind CSS | +| Responsable | pablinux | +| Estado actual | ✅ Operativo / En pruebas | +| Ubicación local | `siax-amd` — `/home/pablinux/Projects/GO/app_compartir` | +| Servidor de producción | `server-webapps` CT 132 (`192.168.10.160`) — pendiente deploy | +| Dominio público | `compartir.sigmac.app` (o `compartir.telcotronics.net`) | +| Puerto | `8085` | +| Servicio systemd | `app-compartir.service` | + +**Bases de Datos:** +* **SQLite** (`data/compartir.db` local en modo WAL): Almacena metadatos de archivos compartidos (`shares`), usuarios vinculados (`users`) y tokens de sesión (`sessions`). + +**Política de Retención y Almacenamiento:** +* **Sesiones Invitado (Guest):** No requieren login. Los archivos y notas tienen caducidad estricta de **24 horas**. Un worker en segundo plano (`cleaner`) purga periódicamente el archivo físico en disco y su registro en la base de datos. +* **Cuentas Registradas (WebControl / Google OAuth):** Almacenamiento **permanente**. No se eliminan a las 24 horas y disponen de panel de gestión en `/mis-archivos`. + +**Servicios que Consume y Expone:** +* **Expone:** + * **GET** `/`: Portal web de subida (drag & drop, pegar con `Ctrl+V`, compartir notas/código). + * **POST** `/api/upload`: Subida multipart de archivos (hasta 500 MB). Retorna JSON con `viewer_url` y `download_url`. + * **POST** `/api/share-text`: Subida rápida de fragmentos de texto o código. + * **GET** `/v/{id}`: Visor universal (imágenes con zoom, video/audio HTML5, PDF embebido, texto/código con botón de copia, y QR móvil). + * **GET** `/d/{id}`: Descarga directa forzada (`attachment`). + * **GET** `/raw/{id}`: Visualización directa en el navegador (`inline`). + * **GET** `/qr/{id}`: Código QR dinámico en PNG (256x256). + * **DELETE** `/api/shares/{id}`: Eliminación manual de archivos por su propietario. +* **Consume:** + * **WebControl (Auth):** `https://api.siax-system.net/api/auth/login` para autenticación de cuentas internas Telcotronics. + * **Google OAuth2:** Flujo de login con cuentas Google (`/auth/google`). + +**Módulos Disponibles:** +* **Módulo de Subida y Streaming:** Recepción de multipart y almacenamiento local con generación de slug corto. (✅ Operativo) +* **Visor Universal:** Interfaz interactiva adaptativa según el MIME type. (✅ Operativo) +* **Purga Automática 24h:** Goroutine en segundo plano que limpia archivos y sesiones guest expiradas. (✅ Operativo) +* **Gestor de Cuentas y Mis Archivos:** Panel para usuarios registrados con métricas de visitas y descarga. (✅ Operativo) + +**Dónde buscar más información:** +* Documentación técnica del proyecto: `siax-amd:/home/pablinux/Projects/GO/app_compartir/agents.md`. + +--- + ### sistema-gimnasio — Sistema de Administración para Gimnasio (SOCIOS) Panel web de administración de gimnasios en el ecosistema SIGMA (frente 3 — Panel Admin SOCIOS). Staff del gimnasio gestiona miembros, membresías, pagos, visitas, cajas, inventario de items y ventas. SPA Vue 2 + Vuetify 2 con tema oscuro. Consume dos APIs del ecosistema: `API-SIGMA-WEBCONTROL` para autenticación y `API-SIGMA-CLOUD` para todos los datos de negocio. @@ -1402,16 +1451,16 @@ Backend de la app **SoundWave**. Permite controlar la reproducción de audio de | Parámetro | Valor | |---|---| | Repositorio Git | `https://git.telcotronics.net/pablinux/audio_control.git` | -| Tecnología principal | Node.js (Express 4) + MariaDB + DLNA/UPnP + ffplay + EJS | +| Tecnología principal | Node.js (Express 4) + Socket.IO + MariaDB + DLNA/UPnP + ffplay + EJS | | Responsable | pablinux | | Estado actual | ✅ Activo / Desplegado en producción | | Equipo / ubicación local | `siax-amd` (`192.168.10.100`) — `/home/pablinux/Projects/Node/audio_control` | | Servidor de producción | `server-webaps` CT 132 (`192.168.10.160`) — `/home/user_apps/apps/audio_control` | -| Dominio público | `audiocontrol.sigmac.app` (pendiente virtualhost/SSL en .160) | +| Dominio público | `audiocontrol.sigmac.app` (vhost activo en .160; enrutamiento WAN sujeto a proxy en .109 / NAT) | | Puerto | `4005` (dev: `4000`) | | Servicio systemd | `siax-app-AUDIO_CONTROL.service` (activo) | | Registro MCP | Servicio ID `15` en `http://192.168.10.160:3006` | -| Última actualización | 2026-09-23 | +| Última actualización | 2026-09-24 | **BD que usa:** @@ -1423,25 +1472,28 @@ Backend de la app **SoundWave**. Permite controlar la reproducción de audio de | Método | Endpoint | Auth | Descripción | |--------|----------|------|-------------| -| POST | `/control/audio/play` | — (pendiente JWT) | Reproduce archivo MP3 local con `ffplay`. Body: `{ file: "ruta/relativa" }` | -| POST | `/control/audio/stop` | — (pendiente JWT) | Detiene `ffplay` activo | -| POST | `/control/youtube/download` | — | Descarga audio de YouTube como MP3. Body: `{ url: "..." }` | +| POST | `/control/audio/play` | `verificarJWT` | Reproduce archivo MP3 local con `ffplay` y emite `player:status`. Body: `{ file: "ruta/relativa" }` | +| POST | `/control/audio/stop` | `verificarJWT` | Detiene `ffplay` activo y emite `player:status` | +| POST | `/control/youtube/download` | `verificarJWT` | Descarga audio de YouTube como MP3 con validación regex anti-SSRF. Body: `{ url: "..." }` | | GET | `/api/youtube-playlist` | — | Lista playlist YouTube (últimas 50 de MySQL) | | POST | `/api/youtube-playlist/add` | — | Agrega video a playlist | | GET | `/api/mp3-files` | — | Lista archivos MP3 en `public/files/mp3/` | | POST | `/api/auth/google` | — | Auth Google OAuth 2.0 → JWT propio | | GET | `/api-docs` | — | Swagger UI | +| WS | Socket.IO | — | Eventos `player:status` y ajuste de `player:volume` bidireccional | **Servicios que consume:** | Servicio | Uso | |---------|-----| -| `ffplay` (sistema — parte de `ffmpeg`) | Reproducción de audio local | +| `ffplay` / `amixer` (sistema Linux) | Reproducción de audio local y control de volumen hardware | | YouTube (internet) vía `@distube/ytdl-core` | Descarga de audio | | Google OAuth 2.0 API | Verificación de tokens de usuario | +| Bitácora Centralizada de Errores | `POST https://api.siax-system.net/api/errores` (`app_origen: audio_control`) | **Integración con el ecosistema:** -- Independiente actualmente — no consume APIs internas del ecosistema +- Conectado a la bitácora centralizada de errores (`siax-system.net`) +- Sincronizado en tiempo real vía WebSockets para pantallas y controles múltiples - Potencial: integrar con `sigma-robot` para notificaciones de estado vía WhatsApp **Dónde buscar más información:** `siax-amd:/home/pablinux/Projects/Node/audio_control/agents.md` diff --git a/.agente/proyecto_errores.md b/.agente/proyecto_errores.md index a8bdc3a..4a9e548 100644 --- a/.agente/proyecto_errores.md +++ b/.agente/proyecto_errores.md @@ -16,4 +16,8 @@ ## Errores registrados -_(ninguno aún)_ +### 2026-10-13 — Imports no utilizados en `db.go` y `handlers.go` durante compilación Go +- **Síntoma:** Error de compilación en `go build`: `internal/db/db.go:8:2: "time" imported and not used` e `internal/handlers/handlers.go:7:2: "io" imported and not used`. +- **Causa raíz:** Durante la reestructuración de funciones auxiliares, los paquetes `time` (en db) e `io` (en handlers) quedaron huérfanos sin llamadas directas. +- **Solución:** Se retiraron los imports no utilizados y se recompiló exitosamente con `go build -o app_compartir main.go`. +- **Estado:** ✅ Resuelto diff --git a/.agente/proyecto_memoria.md b/.agente/proyecto_memoria.md index b9bf81a..428e2a4 100644 --- a/.agente/proyecto_memoria.md +++ b/.agente/proyecto_memoria.md @@ -9,31 +9,41 @@ | Fecha | Decisión | Razonamiento | |---|---|---| -| 2026-10-12 | Inicialización de la estructura estándar de documentación de agentes | Estandarización bajo el ecosistema Telcotronics | +| 2026-10-12 | Inicialización de la estructura estándar de documentación de agentes | Estandarización bajo el ecosistema Telcotronics. | | 2026-10-12 | Política de caducidad 24h exclusiva para usuarios Guest | El usuario solicitó explícitamente que los archivos subidos por invitados se eliminen a las 24 horas, mientras que los usuarios registrados (Google OAuth / WebControl) mantengan sus archivos de manera permanente. | | 2026-10-12 | Visor integrado universal para evitar depender de WhatsApp | Permite abrir imágenes, reproducir video/audio, leer PDFs y ver texto o código directamente desde el navegador sin apps externas. | | 2026-10-12 | Backend autónomo en Go con SQLite | Binario único de alto rendimiento, bajo consumo de memoria y concurrencia nativa con goroutine para la limpieza periódica. | +| 2026-10-13 | Generación de QR nativa en Go vía `/qr/{id}` | Se utiliza `github.com/skip2/go-qrcode` para servir el QR directamente en formato PNG (256x256), garantizando compatibilidad total con cualquier cámara de smartphone sin depender de scripts cliente pesados. | +| 2026-10-13 | Soporte doble de login: WebControl corporativo + Google OAuth | Brinda flexibilidad tanto para colaboradores del ecosistema Telcotronics (vía `api.siax-system.net`) como para usuarios externos con Google. | --- ## Estado actual -Estructura de documentación y requerimientos alineados. Desarrollando servidor en Go con base de datos SQLite, endpoints de subida, visor interactivo y worker de purga a 24 horas. +Versión funcional completa y validada: +- Subida de archivos por Drag & Drop, selección o pegado directo con `Ctrl+V`. +- Subida de notas/código con pestaña interactiva. +- Visor universal adaptativo con vista previa multimedia, lector de PDF y código con botón de copia. +- Purga automática cada 10 minutos para archivos guest > 24h (test automatizado superado en `main_test.go`). +- Cuentas registradas con almacenamiento permanente y panel `/mis-archivos`. +- Documentación e integración de infraestructura sincronizada con el MCP y global `infraestructura.md`. --- -## Pendientes +## Tareas implementadas -- [ ] Implementar base de datos SQLite y esquema de tablas (`shares`, `users`, `sessions`) -- [ ] Implementar endpoints HTTP de subida (`/api/upload`, `/api/share-text`) -- [ ] Implementar visor `/v/{id}` (HTML + Tailwind + QR) -- [ ] Implementar worker de purga de archivos guest vencidos -- [ ] Implementar auth con WebControl (`api.siax-system.net`) y Google OAuth2 -- [ ] Implementar panel "Mis Archivos" para usuarios autenticados +- [x] Implementar base de datos SQLite y esquema de tablas (`shares`, `users`, `sessions`) +- [x] Implementar endpoints HTTP de subida (`/api/upload`, `/api/share-text`) +- [x] Implementar visor universal `/v/{id}` (HTML + Tailwind + QR) +- [x] Implementar worker de purga de archivos guest vencidos (24 horas) +- [x] Implementar auth con WebControl (`api.siax-system.net`) y Google OAuth2 +- [x] Implementar panel "Mis Archivos" para usuarios autenticados +- [x] Sincronizar sección de infraestructura en global e internal para MCP --- ## Notas y observaciones -- Los archivos se almacenarán en `data/uploads/` y la base de datos en `data/compartir.db`. -- Los enlaces cortos utilizarán slugs alfanuméricos seguros y compactos. +- Los archivos se almacenan en `data/uploads/` y la base de datos en `data/compartir.db`. +- Los slugs son de 7 caracteres alfanuméricos no ambiguos generados criptográficamente. +- Las sesiones de invitados se manejan mediante cookies seguras HTTP-only para permitir el flujo sin fricción. diff --git a/README.md b/README.md index b26cc4b..40e18d7 100644 --- a/README.md +++ b/README.md @@ -1,61 +1,139 @@ -# app_compartir +# 🚀 app_compartir -Aplicación web de alto rendimiento en Go para compartir archivos, fotos, documentos y texto/código al instante entre dispositivos (móvil y PC), sin depender de clientes de mensajería como WhatsApp. +> **Pasa fotos, notas, PDFs y archivos entre tu teléfono y tu ordenador en segundos — sin necesidad de abrir WhatsApp ni mandar mensajes a tu propio chat.** + +Una aplicación web ágil, moderna y ligera desarrollada en **Go**. Permite transferir cualquier tipo de archivo o texto con generación instantánea de enlace y código QR para escanearlo con la cámara del móvil. --- -## Características +## 🎯 ¿Qué problema resuelve? -- ⚡ **Sin fricción:** Subida mediante Drag & Drop, selección de archivos, pegado desde portapapeles (`Ctrl+V`) o editor de notas/código. -- 📱 **QR instantáneo:** Generación automática de código QR para escanear y abrir de inmediato en el teléfono. -- 👁️ **Visor universal (`/v/{id}`):** - - **Imágenes:** Zoom interactivo, pantalla completa y alta fidelidad. - - **Video y Audio:** Reproductor HTML5 integrado. - - **PDFs:** Visor interactivo incrustado en el navegador. - - **Texto y Código:** Formato monospace con botón para copiar al portapapeles en 1 clic. - - **Otros archivos:** Ficha de descarga con detección de tipo MIME y peso exacto. -- ⏳ **Política de retención 24h para invitados:** - - Los archivos subidos en **Modo Invitado (Guest)** se purgan automáticamente tras 24 horas del disco y de la base de datos. - - Los usuarios autenticados con **WebControl** o **Google OAuth** disponen de **almacenamiento permanente** y panel de gestión para sus archivos. +Pasarse una foto de la PC al celular, un fragmento de código, una contraseña temporal o un PDF habitualmente obliga a abrir WhatsApp Web, buscar tu propio chat ("Chat contigo mismo"), enviar el archivo (que a menudo se recomprime) y luego borrarlo. + +**app_compartir elimina toda esa fricción:** +1. Arrastras el archivo o pegas una captura con Ctrl+V en el navegador. +2. Apuntas con la cámara de tu móvil al código QR que aparece en pantalla. +3. ¡Listo! Se abre el visor en tu móvil de forma inmediata. --- -## Requisitos +## ✨ Características Principales -- Go 1.22+ +### 📤 Subida sin complicaciones +- **Drag & Drop:** Arrastra cualquier archivo a la ventana. +- **Portapapeles directo:** Presiona Ctrl+V en cualquier parte de la página para subir capturas de pantalla o texto copiado al instante. +- **Pestaña Texto / Código:** Comparte fragmentos de código, notas de reuniones o enlaces sin crear archivos de texto manualmente. -## Instalación y Arranque +### 📱 Escaneo QR y Enlaces Cortos +- Cada elemento compartido genera una URL corta (`/v/slug`) y un **código QR nativo en pantalla**. +- Puedes escanearlo directamente desde cualquier smartphone sin instalar ninguna app adicional. +### 👁️ Visor Universal Integrado (`/v/{id}`) +No requiere descargar el archivo a ciegas para ver qué es: +- 🖼️ **Imágenes:** Visor con zoom al 100%, pantalla completa y alta calidad (PNG, JPG, GIF, WebP, SVG). +- 🎥 **Video:** Reproductor HTML5 integrado para previsualizar grabaciones o clips (MP4, WebM). +- 🎵 **Audio:** Reproductor nativo para notas de voz o música (MP3, WAV, OGG). +- 📄 **PDFs:** Lector embebido interactivo en el navegador. +- 💻 **Texto / Código:** Formato legible con resaltado monospace y botón para **Copiar texto** al portapapeles con un clic. +- 📦 **Otros archivos:** Ficha técnica con tamaño exacto, tipo de archivo y botón directo de descarga. + +--- + +## 🔒 Política de Retención: Invitado vs Cuenta Registrada + +| Característica | 👤 Modo Invitado (Guest) | 🛡️ Cuenta Registrada (WebControl / Google) | +|---|---|---| +| **¿Requiere inicio de sesión?** | **No** (usar y compartir de inmediato) | Sí (login fácil con 1 clic) | +| **Tiempo de vida del archivo** | ⏰ **24 horas exactas** | ♾️ **Permanente** (no expira) | +| **Eliminación automática** | Sí, el worker purga archivo y registro tras 24h | **Nunca** (se conserva hasta que lo borres) | +| **Panel "Mis Archivos"** | No disponible | ✅ Sí (`/mis-archivos`) con historial y métricas | +| **Eliminación manual** | No requerida (se auto-destruye) | ✅ Sí, botón para eliminar cuando quieras | + +--- + +## 🛠️ Stack Tecnológico + +- **Lenguaje:** Go (Go 1.22+ / 1.27 con routing nativo `net/http`) +- **Base de Datos:** SQLite local en modo WAL (vía `modernc.org/sqlite`, 100% puro Go sin dependencias CGO) +- **Generador QR:** `github.com/skip2/go-qrcode` (generación ultrarrápida de QR PNG) +- **Frontend:** HTML5, Tailwind CSS y FontAwesome +- **Autenticación:** + - Telcotronics **WebControl** (`https://api.siax-system.net/api/auth/login`) + - **Google OAuth2** + +--- + +## 🚀 Puesta en Marcha Rápida + +### 1. Requisitos +- Go 1.22 o superior instalado en el sistema. + +### 2. Configurar entorno +Copia la plantilla de variables de entorno: ```bash -# Copiar variables de entorno cp .env.example .env +``` -# Descargar dependencias y compilar +Parámetros disponibles en `.env`: +```env +PORT=8085 +BASE_URL=http://localhost:8085 +DATA_DIR=./data +SESSION_SECRET=clave_secreta_para_cookies +WEBCONTROL_API_URL=https://api.siax-system.net +GOOGLE_CLIENT_ID= +GOOGLE_CLIENT_SECRET= +``` + +### 3. Compilar y Arrancar +```bash +# Descargar dependencias go mod tidy + +# Compilar binario autónomo go build -o app_compartir main.go -# Ejecutar el servidor (puerto 8085 por defecto) +# Ejecutar el servidor ./app_compartir ``` ---- - -## Variables de Entorno - -| Variable | Descripción | Default | -|---|---|---| -| `PORT` | Puerto de escucha HTTP | `8085` | -| `BASE_URL` | URL pública de la aplicación | `http://localhost:8085` | -| `DATA_DIR` | Carpeta para base de datos y uploads | `./data` | -| `SESSION_SECRET` | Clave secreta para cookies de sesión | `super-secret-...` | -| `WEBCONTROL_API_URL` | URL de la API de WebControl | `https://api.siax-system.net` | -| `GOOGLE_CLIENT_ID` | Client ID de Google OAuth | (opcional) | -| `GOOGLE_CLIENT_SECRET` | Client Secret de Google OAuth | (opcional) | +Abre tu navegador en: **`http://localhost:8085`** --- -## Pruebas automatizadas +## 🧪 Pruebas Automatizadas + +El proyecto cuenta con tests automatizados que comprueban la regla estricta de caducidad a las 24 horas para invitados y la permanencia de usuarios registrados: ```bash go test -v ./... ``` + +--- + +## 📂 Estructura del Código + +```text +app_compartir/ +├── internal/ +│ ├── auth/ # Sesiones HTTP-only, WebControl y Google OAuth +│ ├── cleaner/ # Worker periódico de purga automática 24h para invitados +│ ├── config/ # Variables de entorno y rutas +│ ├── db/ # DAL de SQLite, esquema y consultas seguras +│ ├── handlers/ # Controladores HTTP: upload, visor, QR, auth, descarga +│ ├── models/ # Estructuras de datos (Share, User, Session) +│ └── storage/ # Generador de slugs seguros y almacenamiento en disco +├── web/ +│ └── templates/ # Plantillas HTML (base, index, visor, login, mis archivos) +├── .agente/ # Documentación interna del agente y ecosistema Telcotronics +├── main.go # Servidor HTTP principal y ciclo de vida de la app +├── main_test.go # Tests de integración de retención y purga +└── README.md # Esta guía +``` + +--- + +## 🏢 Ecosistema Telcotronics + +Este proyecto forma parte del ecosistema Telcotronics y se encuentra registrado en la infraestructura compartida del MCP (`mcp.telcotronics.net` / `infraestructura.md`). +Para más detalles técnicos y reglas del agente, consultar [`agents.md`](agents.md).