Skip to content

Visión General de Base de Datos

NappAI Fluency usa PostgreSQL 16 en Neon Serverless (us-east-1), gestionado con Prisma 6 como ORM.

datasource db {
provider = "postgresql"
url = env("DATABASE_URL") // Con pooler (pgbouncer) para la app
directUrl = env("DIRECT_URL") // Sin pooler — solo para migraciones
}
GrupoModelos principalesPropósito
Multi-tenancyOrganization, OrgPath, InvitationCuentas corporativas
UsuariosUser, OAuthAccount, RefreshTokenAuth y perfiles
ContenidoPath, Module, ModuleLesson, LessonCurriculum
AprendizajeEnrollment, Progress, BookmarkSeguimiento
EvaluaciónQuiz, QuizQuestion, QuizAttempt, QuizAnswerTests y notas
CertificadosCertificateTemplate, CertificateDiplomas SHA-256
IAAICredential, AIRouteConfig, AIUsageMetric, AIAlert, TutorConversation, TutorMessageMotor IA
Creator ProgramCreatorProfile, InstructorApplication, PathReview, CreatorReview, CreatorBadgeDefinitionInstructores
RecursosResource, ResourceAttachmentMateriales educativos
MiscFluencyTestResult, DemoRequestDiagnóstico y B2B
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 }
  1. NUNCA queries raw salvo analytics complejos (con comentario justificativo)
  2. Toda query pasa por el PrismaService del módulo correspondiente
  3. Queries corporativas DEBEN filtrar por organizationId (middleware de multi-tenancy)
  4. Los certificados generan su hash SHA-256 en el backend — nunca en el cliente
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"