Commit Graph
253 Commits
Author SHA1 Message Date
Lizandro Guarnizo 0cf7c6d279 up 2026-05-21 22:37:31 -05:00
Lizandro Guarnizo 154a2fa245 chore: postinstall validation 2026-05-21 21:41:40 -05:00
Lizandro GuarnizoandCopilot 2d6b4d8271 fix: add Users, Roles, Submodules to normal-startup AutoMigrate
Ensures tipo_usuario, EsPortalCliente, and other new columns on core
models are created in Docker deployments that never run --migrate.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-21 13:19:37 -05:00
Lizandro GuarnizoandCopilot 4fec04e5fe fix: inicializar users/roles en Alpine y null-safety en loadRegister
- Declara users:[] y roles:[] en el estado inicial de Alpine para que
  x-for funcione reactivamente desde el primer render
- Agrega totalPages:0 al estado inicial
- Añade comprobación response.ok antes de parsear JSON
- Usa || [] y || 0 para evitar TypeError si el backend retorna error
- Reemplaza data.Users.length con this.users.length (siempre array)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-21 12:30:08 -05:00
Lizandro GuarnizoandCopilot 10639d233b fix: AutoMigrate Servidor, ConxDb y ProvServidor en arranque normal
La tabla prov_servidor_submodules (many2many) solo se creaba con --migrate.
Al agregar ProvServidor al AutoMigrate del arranque normal, GORM crea la
tabla join automáticamente en cada deploy sin necesidad de flags manuales.

También incluye Servidor (agent_token, agent_last_seen, metricas_json)
y ConxDb (host) que tampoco se migraban en el arranque normal.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-21 12:08:32 -05:00
Lizandro GuarnizoandCopilot 6cca8e6fcd fix: reactividad Alpine ping — estado en cx directamente
Alpine v3 NO puede rastrear accesos dinámicos pingCargando[cx.ID]
dentro de x-for porque no sabe qué key observar por item.

Solución: estado de ping embebido en cada objeto cx:
- abrirModal inyecta _pingCargando:false y _pingResultado:null en cada cx
- hacerPing muta cx._pingCargando / cx._pingResultado directamente
- template usa cx._pingCargando y cx._pingResultado (proxy reactivo del x-for)

Esto garantiza que el spinner, el botón deshabilitado y el resultado
del ping se actualicen correctamente para cada card.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-21 12:06:00 -05:00
Lizandro GuarnizoandCopilot a484676392 fix: copiar agent/install.sh y agent/dist al contenedor Docker
El Dockerfile no incluía el directorio agent/, por eso GET /agent/install.sh
y GET /agent/download/:filename devolvían 404 — los archivos no existían
en /app/agent/ dentro del contenedor.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-21 12:00:12 -05:00
Lizandro GuarnizoandCopilot 2779c0a15d fix: ping real de BD + campo Host en ConxDb + reactividad Alpine
Problema raíz:
1. El ping TCP usaba Servidor.IpServidor → fallaba si la BD solo escucha
   en localhost del servidor remoto (comportamiento normal en producción)
2. La reactividad Alpine v3.13 no detectaba keys nuevas en objeto vacío {}
   dentro de x-for loops, spinner nunca aparecía

Cambios:
- pkg/models/conx_db.go: nuevo campo Host (vacío = usa Servidor.IpServidor)
  + método HostEfectivo() como fuente única de verdad para host
- pkg/services/query_runner_service.go: todos los puntos (openDynamicDB,
  openDynamicDBWithName, redisConnect, mongoURI) usan c.HostEfectivo()
- rest/controllers/servidor_controller.go: PingConexion reescrito —
  primero prueba conexión real a la BD (no solo TCP), si falla prueba TCP,
  devuelve host+puerto testeado y mensajes de error descriptivos
- servidor_dashboard.html: hacerPing usa spread-replace para forzar
  reactividad + $nextTick, resultado muestra host:puerto testeado y
  mensaje de error completo en múltiples líneas

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-21 11:56:12 -05:00
Lizandro GuarnizoandCopilot c3f19991c9 feat: binarios pre-compilados del agente + endpoint de descarga
- Cross-compila usite-agent para linux/amd64, linux/arm64, linux/arm
  Binarios en agent/dist/ (CGO_ENABLED=0, stripped ~6MB c/u)
