Modelo de datos y permisos
Documento de proyecto
project.ts define ProjectSnapshot versión 2: id, ownerUid, activePageId, document, revisiones local/remota y datos de publicación (publishedSlug, slug deseado y revisiones publicadas). ProjectDocument agrupa páginas, secciones de cabecera, tema, metadatos, configuración del editor y, opcionalmente, tienda y embudos. builder.ts define páginas, secciones y elementos del lienzo, con geometría principal y variantes móvil/tableta.
snapshot.ts centraliza creación, migración, clonación y validaciones de estructura/tamaño. Guardar no es una colección de mutaciones aisladas por elemento: el repositorio maneja instantáneas del proyecto y revisiones optimistas.
Almacenamiento
| Ruta o medio | Contenido y acceso previsto |
|---|---|
localStorage, nexus:v2:{uid}:{id} |
Copia local del snapshot; sufijo :previous para recuperación e índice por usuario. localRepository.ts. |
users/{uid} |
Perfil del usuario. AuthContext.tsx. |
users/{uid}/projects/{projectId} |
Borrador y revisiones. firestoreRepository.ts. |
users/{uid}/projects/{projectId}/store_orders/{orderId} |
Pedidos vinculados al proyecto. StoreContext.tsx; también contiene lectura de productos antiguos para migración. |
users/{uid}/project_revisions/... |
Historial escrito por servidor; las reglas excluyen su escritura cliente. |
published_sites/{slug} |
Copia pública de páginas, tema, metadatos y datos opcionales de tienda/embudos, con propietario, proyecto y revisiones. publish.ts. |
domain_mappings/{domain} |
Resolución de dominio a slug. publishedSites.ts. |
admin_sites/{ownerUid}~{projectId} |
Control administrativo usado al publicar y servir. model.ts, publication.ts. |
site_access/{ownerUid}~{projectId}/members/{uid} |
Roles de colaboración consultados en servicios. service.ts. |
form_sites/{projectId}/forms/{formId}/submissions/{submissionId} |
Formularios y respuestas; firestore.rules, forms-service.ts. |
course_sites/{projectId} y subcolecciones courses, lessons, invites, members, requests |
Catálogo y acceso a cursos; firestore.rules, service.ts. Las lecciones cuelgan de cada curso. |
Este mapa reúne los agregados principales; no pretende enumerar todas las colecciones internas de OAuth, facturación o auditoría. Sus repositorios y servicios son la fuente de verdad.
Fronteras de permisos
firestore.rules deniega por defecto y habilita acceso del propietario a users/{uid} y sus subcolecciones, con la excepción de escritura de revisiones. Los sitios publicados pueden leerse públicamente si el control administrativo permite la publicación; el propietario conserva lectura. Las reglas también permiten al propietario crear/actualizar/eliminar publicaciones bajo condiciones. Por tanto, que la interfaz publique mediante servidor no implica que las reglas obliguen todas las publicaciones a atravesar /api/publish.
Los dominios son legibles públicamente. Los formularios publicados aceptan creación de respuestas con claves, tipos, número de respuestas y fecha restringidos; lectura y borrado corresponden al propietario. Esto no demuestra controles de abuso o cuotas externos. Los títulos de cursos publicados son legibles, mientras que las lecciones exigen propiedad, invitación válida por correo verificado o membresía activa con acceso al curso.
Los servicios Admin eluden estas reglas y deben validar sus propios permisos. La amplia escritura del propietario bajo su árbol no equivale a validación exhaustiva del esquema por reglas. La sincronización por revisiones y los validadores de aplicación deben mantenerse coherentes entre cliente y servidor.
