02 — Estructura de carpetas¶
Vista de alto nivel¶
chatbot-v3-workspace/
├── backend_django/ ← Backend único (Django 4.2 + DRF + JWT + Stripe)
├── apps/
│ ├── dashboard/ ← Frontend cliente (React + Vite + Tailwind)
│ └── superadmin/ ← Frontend superadmin (React + Vite + Tailwind)
├── static/
│ └── v3/ ← Widget embebible (loader + frame + bundle dist/)
├── infra/ ← Configs de referencia (NO usar tal cual; ver .saas-docs/infra)
├── test/ ← Suite de smoke tests (pytest + curl)
├── .saas-docs/ ← Este manual
├── .env.example ← Plantilla de variables de entorno
├── .env ← (Real, NO commitear) creado por el operador
└── .gitignore
backend_django/¶
backend_django/
├── manage.py ← Entry point Django
├── requirements.txt ← Deps Python (~15 paquetes, todos pinned)
├── pytest.ini ← Config de tests
├── conftest.py ← Fixtures globales pytest
├── venv/ ← Virtualenv (NO commitear)
├── media/ ← Uploads de usuario (logos, avatares)
├── staticfiles/ ← Output de `manage.py collectstatic`
│
├── blimx_admin/ ← Project root (settings, urls, wsgi)
│ ├── settings.py ← INSTALLED_APPS, MIDDLEWARE, DB, JWT, STRIPE, STATIC
│ ├── urls.py ← Routes de alto nivel: /api/, /api/auth/, /v3/, /admin/
│ ├── wsgi.py ← Entry de gunicorn
│ └── asgi.py ← (no se usa; no hay async)
│
├── api/ ← App principal de la API
│ ├── models.py ← Account, Bot, Plan, Subscription, KB, Invoice, etc.
│ ├── serializers.py ← DRF serializers
│ ├── views.py ← DashboardViewSet (orquesta /api/client/...)
│ ├── views_accounts.py ← Endpoints de Account (gestión de la cuenta)
│ ├── views_billing.py ← Stripe checkout, portal, plan switching
│ ├── views_bot_users.py ← Invitar usuarios a un bot, permisos
│ ├── views_bots_mixin.py ← CRUD de bots
│ ├── views_config_mixin.py ← Configuración del widget por bot
│ ├── views_faqs_mixin.py ← CRUD de FAQs y categorías
│ ├── views_onboarding.py ← Flow de onboarding (crear primer bot)
│ ├── views_plans.py ← GET /api/client/plans/ (listar planes)
│ ├── views_profiles.py ← Perfiles de bot (templates de configuración)
│ ├── views_saas_users.py ← Usuarios del SaaS (invitaciones, perfiles)
│ ├── views_stripe_webhook.py ← Webhook Stripe (firma + sincronización)
│ ├── views_superadmin.py ← Endpoints /api/sa/* (panel superadmin)
│ ├── widget/ ← Endpoints públicos del chatbot embebido
│ │ ├── views.py ← /v3/health, /v3/frontend/config, /v3/faq
│ │ ├── services.py ← Queries DB para el widget
│ │ ├── urls.py
│ │ └── README.md ← Doc específica de la sub-app
│ ├── services/ ← Lógica de negocio reutilizable
│ │ ├── plan_policy_engine.py ← Limits de plan (FAQs, idiomas, branding)
│ │ ├── invoice_service.py ← Generación de facturas PDF
│ │ └── ...
│ ├── stripe_utils.py ← Helpers para Stripe
│ ├── upload_validation.py ← Validación de logos/avatares
│ ├── middleware.py ← RequestId, BuildInfo, audit
│ ├── management/
│ │ └── commands/ ← `manage.py <comando>` custom
│ ├── migrations/ ← Migraciones Django
│ └── tests/ ← Unit + integration tests
│
├── authentication/ ← App de auth (separada para aislar)
│ ├── models.py ← SaasUser, AccountUser, PrelaunchCode
│ ├── jwt_auth.py ← Autenticación JWT custom (multi-realm)
│ ├── views.py ← register, login, refresh, password reset
│ ├── views_invitation_admin.py ← Invitar desde superadmin
│ ├── views_invitation_public.py ← Aceptar invitación
│ ├── permissions.py ← IsAccountOwner, IsBotMember, IsSaasUser
│ ├── serializers.py
│ ├── urls.py
│ └── tests.py
│
└── scripts/ ← Scripts auxiliares (seeders, migraciones manuales)
apps/dashboard/¶
Frontend cliente (lo que ve el comprador del SaaS y los usuarios que invita).
apps/dashboard/
├── package.json ← Deps npm (React 18, Vite 5, axios, i18next, lucide-react)
├── vite.config.ts
├── tailwind.config.ts
├── tsconfig.json
├── index.html ← Entry de Vite
├── public/ ← Assets estáticos copiados al build
└── src/
├── main.tsx ← React DOM render
├── ClientDashboardApp.tsx ← Router + providers
├── api/ ← Cliente HTTP (axios instances)
├── auth/ ← Context de auth, JWT manager
├── components/ ← Componentes compartidos
├── pages/ ← Páginas: OverviewPage, BotConfigurationPage, BillingPage, etc.
├── pages/bots/ ← Pages bajo /bots/<slug>/...
├── layouts/ ← DashboardLayout (sidebar + topbar)
├── hooks/ ← Custom hooks
├── i18n/ ← Setup i18next + locales JSON
│ └── locales/
│ ├── es.json
│ ├── en.json
│ ├── fr.json
│ ├── de.json
│ └── pt.json
├── lib/ ← Helpers (apiBase, formatters)
└── types/ ← TypeScript types compartidos
apps/superadmin/¶
Frontend de operación de la plataforma (lo usa el comprador del SaaS para administrar todos los Accounts).
apps/superadmin/
├── package.json
├── vite.config.ts
├── src/
│ ├── modules/superadmin/
│ │ ├── pages/ ← TenantsListPage, TenantDetailPage, PlansPage, etc.
│ │ └── api/ ← Cliente HTTP a /api/sa/*
│ ├── components/
│ └── i18n/locales/
static/v3/¶
Widget embebible que el cliente final pega en su web (<script src=".../blimx-v3-chatbot-loader.js">).
static/v3/
├── blimx-v3-chatbot-loader.js ← (Source) Lo que se incluye en la web del cliente
├── blimx-v3-chatbot-frame.html ← (Source) HTML del iframe
├── build.js ← Script de build con Vite (genera dist/)
├── package.json ← Deps de build (vite, terser)
├── vite.config.js
├── i18n/ ← Strings del widget (JSON por idioma)
├── css2/
│ └── main.css ← CSS source del widget
├── js2/ ← Source modular del widget
│ ├── chatbot.js ← Orquestador (entry para Vite)
│ ├── core/
│ │ ├── ApiService.js ← Llamadas a /v3/frontend/config y /v3/faq
│ │ ├── StateManager.js
│ │ ├── UIManager.js
│ │ ├── LanguageManager.js
│ │ └── Telemetry.js
│ └── components/
│ ├── Launcher.js ← Botón flotante
│ ├── Modal.js ← Contenedor del modal
│ ├── HeaderView.js
│ ├── NavbarView.js
│ └── FaqView.js ← Vista de FAQs (la única activa)
├── img/ ← Iconos del widget
└── dist/ ← Output del build (servido por nginx)
├── blimx-chatbot.min.js ← Bundle JS (~24 KB)
├── blimx-chatbot.min.css ← CSS minificado
└── blimx-v3-chatbot-frame.html ← Frame con paths relativos a /static/v3/dist/
Detalle completo del widget en 13-widget-embebido.md.
Carpetas que NO van en el zip de entrega¶
| Carpeta | Por qué excluirla |
|---|---|
backend_django/venv/ |
Cada servidor crea el suyo |
backend_django/staticfiles/ |
Output de collectstatic, se regenera |
backend_django/media/ |
Uploads de usuario, específicos del entorno |
backend_django/__pycache__/ |
Caché Python |
apps/*/node_modules/ |
npm install lo regenera |
apps/*/dist/ |
Output de npm run build, se regenera |
static/v3/node_modules/ |
Idem |
static/v3/dist/ |
Output de node build.js, se regenera |
.env |
Secretos del operador |
.saas-docs.bak.*/ |
Backups de iteraciones del manual |
Todas están en .gitignore. El zip de entrega se genera con git archive HEAD.