- GET /agent/download/:filename sirve el binario correcto
  con Content-Disposition attachment y validación anti path-traversal
- install.sh ya apunta a /agent/download/usite-agent-linux-ARCH

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-21 11:37:43 -05:00
Lizandro GuarnizoandCopilot d9d3f8a5eb feat: sistema de agente ligero para monitoreo de servidores
Backend:
- Servidor model: AgentToken, AgentLastSeen, MetricasJson nuevos campos
- AgentHeartbeat: endpoint público POST /agent/heartbeat (auth por token)
- GenerateAgentToken: endpoint protegido POST /app/servidor/:id/agent-token
- Ruta pública /agent/install.sh sirve el script de instalación

Agente Go (agent/):
- agent/main.go: binario independiente con gopsutil
  - Recolecta RAM, CPU, Disco, Uptime, OS, Load average
  - Lee agent.yml o flags --api-url / --token
  - Envía POST a /agent/heartbeat cada N segundos
  - Instala como servicio systemd via install.sh
- agent/go.mod: módulo independiente (usite-agent)
- agent/agent.yml.sample: configuración de ejemplo
- agent/install.sh: instalador en 1 curl para Linux (systemd)

Frontend servidor_dashboard.html:
- Cards: badge ● En línea / ● Fuera / ○ Sin agente
- Barras de progreso live: RAM%, CPU%, Disco%
- Valores: GB usado/total, núcleos, uptime, OS real
- Tiempo desde último reporte
- Botón 'Agente' en cada card → modal de configuración
- Modal agente: estado, token con copy, comando curl 1 línea,
  instalación manual/avanzada con collapse, métricas actuales

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-21 11:29:24 -05:00
Lizandro GuarnizoandCopilot f52e266527 fix: corregir ping - mutación directa y manejo de cx.ID || cx.id
- Cambia spread+reassign por mutación directa (this.pingCargando[id] = true)
  para garantizar reactividad correcta en Alpine.js 3.x
- Usa (cx.ID || cx.id) en toda la plantilla para compatibilidad con
  ambos formatos de serialización JSON de GORM
- Agrega type="button" y @click.stop en el botón de verificar
- Maneja respuestas HTTP no-OK con mensaje de error explícito
- Muestra mensaje de error real del catch en la UI

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-21 11:07:39 -05:00
Lizandro Guarnizo d35398875d fix(PingConexion): reduce TCP connection timeout to 2 seconds and add error message on failure 2026-05-21 10:48:46 -05:00
Lizandro GuarnizoandCopilot 194db3e9ed fix: mejorar UX del ping en servidor_dashboard
- Mueve el resultado del ping directamente bajo los datos de la BD
- Muestra mensaje de error cuando falla la conexión (usa campo error del backend)
- Spinner y texto 'Probando...' durante la espera
- Resultado verde/rojo inline con ✓/✗ y tiempo/mensaje de error
- Etiqueta del botón cambia a 'Verificar' (más descriptivo que 'Ping')

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-21 10:48:40 -05:00
Lizandro GuarnizoandCopilot b4b60810a1 feat(prov_servidor): add many2many integrations linking
- ProvServidor model: add Integraciones []Submodules (many2many:prov_servidor_submodules)
- GetAllProvServidor: preload Integraciones
- SetProvServidorIntegraciones: new model func to replace associations
- New endpoint PUT /app/provservidor/:id/integraciones
- GetSubmodules: support ?limit= query param
- prov_servidor.html: show integrations as badges in table, view modal,
  and edit modal with checkboxes to select one or more existing submodules

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-21 10:34:01 -05:00
Lizandro GuarnizoandCopilot c834e40e83 fix(servidor-dashboard): show DB connection count on server cards
- GetServidor: query conx_count per server with GROUP BY and attach to response
- servidor_dashboard.html: use conx_count from API (fallback to _conexiones.length)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-21 10:25:18 -05:00
Lizandro Guarnizo a44fb490f7 feat(conx_db): add nombre, estado, and version fields to ConxDb model and update Create/Update functions 2026-05-21 10:16:57 -05:00
Lizandro GuarnizoandCopilot 4cb564890d feat(conx_db): complete edit/add modals with nombre, estado, version fields
- Edit modal: added Nombre, Versión, Estado (select) fields
- Add modal: added Nombre, Versión, Estado (select) fields
- loadData() JS mapping: includes nombre, estado, version
- updateItem() payload: sends nombre, estado, version to backend

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-21 10:14:40 -05:00
Lizandro GuarnizoandCopilot 03ccc75337 Fix servidor dashboard: correct all field names to match models
All fields were using wrong names (Go struct names instead of JSON tags):
- servidor.Nombre → servidor.nombre
- servidor.IP → servidor.ip_servidor
- servidor.TipoServidor → servidor.tipo_servidor
- servidor.ProvServidor → servidor.prov_servidor
- servidor.Ram → servidor.ram
- servidor.CPU → servidor.nucleos (correct field)
- servidor.Almacenamiento → servidor.disco
- servidor.SO → servidor.so
- servidor.FechaExpiracion → servidor.vencimiento
- servidor.Activo → removed (field does not exist)
- servidor.Descripcion → removed (field does not exist)

