Skip to Content
📚 Bienvenido a la documentación técnica de Rial AI 👋
Database🗂️ Esquema de Base de Datos

🗂️ Esquema de Base de Datos

La base de datos de Rial AI está modelada de manera relacional en PostgreSQL y representa las relaciones entre compañías, marcas, usuarios, prendas, proyectos de generación, imágenes, modelos virtuales, publicaciones y control de créditos.

📊 Estructura General

Todos los modelos en nuestra base de datos siguen un patrón consistente que incluye:

  • id: Identificador incremental para uso interno del desarrollador
  • publicId: UUID (identificador único) que se puede compartir con el usuario y frontend de forma segura
  • createdAt: Timestamp de creación del registro
  • updatedAt: Timestamp de última actualización

¿Por qué dos IDs? El id interno es secuencial y optimizado para consultas de base de datos, mientras que el publicId es un UUID que no revela información sobre la cantidad de registros y es seguro para exponer públicamente.


🏢 Modelos de Organización

Company (Compañía)

Representa a una empresa que puede tener múltiples marcas. Las empresas pueden operar con o sin sistema de créditos.

model Company { id Int @id @default(autoincrement()) publicId String @unique @default(uuid()) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt name String logo String credits Int? @default(0) brands Brand[] users User[] }

Campos Clave

  • name: Nombre de la compañía
  • logo: URL del logo corporativo
  • credits: Saldo actual de créditos (opcional, default: 0)
    • Nota: Por ahora no manejamos activamente el sistema de créditos

Relaciones

  • brands[]: Una compañía puede tener múltiples marcas
  • users[]: Una compañía puede tener múltiples usuarios

Brand (Marca)

Cada marca pertenece a una compañía y contiene sus propias prendas, proyectos, usuarios y modelos virtuales.

model Brand { id Int @id @default(autoincrement()) publicId String @unique @default(uuid()) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt name String logo String companyId Int company Company @relation(fields: [companyId], references: [id]) garments Garment[] projects Project[] users User[] models Model[] }

Campos Clave

  • name: Nombre de la marca
  • logo: URL del logo de la marca
  • companyId: Referencia a la compañía propietaria

Relaciones

  • company: Pertenece a una compañía
  • users[]: Usuarios asignados a la marca
  • garments[]: Prendas de la marca
  • projects[]: Proyectos de generación
  • models[]: Modelos virtuales personalizados

User (Usuario)

Representa a un miembro de la plataforma con diferentes niveles de acceso y permisos.

