Untitled

 avatar
unknown
prisma
3 months ago
6.9 kB
2
Indexable
// Définition du générateur Prisma
generator client {
  provider = "prisma-client-js" // Génère le client Prisma pour TypeScript/JavaScript
}

// Configuration de la source de données (PostgreSQL)
datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}

// Modèle Utilisateur
model User {
  id                String                 @id @default(uuid()) // Identifiant unique
  email             String                 @unique              // Email unique pour l'authentification
  passwordHash      String                                     // Mot de passe hashé
  firstName         String?                                    // Prénom (optionnel)
  lastName          String?                                    // Nom (optionnel)
  avatarUrl         String?                                    // URL de l'avatar (optionnel)
  createdAt         DateTime               @default(now())      // Date de création du compte

  // Relations
  collections       Collection[]           // Collections créées par l'utilisateur
  opinions          UserOpinion[]          // Opinions données par l'utilisateur
  managedCollections CollectionManager[]   // Collections gérées par l'utilisateur

  @@index([email]) // Index sur l'email pour optimiser les requêtes
}

// Modèle Collection
model Collection {
  id               String                      @id @default(uuid()) // Identifiant unique
  title            String                                          // Titre de la collection
  description      String                                          // Description de la collection
  isPublic         Boolean             @default(false)           // Visibilité publique (false par défaut)
  createdAt        DateTime            @default(now())           // Date de création

  // Relations
  owner            User                  @relation(fields: [ownerId], references: [id]) // Propriétaire de la collection
  ownerId          String
  elements         Element[]                                        // Liste des éléments dans la collection
  opinionConfigs   CollectionOpinionConfig[]                      // Configuration des types d'opinions
  managers         CollectionManager[]                            // Gestion des droits d'accès

  @@index([title]) // Index sur le titre pour faciliter la recherche
}

// Modèle Élément
model Element {
  id              String                @id @default(uuid()) // Identifiant unique
  title           String                                         // Titre de l'élément
  description     String                                         // Description de l'élément
  images          String[]                                       // Tableau d'URLs pour les images
  createdAt       DateTime              @default(now())         // Date de création

  // Relations
  collection      Collection            @relation(fields: [collectionId], references: [id]) // Collection associée
  collectionId    String
  author          User                  @relation(fields: [authorId], references: [id])     // Auteur de l'élément
  authorId        String
  metadata        Metadata[]                                     // Métadonnées associées à l'élément
  opinions        UserOpinion[]                                  // Opinions reçues sur l'élément

  @@index([title]) // Index sur le titre pour optimiser les recherches
}

// Modèle Métadonnées
model Metadata {
  id         String         @id @default(uuid()) // Identifiant unique
  element    Element        @relation(fields: [elementId], references: [id]) // Élément parent
  elementId  String
  type       MetadataType                             // Type de métadonnée (enum)
  data       Json                                     // Données structurées au format JSON
  schema     String?                                  // Schéma optionnel pour la validation des données

  @@index([type]) // Index sur le type pour améliorer les performances des recherches
}

// Enumération pour les Types de Métadonnées
enum MetadataType {
  ADDRESS       // Adresse physique
  OPENING_HOURS // Horaires d'ouverture
  NUTRITION     // Informations nutritionnelles
  CUSTOM        // Métadonnées personnalisées
}

// Modèle Opinion Utilisateur
model UserOpinion {
  id         String    @id @default(uuid()) // Identifiant unique
  user       User      @relation(fields: [userId], references: [id]) // Utilisateur ayant donné l'opinion
  userId     String
  element    Element   @relation(fields: [elementId], references: [id]) // Élément concerné
  elementId  String
  type       String                                    // Type d'opinion (ex. "like", "dislike", "je ne connais pas")
  weight     Float     @default(1.0)                   // Poids du vote (identique pour tous les utilisateurs, modulé via le type d'opinion)
  createdAt  DateTime  @default(now())                 // Date de l'opinion

  // Optionnel : référence à la configuration d'opinion spécifique à la collection
  config     CollectionOpinionConfig? @relation(fields: [configId], references: [id])
  configId   String?

  @@unique([userId, elementId]) // Une seule opinion par utilisateur et par élément
  @@index([elementId, type])    // Optimisation pour les recherches par élément et type
  @@index([userId, createdAt])  // Historique des swipes par utilisateur
}

// Modèle Configuration des Opinions d'une Collection
model CollectionOpinionConfig {
  id            String      @id @default(uuid()) // Identifiant unique
  collection    Collection  @relation(fields: [collectionId], references: [id]) // Collection associée
  collectionId  String
  type          String      // Code interne du type d'opinion (ex. "like", "dislike", etc.)
  label         String      // Libellé affiché (ex. "J'aime", "Je n'aime pas")
  color         String      // Couleur associée au type d'opinion (ex. "#FF6B6B")
  defaultWeight Float       @default(1.0) // Poids par défaut du type d'opinion

  @@unique([collectionId, type]) // Un type d'opinion unique par collection
}

// Modèle Gestionnaire de Collection
model CollectionManager {
  user         User        @relation(fields: [userId], references: [id]) // Utilisateur gérant la collection
  userId       String
  collection   Collection  @relation(fields: [collectionId], references: [id]) // Collection concernée
  collectionId String
  role         Role        @default(EDITOR) // Rôle attribué (par défaut EDITOR)

  @@id([userId, collectionId]) // Clé primaire composée
}

// Enumération des Rôles
enum Role {
  OWNER  // Propriétaire (accès complet)
  EDITOR // Éditeur (accès pour modification)
  VIEWER // Lecteur (accès en lecture seule)
}
Editor is loading...
Leave a Comment