For ConxDb:
- conexion.Nombre → removed (field does not exist)
- conexion.Host → conexion.servidor.ip_servidor (from preloaded relation)
- conexion.Puerto → conexion.puerto
- conexion.Usuario → conexion.usuario
- conexion.TipoDb → conexion.tipo_db
- conexion.Estado → removed (field does not exist)
- conexion.Version → removed (field does not exist)

Also improved UI: loading skeleton, better card layout, ping badges inline.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-21 10:07:06 -05:00
Lizandro GuarnizoandCopilot 7d02add55e Fix dashboard URLs: remove /api prefix from fetch calls
Routes are registered under /app (web group), not /api/app.
The requests were hitting the JWT-protected API group causing 'Invalid Attempt' error.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-21 09:58:21 -05:00
Lizandro GuarnizoandCopilot d1e56c8bd8 Add debug logging to servidor list
- Added console.log statements to track data loading
- Better error messages with emojis and details
- Shows count of servidores, proveedores, tipos loaded
- Helps diagnose if data is not loading

This will help identify if:
- API endpoint is working
- Data is being returned
- Frontend is processing it correctly

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-21 09:22:03 -05:00
Lizandro GuarnizoandCopilot 29820c8706 Add Servidor Dashboard with connection monitoring
- Created servidor_dashboard.html with beautiful visual dashboard
- Shows all servers in grid cards with basic info
- Click button opens detailed modal with:
  - Server full information (IP, CPU, RAM, Storage, OS, Expiration)
  - All connected databases in a clean diagram layout
  - Database connection status (active/inactive)
  - Connection details (Host, Port, User, Type)
  - Ping button to test connection with response time
  - View Connection button to open query-runner
- Backend updates:
  - Added ServidorDashboard() controller to render the dashboard view
  - Added GetServidorDashboard() API endpoint to fetch server + connections
  - Added PingConexion() endpoint to test database connections (TCP + DB test)
  - Color-coded status badges and database type indicators
  - Responsive design for mobile and desktop
- Routes:
  - GET /app/servidor-dashboard (render view)
  - GET /api/app/servidor-dashboard/:id (get server details API)
  - GET /api/app/conx-ping/:id (ping connection endpoint)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-21 08:49:18 -05:00
