Visión General de Base de Datos
NappAI Fluency usa PostgreSQL 16 en Neon Serverless (us-east-1), gestionado con Prisma 6 como ORM.
Configuración de conexión
Section titled “Configuración de conexión”datasource db { provider = "postgresql" url = env("DATABASE_URL") // Con pooler (pgbouncer) para la app directUrl = env("DIRECT_URL") // Sin pooler — solo para migraciones}Grupos de modelos
Section titled “Grupos de modelos”| Grupo | Modelos principales | Propósito |
|---|---|---|
| Multi-tenancy | Organization, OrgPath, Invitation | Cuentas corporativas |
| Usuarios | User, OAuthAccount, RefreshToken | Auth y perfiles |
| Contenido | Path, Module, ModuleLesson, Lesson | Curriculum |
| Aprendizaje | Enrollment, Progress, Bookmark | Seguimiento |
| Evaluación | Quiz, QuizQuestion, QuizAttempt, QuizAnswer | Tests y notas |
| Certificados | CertificateTemplate, Certificate | Diplomas SHA-256 |
| IA | AICredential, AIRouteConfig, AIUsageMetric, AIAlert, TutorConversation, TutorMessage | Motor IA |
| Creator Program | CreatorProfile, InstructorApplication, PathReview, CreatorReview, CreatorBadgeDefinition | Instructores |
| Recursos | Resource, ResourceAttachment | Materiales educativos |
| Misc | FluencyTestResult, DemoRequest | Diagnóstico y B2B |
Enums del dominio
Section titled “Enums del dominio”enum UserRole { FREE | STARTER | PRO | ELITE CORPORATE_USER | CORPORATE_ADMIN CONTENT_ADMIN | SUPER_ADMIN}
enum AccessLevel { PUBLIC | FREE_REGISTERED | PAID_STARTER PAID_PRO | PAID_ELITE | CORPORATE}
enum OrgPlan { TEAM | BUSINESS | ENTERPRISE }enum ProgressStatus { NOT_STARTED | IN_PROGRESS | COMPLETED }enum CertType { DIAGNOSTIC_BADGE | MODULE_BADGE | PATH_CERTIFICATE | SPECIALIZATION_CERTIFICATE | CORPORATE_CERTIFICATE }enum QuizQuestionType { MULTIPLE_CHOICE | TRUE_FALSE | OPEN_ENDED }enum LessonContentType { MARKDOWN | VIDEO | H5P | MIXED }enum ApplicationStatus { PENDING | IN_REVIEW | APPROVED | REJECTED | WITHDRAWN }enum ResourceType { PDF | DOCX | PPTX | XLSX | IMAGE | YOUTUBE | H5P | LINK }Reglas de acceso a BD
Section titled “Reglas de acceso a BD”- NUNCA queries raw salvo analytics complejos (con comentario justificativo)
- Toda query pasa por el
PrismaServicedel módulo correspondiente - Queries corporativas DEBEN filtrar por
organizationId(middleware de multi-tenancy) - Los certificados generan su hash SHA-256 en el backend — nunca en el cliente
Diagrama de entidades principal
Section titled “Diagrama de entidades principal”erDiagram Organization ||--o{ User : "members" Organization ||--o{ OrgPath : "orgPaths" Organization ||--o{ Invitation : "invitations"
User ||--o{ Enrollment : "enrollments" User ||--o{ Progress : "progress" User ||--o{ Certificate : "certificates" User ||--o{ QuizAttempt : "quizAttempts" User ||--o{ TutorMessage : "tutorMessages" User ||--o| CreatorProfile : "creatorProfile"
Path ||--o{ Module : "modules" Path ||--o{ Enrollment : "enrollments" Path ||--o| CertificateTemplate : "certificate" Path ||--o| Quiz : "quiz"
Module ||--o{ ModuleLesson : "moduleLessons" Module ||--o| Quiz : "quiz"
ModuleLesson }o--|| Lesson : "lesson"
Lesson ||--o{ Progress : "progress" Lesson ||--o{ ResourceAttachment : "attachments"
Quiz ||--o{ QuizQuestion : "questions" Quiz ||--o{ QuizAttempt : "attempts"
CertificateTemplate ||--o{ Certificate : "certificates"