Guia de implementacion en el proyecto NexUS (Django multitenant + React SSR). Usar cuando haya que crear o modificar backend, frontend SSR, rutas, componentes, integraciones frontend-backend, tenancy por dominio, auth JWT, Docker Compose dev/prod o documentacion tecnica del repo.
Resources
9Install
npx skillscat add ispp-g7-nexus/7-nexus Install via the SkillsCat registry.
NexUS Project Skill
1) Contexto del producto
NexUS es una plataforma SaaS B2B2C para residencias de estudiantes.
Objetivo: profesionalizar operativa, mejorar experiencia de convivencia y habilitar gestion multi-residencia.
Segun docs/competitive_analysis/7-DP-Competitive_Analysis.md, los cores diferenciales del producto son:
- IA para convivencia post-asignacion (seguimiento continuo, no solo matching inicial).
- Transparencia bidireccional de incidencias para residente y staff.
- Reserva de objetos comunes (no solo espacios).
- Analitica de clima social y bienestar.
- Control de invitados por QR.
- White-label profundo (dominio, marca, flujos).
- Gestion de comedor/menus con alergeno y logistica.
- Vista NexUS multi-residencia para grupos.
2) Stack y decisiones tecnicas
Basado en docs/stack-analysis/7-DP-stack-technology-analysis.md:
- Frontend: React + TypeScript + Vite SSR.
- Backend: Django + DRF + django-tenants.
- DB: PostgreSQL + pgvector.
- Asincronia: Redis + Celery.
- Infra local: Docker Compose.
- Entrada HTTP: Nginx (solo reverse proxy hacia frontend SSR).
Regla de tenancy:
- No hay una base de datos por tenant.
- Se usa una sola base PostgreSQL con aislamiento por esquemas (
django-tenants).
3) Arquitectura de carpetas
Raiz
backend/: API y logica multitenant.frontend/: app SSR React + Vite.nginx/: reverse proxy.docs/: documentacion de negocio y tecnica.docker-compose.yml: dev.docker-compose.prod.yml: prod.
Backend
backend/config/settings/base.py: apps, middleware, tenancy, redis, celery, jwt.backend/config/urls.py: rutas publicas de API.backend/apps/tenants/: modelosPlan,Client,Domain.backend/apps/residences/:Residence,ResidenceDomain,ResidenceBranding,Membership.backend/apps/common/: decorators, helpers redis/celery/jwt, vistas auth/context.backend/apps/tenants/management/commands/seed_demo.py: seed demo idempotente.
Frontend
frontend/server.ts: servidor SSR Express + Vite middleware + proxy API.frontend/src/entry-server.tsx: render SSR conStaticRouter.frontend/src/entry-client.tsx: hidratacion conBrowserRouter.frontend/src/providers/AppDataProvider.tsx: estado inicial SSR (tenantContext,userContext).frontend/src/server/: fetch interno server-side a backend.frontend/src/hooks/:useTenant,useUser.frontend/src/app/: app principal y vistas/pantallas reales.frontend/src/app/components/ui/: libreria de componentes UI.
4) Flujo frontend-backend-tenancy
Flujo request:
- Cliente entra por dominio a Nginx (
nginx/default.conf). - Nginx reenvia todo a
frontend:5173preservandoHost. frontend/server.ts:- resuelve host real (en dev usa
DEV_DEFAULT_HOSTpara localhost), - consulta backend interno (
INTERNAL_API_BASE_URL, por defectohttp://backend:8000), - inyecta bootstrap SSR (
__NEXUS_DATA__) con tenant + user.
- resuelve host real (en dev usa
- Backend Django:
TenantMainMiddlewareresuelve tenant portenants.Domain(schema public),ResidenceByDomainMiddlewareresuelve residencia porresidences.ResidenceDomainen el schema tenant.
- App hidrata en cliente y usa
/api/public/*y/api/auth/*proxificados por SSR server.
Endpoints base actuales:
GET /health/GET /api/public/tenant-context/GET /api/auth/me/POST /api/auth/login/POST /api/auth/logout/
5) Reglas para crear paginas SSR en este proyecto
No usar patrones de Next.js App Router ni React Server Components. Este proyecto usa SSR clasico con React Router.
Paso a paso para nueva pagina/ruta
- Crear componente de pagina en
frontend/src/app/components/...ofrontend/src/pages/.... - Registrar ruta en
frontend/src/app/App.tsx(o rutas anidadas enStudentView/AdminView). - Si necesita datos iniciales SSR:
- crear fetch en
frontend/src/server/*, - pasar datos por bootstrap (
AppDataProvider) o consumir via hooks existentes.
- crear fetch en
- Si necesita datos cliente:
- usar
fetcha rutas proxificadas (/api/...), no llamar backend directo desde navegador.
- usar
Restricciones SSR importantes
- No usar
window,document,localStoragedurante render inicial. - Mover acceso browser-only a
useEffect. - No renderizar
<Navigate>en primer render bajoStaticRouter. - Para redirecciones iniciales usar patron tipo
ClientRedirectconuseEffect+useNavigate.
6) Reglas para crear componentes React
Componentes presentacionales
- Sin fetch.
- Reciben props tipadas.
- Sin dependencias de router si no hace falta.
Componentes interactivos
- Usar
useState/useEffect. - Encapsular logica de datos en hooks (
useTenant,useUser, o hooks nuevos). - Mantener contratos tipados en
frontend/src/types.
Estilos y theming
- El theming por tenant/white-label se inyecta en
App.tsxcon CSS vars (--primary,--accent, etc.). - Componentes nuevos deben usar variables de tema cuando aplique.
7) Reglas backend para nuevas features
- Modelar en app de dominio (
tenants,residences, o nueva app). - Asegurar aislamiento por tenant:
- aplicar
tenant_requireden vistas tenant-aware. - usar
residence_access_requiredo validaciones deMembershippara permisos finos.
- aplicar
- Exponer endpoint en
backend/config/urls.py. - Mantener compatibilidad de payload con
frontend/src/types/*. - Comentar en espanol (convencion del proyecto).
Notas:
- Django admin no es canal funcional del producto.
- Auth actual es JWT por cookie HttpOnly y/o Authorization header.
8) Auth y roles
Login:
- Endpoint:
POST /api/auth/login/ - Payload:
{ email, password, portal }, dondeportalesstudentoadmin.
Roles en Membership:
portfolio_adminresidence_adminresident
El backend valida acceso por portal y residencia antes de emitir token.
9) Docker y entornos
Dev
- Archivo:
docker-compose.yml - Hot reload:
- backend por
runserver+ volumen./backend:/app - frontend por Vite SSR + polling/HMR
- backend por
- Seed demo automatico al arrancar backend (si
SEED_DEMO_ON_STARTUP=1).
Prod
- Archivo:
docker-compose.prod.yml - Backend con
gunicorny settings de produccion. - Frontend en
NODE_ENV=production(npm run build+npm run preview:ssr). - Seed demo desactivado por defecto.
10) Checklist antes de cerrar una tarea
- Verificar que no se rompe tenancy por dominio.
- Verificar que rutas SSR no usan
Navigateen primer render server. - Verificar consistencia de tipos frontend/backend.
- Verificar compose y arranque (
docker compose up -d) cuando la tarea lo requiera. - Actualizar docs si cambian flujos o contratos.
11) Referencias internas que debe consultar
docs/competitive_analysis/7-DP-Competitive_Analysis.mddocs/stack-analysis/7-DP-stack-technology-analysis.mddocs/sprint-development-plan/7-DP-Sprint_Development_Plan.mdbackend/config/settings/base.pybackend/apps/common/views.pybackend/apps/residences/middleware.pyfrontend/server.tsfrontend/src/entry-server.tsxfrontend/src/entry-client.tsxfrontend/src/app/App.tsx