Lizandro GuarnizoandCopilot 0813dfca55 fix(docker): actualizar golang 1.22 → 1.24 por redis dependency
go-redis/v9 requiere Go 1.24. El Dockerfile estaba usando 1.22,
causando fallo en build de Coolify: 'go: requires go >= 1.24'

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-21 08:16:38 -05:00
Lizandro GuarnizoandCopilot a5d8bedd0f Merge: feat query-runner soporte Redis
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-20 21:07:46 -05:00
Lizandro GuarnizoandCopilot 63d124215b feat(query-runner): soporte completo Redis
Backend:
- Agrega github.com/redis/go-redis/v9 como dependencia
- isRedisDriver() detecta 'redis' y 'valkey' en nombre del tipo de BD
- redisConnect(): abre cliente Redis con auth, host, port, db index
- redisTestConnection(): PING para probar conexión
- redisListDatabases(): lee CONFIG GET databases → devuelve db0..dbN
- redisListKeys(): SCAN iterativo, hasta 200 keys del db seleccionado
- redisExecuteCommand(): parsea comandos línea a línea, multi-comando
  devuelve tabla command/result/error; comando único devuelve QueryResult
  tipado (string, int64, []any para KEYS/SMEMBERS/LRANGE, HGETALL como
  field/value table)
- redisParseArgs(): tokenizador respetando comillas simples y dobles
- Todos los comandos se guardan en query_history

Frontend:
- isRedis: false estado y reset en onConxChange()
- Detecta redis/valkey en tipo_db.nombre
- Editor cambia label 'Redis CLI', placeholder con ejemplos Redis
- Sidebar: 'Keys' en lugar de 'Tablas' para Redis
- insertTable(): TYPE + TTL + GET para inspeccionar una key de Redis
- Panel de chips rojos: KEYS *, DBSIZE, INFO, CONFIG GET, CLIENT LIST, SLOWLOG
- Generador Redis: select de 24 comandos + formulario contextual
  (key, value, ttl, field según el comando elegido)
- generateRedisCmd(): genera el comando en el editor
- Badge MySQL no aparece cuando es Redis

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-20 21:07:33 -05:00
Lizandro GuarnizoandCopilot 8e324f602c Merge branch 'copilot/vcard-api-integraciones-anlisis': fix PostgreSQL CREATE DATABASE in transaction
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-20 20:39:09 -05:00
Lizandro GuarnizoandCopilot fc647944b0 fix: ejecutar sentencias PostgreSQL individualmente para evitar CREATE DATABASE en transacción
- Agrega splitPostgresStatements() que parsea SQL respetando dollar-quoting, strings y comentarios
- En ExecuteSQL, si es PostgreSQL y hay múltiples sentencias, cada una se ejecuta con su propio db.Exec()
- Evita el error: 'CREATE DATABASE cannot run inside a transaction block'
- Error ocurría porque PostgreSQL envuelve multi-statement en transacción implícita al usar simple query protocol

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-20 20:39:00 -05:00
Lizandro GuarnizoandCopilot af2414f047 fix(query-runner): dialecto SQL correcto por tipo de BD en helpers DBA
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-20 20:30:20 -05:00
Lizandro GuarnizoandCopilot c126c15ead fix(query-runner): dialecto SQL correcto por tipo de BD en helpers DBA
- Detecta isPostgres desde tipo_db.nombre al cambiar conexión
- sqlHelpers: getter dinámico — chips distintos para PostgreSQL vs MySQL
  PostgreSQL: pg_database, information_schema, pg_stat_activity, pg_indexes
  MySQL: SHOW DATABASES/TABLES/USERS/PROCESSLIST/CREATE TABLE
- generateDbHelper: genera SQL correcto por dialecto
  PostgreSQL: sin backticks, sin charset, sin @host, DO$$ para CREATE USER IF NOT EXISTS,
              GRANT ALL ON DATABASE + SCHEMA + DEFAULT PRIVILEGES
  MySQL: backticks, utf8mb4, 'user'@'host', FLUSH PRIVILEGES
- Badge PostgreSQL/MySQL en header del generador DBA
- Campo Host oculto en conexiones PostgreSQL

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-20 20:30:20 -05:00
Lizandro GuarnizoandCopilot 1ae99b4850 feat(query-runner): helpers DBA para conexiones SQL
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-20 11:14:11 -05:00
Lizandro GuarnizoandCopilot 34f2c3e582 feat(query-runner): helpers DBA para conexiones SQL
- Chips rápidos: SHOW DATABASES, SHOW TABLES, SHOW USERS, SHOW GRANTS,
  SHOW PROCESSLIST, SHOW CREATE TABLE, DESCRIBE, info_schema engine/charset
