Eliminar README.md
This commit is contained in:
@@ -1,184 +0,0 @@
|
||||
# Cruces GLM
|
||||
|
||||
Aplicación interna de GomezLee Marketing para centralizar los cruces administrativos.
|
||||
|
||||
## Arquitectura
|
||||
|
||||
- React 19 + Vite + TanStack Router.
|
||||
- Supabase Auth con Google.
|
||||
- Supabase como **fuente de verdad** de usuarios, permisos, formularios y métricas.
|
||||
- RPCs de Supabase para todas las lecturas/mutaciones sensibles.
|
||||
- n8n para los formularios de cruces y el botón **Reportar**.
|
||||
|
||||
## Desarrollo local
|
||||
|
||||
Requisitos: Node.js 22+ y npm.
|
||||
|
||||
```bash
|
||||
npm install
|
||||
npm run dev
|
||||
```
|
||||
|
||||
La app usa el subpath `/cruces-glm/`.
|
||||
|
||||
## Build
|
||||
|
||||
```bash
|
||||
npm run build
|
||||
```
|
||||
|
||||
La salida se genera en `dist/`.
|
||||
|
||||
## Variables de entorno
|
||||
|
||||
```env
|
||||
VITE_SUPABASE_URL="https://dbit.digitalcompass.agency"
|
||||
VITE_SUPABASE_ANON_KEY="YOUR_SUPABASE_ANON_KEY"
|
||||
VITE_REPORT_WEBHOOK_URL="https://TU-N8N/webhook/cruces-glm-reportar"
|
||||
VITE_DEMO_AUTH="false"
|
||||
```
|
||||
|
||||
### Google + Supabase real
|
||||
|
||||
La versión final viene con `VITE_DEMO_AUTH="false"`, por lo que **Continuar con Google** usa directamente Supabase Auth y Google OAuth. El modo demostrativo queda únicamente como opción de emergencia si se cambia explícitamente la variable a `true`.
|
||||
|
||||
No existe una allowlist de correos dentro del frontend. Después de autenticarse, Cruces GLM consulta la RPC `cruces_glm_get_my_access()` y Supabase decide si el usuario puede entrar y si puede administrar formularios.
|
||||
|
||||
Para el despliegue bajo `/cruces-glm/`, la URL de retorno de la app es:
|
||||
|
||||
```text
|
||||
https://digitalcompass.agency/cruces-glm/
|
||||
```
|
||||
|
||||
En desarrollo local se usa:
|
||||
|
||||
```text
|
||||
http://localhost:5173/cruces-glm/
|
||||
```
|
||||
|
||||
Ambas deben estar autorizadas en la configuración de redirects de Supabase Auth cuando quieras usar ambos entornos. El callback del proveedor Google hacia Supabase continúa siendo:
|
||||
|
||||
```text
|
||||
https://dbit.digitalcompass.agency/auth/v1/callback
|
||||
```
|
||||
|
||||
## Supabase
|
||||
|
||||
Ejecuta una vez en SQL Editor:
|
||||
|
||||
```text
|
||||
supabase/Cruces_GLM_Supabase_Completo.sql
|
||||
```
|
||||
|
||||
El script deja creados:
|
||||
|
||||
- `cruces_glm_permissions`: acceso a la app y permiso de administración.
|
||||
- `cruces_glm_forms`: todos los cruces/formularios del Hub.
|
||||
- `cruces_glm_metrics_summary`: totales globales.
|
||||
- `cruces_glm_form_metrics`: métricas por cruce.
|
||||
- `cruces_glm_user_metrics`: métricas por usuario.
|
||||
- `cruces_glm_metric_events`: historial de login/creación/apertura.
|
||||
- RPCs para login, formularios, permisos y consultas de métricas.
|
||||
|
||||
Las tablas no necesitan acceso directo desde el navegador; el frontend trabaja mediante RPCs protegidas.
|
||||
|
||||
## Administración del login desde Supabase
|
||||
|
||||
Los correos autorizados están en `public.cruces_glm_permissions`.
|
||||
|
||||
Campos principales:
|
||||
|
||||
- `is_allowed = true`: puede entrar a Cruces GLM.
|
||||
- `is_allowed = false`: no puede entrar.
|
||||
- `can_manage_forms = true`: ve **Agregar formulario**, Editar y Eliminar.
|
||||
- `can_manage_forms = false`: usa los cruces, pero no administra el catálogo.
|
||||
|
||||
### Quitar acceso a una persona
|
||||
|
||||
```sql
|
||||
update public.cruces_glm_permissions
|
||||
set is_allowed = false
|
||||
where email = 'correo@gomezleemarketing.com';
|
||||
```
|
||||
|
||||
### Volver a darle acceso
|
||||
|
||||
```sql
|
||||
update public.cruces_glm_permissions
|
||||
set is_allowed = true
|
||||
where email = 'correo@gomezleemarketing.com';
|
||||
```
|
||||
|
||||
### Dar permiso para administrar formularios
|
||||
|
||||
```sql
|
||||
update public.cruces_glm_permissions
|
||||
set can_manage_forms = true
|
||||
where email = 'correo@gomezleemarketing.com';
|
||||
```
|
||||
|
||||
## Formularios en Supabase
|
||||
|
||||
En login real, `public.cruces_glm_forms` es la única fuente de verdad de los cruces. Crear, editar, activar/desactivar y eliminar se ejecuta mediante RPCs:
|
||||
|
||||
- `cruces_glm_get_forms()`
|
||||
- `cruces_glm_get_form(p_form_id)`
|
||||
- `cruces_glm_save_form(...)`
|
||||
- `cruces_glm_delete_form(p_form_id)`
|
||||
- `cruces_glm_record_form_open(p_form_id)`
|
||||
|
||||
### Migración automática del localStorage anterior
|
||||
|
||||
La aplicación conserva una migración de una sola ejecución para evitar perder los formularios que ya hayas creado durante las pruebas.
|
||||
|
||||
En el **primer inicio de sesión real de un usuario con `can_manage_forms = true`**:
|
||||
|
||||
1. La app consulta Supabase.
|
||||
2. Si `cruces_glm_forms` todavía está vacío, revisa el antiguo `localStorage` (`glm-hub-formularios-v1`).
|
||||
3. Si encuentra formularios, los guarda en Supabase mediante `cruces_glm_save_form()`.
|
||||
4. Marca esa migración como completada para no volver a importar elementos eliminados posteriormente.
|
||||
|
||||
En modo real, después de esa migración, crear/editar/eliminar formularios **ya no escribe la configuración de los cruces en localStorage**. Solo favoritos y usados recientemente permanecen como preferencias locales del navegador.
|
||||
|
||||
> Si los formularios actuales existen únicamente en un navegador/origen específico (por ejemplo `localhost:5173`), haz el primer login real desde ese mismo navegador/origen antes de limpiar sus datos para que la migración pueda leerlos.
|
||||
|
||||
## RPCs de métricas
|
||||
|
||||
Para un futuro dashboard administrativo quedan listas:
|
||||
|
||||
- `cruces_glm_get_metrics_summary()`
|
||||
- `cruces_glm_get_form_metrics()`
|
||||
- `cruces_glm_get_user_metrics()`
|
||||
- `cruces_glm_get_recent_events(p_limit)`
|
||||
|
||||
Solo usuarios con `can_manage_forms = true` pueden ejecutar esas consultas.
|
||||
|
||||
También quedan preparadas para una futura pantalla de accesos:
|
||||
|
||||
- `cruces_glm_admin_get_access_list()`
|
||||
- `cruces_glm_admin_save_access(...)`
|
||||
|
||||
## Métricas guardadas
|
||||
|
||||
Supabase registra:
|
||||
|
||||
- Total histórico de formularios colocados.
|
||||
- Total de formularios abiertos.
|
||||
- Total de logueos.
|
||||
- Aperturas por formulario.
|
||||
- Logueos y aperturas por usuario.
|
||||
- Eventos detallados de login, creación y apertura.
|
||||
|
||||
Una edición no vuelve a incrementar `total_formularios_colocados`; solamente una creación nueva.
|
||||
|
||||
## Reportes de usuario
|
||||
|
||||
Importa `Cruces_GLM_Reporte_Usuario_n8n.json`, selecciona la credencial Gmail correspondiente y coloca la Production URL del webhook en `VITE_REPORT_WEBHOOK_URL` antes del build de producción.
|
||||
|
||||
## Sesión y navegación en producción
|
||||
|
||||
- La sesión de Supabase se renueva automáticamente antes de que expire.
|
||||
- Cada RPC comprueba que el access token siga vigente; si Supabase responde `JWT expired`, la app renueva el token y repite esa RPC una sola vez.
|
||||
- Al volver a una pestaña que estuvo en segundo plano, la sesión se valida de inmediato.
|
||||
- Un clic normal en **Abrir** mantiene la vista integrada dentro de Cruces GLM.
|
||||
- `Ctrl+click` / `Cmd+click` (y abrir el enlace en otra pestaña desde el navegador) usa directamente la URL real del formulario n8n, evitando rutas SPA que un servidor estático podría responder con 404.
|
||||
Reference in New Issue
Block a user