generator client { provider = "prisma-client-js" } datasource db { provider = "postgresql" url = env("DATABASE_URL") } enum UserRole { VISITOR ENTREPRENEUR ADMIN } model User { id String @id @default(uuid()) name String email String @unique password String role UserRole @default(VISITOR) avatar String? phone String? bio String? @db.Text location String? isSuspended Boolean @default(false) suspensionReason String? businesses Business? comments Comment[] createdAt DateTime @default(now()) updatedAt DateTime @updatedAt // Messaging relations sentMessages Message[] conversations ConversationParticipant[] reports MessageReport[] } model Business { id String @id @default(uuid()) name String slug String? @unique category String location String description String @db.Text logoUrl String videoUrl String? // Contact & Social contactEmail String contactPhone String? websiteUrl String? // We use JSON to store social links (facebook, linkedin, instagram, website) socialLinks Json? // Privacy & Status showEmail Boolean @default(true) showPhone Boolean @default(true) showSocials Boolean @default(true) isActive Boolean @default(false) // Stats verified Boolean @default(false) viewCount Int @default(0) rating Float @default(0.0) tags String[] isSuspended Boolean @default(false) suspensionReason String? // Entrepreneur of the Month fields isFeatured Boolean @default(false) founderName String? founderImageUrl String? keyMetric String? // Relations ownerId String @unique owner User @relation(fields: [ownerId], references: [id]) offers Offer[] comments Comment[] conversations Conversation[] createdAt DateTime @default(now()) updatedAt DateTime @updatedAt } enum OfferType { PRODUCT SERVICE } model Offer { id String @id @default(uuid()) title String type OfferType price Float currency String @default("XOF") // EUR or XOF description String? @db.Text imageUrl String active Boolean @default(true) // Relations businessId String business Business @relation(fields: [businessId], references: [id], onDelete: Cascade) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt } model BlogPost { id String @id @default(uuid()) title String excerpt String @db.Text content String @db.Text author String date DateTime @default(now()) imageUrl String createdAt DateTime @default(now()) updatedAt DateTime @updatedAt } enum InterviewType { VIDEO ARTICLE } model SiteSetting { id String @id @default("singleton") siteName String @default("Afropreunariat") siteSlogan String @default("La plateforme de référence pour l'entrepreneuriat africain.") contactEmail String @default("support@afropreunariat.com") contactPhone String? @default("+225 00 00 00 00 00") address String? @default("Abidjan, Côte d'Ivoire") facebookUrl String? twitterUrl String? instagramUrl String? linkedinUrl String? footerText String? @default("© 2025 Afropreunariat. Tous droits réservés.") updatedAt DateTime @updatedAt } model Interview { id String @id @default(uuid()) title String guestName String companyName String role String type InterviewType thumbnailUrl String videoUrl String? content String? @db.Text excerpt String @db.Text date DateTime @default(now()) duration String? // "15 min" ou "5 min de lecture" createdAt DateTime @default(now()) updatedAt DateTime @updatedAt } model Comment { id String @id @default(uuid()) content String @db.Text // Relations authorId String author User @relation(fields: [authorId], references: [id], onDelete: Cascade) businessId String business Business @relation(fields: [businessId], references: [id], onDelete: Cascade) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt } model AnalyticsEvent { id String @id @default(uuid()) type String // PAGE_VIEW, CLICK, DWELL_TIME path String label String? // For clicks (button text, link name) value Float? // For dwell time (seconds) metadata Json? // Browser, OS, etc. createdAt DateTime @default(now()) } model Conversation { id String @id @default(uuid()) businessId String createdAt DateTime @default(now()) updatedAt DateTime @updatedAt business Business @relation(fields: [businessId], references: [id], onDelete: Cascade) participants ConversationParticipant[] messages Message[] } model ConversationParticipant { id String @id @default(uuid()) userId String conversationId String user User @relation(fields: [userId], references: [id], onDelete: Cascade) conversation Conversation @relation(fields: [conversationId], references: [id], onDelete: Cascade) isArchived Boolean @default(false) @@unique([userId, conversationId]) } model Message { id String @id @default(uuid()) content String @db.Text senderId String conversationId String createdAt DateTime @default(now()) read Boolean @default(false) sender User @relation(fields: [senderId], references: [id], onDelete: Cascade) conversation Conversation @relation(fields: [conversationId], references: [id], onDelete: Cascade) reports MessageReport[] } model MessageReport { id String @id @default(uuid()) reason String? messageId String reporterId String status ReportStatus @default(PENDING) createdAt DateTime @default(now()) message Message @relation(fields: [messageId], references: [id], onDelete: Cascade) reporter User @relation(fields: [reporterId], references: [id], onDelete: Cascade) } enum ReportStatus { PENDING RESOLVED DISMISSED }