- Generador DBA (collapsible): form con BD, usuario, host y contraseña
  Operaciones: Setup completo | CREATE DATABASE | CREATE USER | GRANT ALL |
  REVOKE | SHOW GRANTS | DROP USER | DROP DATABASE
- Setup completo genera las 3 sentencias en bloque con comentarios
- Visible só

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-20 11:14:11 -05:00
Lizandro GuarnizoandCopilot 3a2f4599e5 feat(vcard-api): modales Ver/Editar Plan con todos los campos
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-20 10:48:29 -05:00
Lizandro GuarnizoandCopilot 3114a2da6c feat(vcard-api): modales Ver/Editar Plan con todos los campos
- Añade botones 'Ver' y 'Editar' en cada card de plan
- Modal 'Ver Plan': todos los campos + tabla completa de tarifas por país
  (nombre, descripción, características HTML, imagen, cantidad, estado,
   plan_id_anual/mensual, PayPal IDs, timestamps, tarifas con pais_id/monto)
- Modal 'Editar Plan': formulario con todos los campos editables
  (nombre, descripcion, caracteristicas HTML, cantidad, img, estado,
   plan_id_anual/mensual, plan_anual/mensual_paypal)
   + tabla de tarifas en sólo lectura
- Backend: agrega VcardApiPlan (GET) y VcardApiPlanUpdate (PUT) como proxy
- Rutas: GET/PUT /app/vcard-api/planes/:id

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-20 10:48:29 -05:00
Lizandro GuarnizoandCopilot 26a8271e3a fix(vcard-api): corregir tab Planes con campos reales de la API
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-20 10:38:46 -05:00
Lizandro GuarnizoandCopilot 15b38203f2 fix(vcard-api): corregir tab Planes con campos reales de la API
- Corrección: p.activo → p.estado (activo no existe en la respuesta)
- Corrección: tarifas usan t.monto, no t.precio/t.moneda/t.periodo
- Mejora: precios únicos resumidos con helper uniqueMontos() (max 5)
- Añade: img del plan, cantidad de vcards permitidas, conteo de tarifas por país
- Añade: ID del plan al pie de cada card

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-20 10:38:46 -05:00
Lizandro GuarnizoandCopilot 6880666bd8 feat(vcard-api): modal Ver VCard + boton ver en tabla + animacion como select
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-20 10:23:11 -05:00
Lizandro GuarnizoandCopilot 5a1a8857a1 feat(vcard-api): modal Ver VCard + boton ver en tabla + animacion como select
- Tabla VCards: boton 'Ver' abre modal detalle con 3 tabs (Info, Redes, Apariencia)
- Modal Ver VCard: muestra todos los campos, colores con preview, redes configuradas
- Footer del modal: boton 'Ver VCard' abre https://vcard.u-site.app/{unico} en nueva pestaña
- Footer: boton 'Editar' abre modal de edicion desde el ver
- Edit VCard: campo animacion cambiado a select (Sin animacion, Fade, Slide, Zoom, Bounce, Flip)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-20 10:23:11 -05:00
Lizandro GuarnizoandCopilot d89eaefd51 feat(vcard-api): tabla VCards completa + modal edicion con redes y apariencia
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-20 09:52:40 -05:00
Lizandro GuarnizoandCopilot bf4fdd6db0 feat(vcard-api): tabla VCards completa + modal edicion con redes y apariencia
- Tabla VCards: añade columnas cargo, URL (enlace unico), borrador badge, pais/ciudad, fecha
- Modal Editar VCard ahora tiene 3 tabs: Datos, Redes Sociales, Apariencia
- Datos: todos los campos existentes + indicativos tel/whatsapp, foto_perfil, logo, boton
- Redes: linkedin, twitter, facebook, instagram, tiktok, github, behance,
  youtube, youtube_channel, telegram, messenger, wechat, signal, line
- Apariencia: colores (cabecera, fondo, cuerpo, iconos, info) con color picker,
  fuente, bordes, estilo_vcard, orden_iconos, animacion
