The Medical Center API uses PostgreSQL with Prisma ORM. The database architecture implements a two-tier user system that separates internal staff (authenticated via Supabase) from public clients (unauthenticated).
Stores personal information for all internal staff members including admins, assistants, and doctors.
model Personas { id Int @id @default(autoincrement()) nombres String apellidos String telefono String? dni String? @unique foto_url String? created_at DateTime @default(now()) usuario Usuarios? medico Medicos? @@map("personas")}
The Personas model serves as the base table for all internal system users. A persona can be linked to either a Usuarios record (for authentication) or a Medicos record (for doctor-specific data).
Links Supabase authentication to internal personnel with role-based access control.
model Usuarios { id String @id // UUID from Supabase Auth persona_id Int @unique role rol_usuario created_at DateTime @default(now()) persona Personas @relation(fields: [persona_id], references: [id], onDelete: Cascade) @@map("usuarios")}
Doctor profiles linked to personas with specialty information.
model Medicos { id Int @id @default(autoincrement()) persona_id Int @unique especialidad_id Int email String @unique colegiatura String? activo Boolean @default(true) created_at DateTime @default(now()) persona Personas @relation(fields: [persona_id], references: [id], onDelete: Cascade) especialidad Especialidades @relation(fields: [especialidad_id], references: [id]) citas Citas[] @@map("medicos")}
Doctors do not authenticate directly. They are managed by admins and linked to personas, but they don’t have login credentials.
model Especialidades { id Int @id @default(autoincrement()) nombre String @unique descripcion String? created_at DateTime @default(now()) medicos Medicos[] @@map("especialidades")}
model Historial { id Int @id @default(autoincrement()) cita_id Int notas String? created_at DateTime @default(now()) cita Citas @relation(fields: [cita_id], references: [id], onDelete: Cascade) @@map("historial")}