Untitled
unknown
prisma
10 months ago
6.9 kB
3
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