- JS: editVcardForm y openEditVcardModal actualizados con todos los campos

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-20 09:52:40 -05:00
Lizandro GuarnizoandCopilot f6a0d42d28 feat(vcard-api): modal Ver Usuario con tabs + rol select + roles acumulados
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-20 09:34:58 -05:00
Lizandro GuarnizoandCopilot b43c144a82 feat(vcard-api): modal Ver Usuario con tabs + rol select + roles acumulados
- Reemplaza drill-down inline de Usuarios por modal 'Ver' con tabs:
  General, Perfil, VCards, Wallet, Pagos, Logs, MiniWebs
- Añade columna Rol en tabla de usuarios con badge coloreado
- Edit Usuario: rol_id ahora es <select> con nombres reales (administrador/cliente)
- Roles se acumulan automáticamente al cargar usuarios (sin endpoint dedicado)
- Carga lazy de Pagos, Logs, MiniWebs dentro del modal de detalle
- VCards en detalle incluye URL con enlace directo

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-20 09:34:43 -05:00
Lizandro GuarnizoandCopilot da6128e386 feat(vcard): completar módulo VCard API — edición usuario/vcard, filtros, drill-down
- Modal editar usuario (name, email, rol_id, plan_id)
- Modal editar vcard (todos los campos editables)
- Columna usuario en tab VCards
- Drill-down expandible por usuario (vcards, pagos, transacciones, logs, miniwebs)
- Filtros en tabs Pagos, Transacciones y Logs
- Tecla ESC cierra modales

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-20 09:12:14 -05:00
Lizandro Guarnizo 62e49b39ad feat(vcard): agregar funcionalidad de edición de usuario y VCard, incluyendo filtros y modales 2026-05-20 09:09:33 -05:00
Lizandro GuarnizoandCopilot 92a4272f53 feat(vcard): agregar login con email+password para obtener token automáticamente
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-19 20:45:09 -05:00
Lizandro GuarnizoandCopilot 45032dae3f feat(vcard): agregar login con email+password para obtener token automáticamente
- Nuevo endpoint POST /app/vcard-api/login que llama a /api/login del sistema VCard externo
- Modal de configuración con campos email+password y botón 'Obtener Token'
- El token se auto-rellena en el campo Bearer Token al conectar exitosamente
- Se mantiene la opción de pegar el token manualmente como fallback

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-19 20:44:40 -05:00
Lizandro GuarnizoandCopilot a23f77f1fd feat: integración VCard API como submódulo en Integraciones
- Nuevo modelo VcardApiConfig con helpers GetVcardApiConfig/UpsertVcardApiConfig
- Controlador con proxies GET y mutaciones POST/PUT hacia la API externa
- Vista Alpine.js con tabs (Usuarios/VCards/Planes/Pagos/Transacciones/Logs/MiniWebs)
- Seed idempotente en SeedIntegraciones() para registrar submódulo en sidebar
- AutoMigrate de VcardApiConfig en startup normal (main.go)
- Fix CreateUser: setea tipo_usuario='sistema' por defecto
- Fix AllUsersSistema: incluye usuarios con tipo_usuario vacío o NULL

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-19 20:35:27 -05:00
Lizandro Guarnizo 31259cbb71 feat: actualizar lógica de filtrado de usuarios y establecer tipo de usuario por defecto en creación 2026-05-19 20:26:25 -05:00
Lizandro Guarnizo 5024ae2dd3 up 2026-05-19 20:18:31 -05:00
Lizandro Guarnizo af1b8f4bdb feat: agregar configuración de integración para VCard API y actualizar seed de módulos 2026-05-19 20:16:34 -05:00
Lizandro Guarnizo f577054e66 feat: actualizar comentario de seed para incluir VCard API 2026-05-19 20:12:21 -05:00
Lizandro Guarnizo 24e1cf1439 feat: add VCard API integration with configuration and proxy endpoints
- Implemented VCard API controller with methods to manage configuration (save, get).
- Added proxy functions to handle API requests for users, vcards, memberships, payments, transactions, logs, and miniwebs.
- Included error handling and response formatting for API interactions.
2026-05-19 20:08:50 -05:00