model User { id Int @id @default(autoincrement()) publicId String @unique @default(uuid()) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt email String @unique role UserRole @default(COMPANY_ADMIN) companyId Int? brandId Int? sessionId String @unique transactions CreditTransaction[] brand Brand? @relation(fields: [brandId], references: [id]) company Company? @relation(fields: [companyId], references: [id]) } enum UserRole { ADMIN COMPANY_ADMIN BRAND_ADMIN // no manejado actualmente }

Campos Clave

  • email: Email único del usuario (usado para autenticación)
  • role: Nivel de acceso del usuario
    • ADMIN: Acceso completo a toda la plataforma
    • COMPANY_ADMIN: Administrador de una compañía específica
    • BRAND_ADMIN: Administrador de una marca específica
  • sessionId: Identificador único de sesión para autenticación (relacionado con autentificación de supabase)
  • companyId: Referencia opcional a compañía (para COMPANY_ADMIN)
  • brandId: Referencia opcional a marca (para BRAND_ADMIN)

Relaciones

  • company?: Compañía asociada (opcional)
  • brand?: Marca asociada (opcional)
  • transactions[]: Transacciones de créditos del usuario

👕 Gestión de Prendas

Garment (Prenda)

Representa las prendas subidas por las marcas para ser utilizadas en los proyectos de generación.

model Garment { id Int @id @default(autoincrement()) publicId String @unique @default(uuid()) name String createdAt DateTime @default(now()) updatedAt DateTime @updatedAt season String? type GarmentType brandId Int? brand Brand? @relation(fields: [brandId], references: [id]) images GarmentImage[] projects ProjectImage[] @relation("ImageGarments") result GeneratedImage[] } enum GarmentType { TOP BOTTOM FOOTWEAR ACCESSORY FACESWAP }

Campos Clave

  • name: Nombre descriptivo de la prenda
  • type: Categoría de la prenda
    • TOP: Camisetas, blusas, chaquetas, etc.
    • BOTTOM: Pantalones, faldas, shorts, etc.
    • FOOTWEAR: Zapatos, botas, sandalias, etc.
    • ACCESSORY: Bolsos, joyas, sombreros, etc.
    • FACESWAP: Imágenes para reemplazo facial
  • season: Temporada asociada (opcional) - ej: “Verano 2024”, “Otoño/Invierno 2024”
  • brandId: Referencia a la marca propietaria

Relaciones

  • brand: Marca propietaria de la prenda
  • images[]: Imágenes asociadas a la prenda
  • projects[]: Proyectos donde se utiliza la prenda
  • results[]: Imágenes generadas usando esta prenda

GarmentImage (Imagen de Prenda)

Almacena las imágenes originales de las prendas subidas por las marcas.

model GarmentImage { id Int @id @default(autoincrement()) publicId String @unique @default(uuid()) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt url String garmentId Int garment Garment @relation(fields: [garmentId], references: [id]) }

Campos Clave

  • url: URL de la imagen almacenada en Google Cloud Storage
  • garmentId: Referencia a la prenda asociada

Relaciones

  • garment: Prenda a la que pertenece la imagen

🎯 Sistema de Proyectos

Project (Proyecto)

Un proyecto define un proceso de generación de imágenes con un tipo específico y configuraciones particulares.

model Project { id Int @id @default(autoincrement()) publicId String @unique @default(uuid()) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt name String projectType ProjectType status ProjectStatus @default(CREATING) options Json brandId Int season String? description String? images GeneratedImage[] brand Brand @relation(fields: [brandId], references: [id]) uploads ProjectImage[] } enum ProjectType { LIFESTYLE BATCH LOOKBOOK FACESWAP } enum ProjectStatus { CREATING IN_PROGRESS PENDING_APPROVAL IN_REVIEW APPROVED COMPLETED CANCELLED }

Campos Clave

  • name: Nombre descriptivo del proyecto
  • projectType: Tipo de generación
    • LIFESTYLE: Generación contextualizada con escenarios personalizados (en desarrollo)
    • BATCH: Generación masiva de prendas individuales
    • LOOKBOOK: Generación de conjuntos completos (en desarrollo)
    • FACESWAP: Reemplazo de rostros
  • status: Estado actual del proyecto
  • options: Configuración en JSON con parámetros específicos del tipo de proyecto
  • season: Temporada asociada (opcional)
  • description: Descripción detallada del proyecto

Relaciones

  • brand: Marca propietaria del proyecto
  • uploads[]: Imágenes de entrada del proyecto
  • images[]: Imágenes generadas en el proyecto

ProjectImage (Imagen de Proyecto)

Representa una entrada de generación dentro de un proyecto, es decir, una combinación específica de prendas con su configuración.

model ProjectImage { id Int @id @default(autoincrement()) publicId String @unique @default(uuid()) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt settings Json projectId Int images GeneratedImage[] project Project @relation(fields: [projectId], references: [id]) garments Garment[] @relation("ImageGarments") SKU String status ProjectImageStatus @default(IN_PROGRESS) } enum ProjectImageStatus { IN_PROGRESS PENDING_APPROVAL REJECTED APPROVED }

Campos Clave

  • settings: Configuración específica en JSON (pose, fondo, modelo, etc.)
  • SKU: Código de identificación del producto
  • status: Estado de aprobación de la imagen
  • projectId: Referencia al proyecto

Relaciones

  • project: Proyecto al que pertenece
  • garments[]: Prendas utilizadas en esta generación
  • images[]: Imágenes generadas para esta entrada

🖼️ Gestión de Imágenes

GeneratedImage (Imagen Generada)

Almacena las imágenes generadas por IA con sistema de versionado y aprobación.

model GeneratedImage { id Int @id @default(autoincrement()) publicId String @unique @default(uuid()) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt url String status ImageStatus @default(PENDING) reason String? uploadId Int projectId Int project Project @relation(fields: [projectId], references: [id]) upload ProjectImage @relation(fields: [uploadId], references: [id]) previous GeneratedImage? @relation("PreviousImages", fields: [previousId], references: [id]) previousId Int? @unique next GeneratedImage? @relation("PreviousImages") isFinal Boolean @default(true) garment Garment? @relation(fields: [garmentId], references: [id]) garmentId Int? } enum ImageStatus { PENDING PENDING_APPROVAL APPROVED REJECTED FAILED }

Campos Clave

  • url: URL de la imagen generada
  • status: Estado de la imagen en el flujo de aprobación
  • reason: Razón de rechazo (si aplica)
  • isFinal: Indica si es la versión final aprobada
  • previousId: Referencia a imagen anterior (para versionado)

Sistema de Versionado

Las imágenes pueden tener múltiples versiones. Cuando se solicita una mejora o corrección:

  1. Se crea una nueva GeneratedImage
  2. Se establece previousId apuntando a la versión anterior
  3. Solo la imagen final puede tener isFinal = true

Relaciones

  • project: Proyecto al que pertenece
  • upload: Entrada específica del proyecto
  • previous?: Versión anterior (para versionado)
  • next?: Versión siguiente (para versionado)
  • garment?: Prenda principal utilizada

👤 Modelos

Model (Modelo)

Representa los modelos del catálogo Rial, que pueden ser globales o específicos de una marca.

model Model { id Int @id @default(autoincrement()) publicId String @unique @default(uuid()) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt name String gender Gender age Int image String brandId Int? brand Brand? @relation(fields: [brandId], references: [id]) } enum Gender { MALE FEMALE OTHER }

Campos Clave

  • name: Nombre del modelo
  • gender: Género del modelo
  • age: Edad aproximada del modelo
  • image: URL de la imagen de referencia del modelo
  • brandId: Referencia a marca (opcional - si es null, es un modelo global)

Tipos de Modelos

  • Modelos Globales: brandId = null - Disponibles para todas las marcas
  • Modelos Personalizados: brandId != null - Exclusivos de una marca específica

Relaciones

  • brand?: Marca propietaria (opcional)

💳 Sistema de Créditos

Nota: Este sistema está definido en la base de datos pero aún no está implementado en la aplicación.

CreditTransaction (Transacción de Créditos)

Registra todas las compras y usos de créditos en el sistema.

model CreditTransaction { id Int @id @default(autoincrement()) publicId String @unique @default(uuid()) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt amount Int transactionType TransactionType userId Int user User @relation(fields: [userId], references: [id]) } enum TransactionType { PURCHASE USAGE }

Campos Clave

  • amount: Cantidad de créditos
  • transactionType: Tipo de transacción
    • PURCHASE: Compra de créditos
    • USAGE: Uso de créditos para generación
  • userId: Usuario que realizó la transacción

Relaciones

  • user: Usuario asociado a la transacción

📰 Gestión de Contenido

Post (Publicación)

Sistema de publicaciones y contenido de prensa para el sitio web y blog.

model Post { id Int @id @default(autoincrement()) publicId String @unique @default(uuid()) title String description String publicationDate DateTime? image String file String tags String[] type PostType isPublished Boolean @default(false) authorName String createdAt DateTime @default(now()) updatedAt DateTime @updatedAt } enum PostType { PUBLICATION PRESS }

Campos Clave

  • title: Título de la publicación
  • description: Contenido o descripción del post
  • publicationDate: Fecha de publicación programada
  • image: URL de imagen destacada
  • file: URL del archivo asociado
  • tags: Array de etiquetas para categorización
  • type: Tipo de publicación
    • PUBLICATION: Artículos del blog
    • PRESS: Notas de prensa
  • isPublished: Estado de publicación
  • authorName: Nombre del autor

🔗 Diagrama de Relaciones

El diagrama de relaciones se encuentra en el siguiente enlace: Diagrama de Relaciones .

Diagrama de Relaciones de la Base de Datos
Last updated on