generator client { provider = "prisma-client-js" binaryTargets = ["native", "linux-musl", "linux-musl-openssl-3.0.x"] } datasource db { provider = "postgresql" url = env("DATABASE_URL") } model User { id String @id @default(uuid()) name String email String @unique password String role UserRole @default(VISITOR) avatar String? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt bio String? location String? phone String? isSuspended Boolean @default(false) suspensionReason String? countryId String? resetToken String? @unique resetTokenExpiry DateTime? emailVerified Boolean @default(false) verificationToken String? @unique businesses Business? comments Comment[] conversations ConversationParticipant[] favorites Favorite[] sentMessages Message[] reports MessageReport[] ratings Rating[] country Country? @relation(fields: [countryId], references: [id]) } model Business { id String @id @default(uuid()) name String category String location String description String logoUrl String videoUrl String? contactEmail String contactPhone String? socialLinks Json? verified Boolean @default(false) viewCount Int @default(0) rating Float @default(0.0) ratingCount Int @default(0) tags String[] isFeatured Boolean @default(false) founderName String? founderImageUrl String? keyMetric String? ownerId String @unique createdAt DateTime @default(now()) updatedAt DateTime @updatedAt slug String? @unique isActive Boolean @default(false) showEmail Boolean @default(true) showPhone Boolean @default(true) showSocials Boolean @default(true) websiteUrl String? isSuspended Boolean @default(false) suspensionReason String? plan Plan @default(STARTER) city String? countryId String? coverUrl String? coverPosition String? @default("50% 50%") coverZoom Float? @default(1.0) suggestedCategory String? categoryId String? metaDescription String? metaTitle String? categoryRef BusinessCategory? @relation(fields: [categoryId], references: [id]) country Country? @relation(fields: [countryId], references: [id]) owner User @relation(fields: [ownerId], references: [id]) comments Comment[] conversations Conversation[] favorites Favorite[] homeSlides HomeSlide[] offers Offer[] ratings Rating[] } model BusinessCategory { id String @id @default(uuid()) name String @unique slug String @unique icon String? isActive Boolean @default(true) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt businesses Business[] } model Country { id String @id @default(uuid()) name String @unique code String @unique flag String? isActive Boolean @default(true) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt description String? businesses Business[] users User[] } model PricingPlan { id String @id @default(uuid()) tier Plan @unique name String priceXOF String priceEUR String description String features String[] offerLimit Int @default(1) recommended Boolean @default(false) color String @default("gray") updatedAt DateTime @updatedAt yearlyPriceEUR String? yearlyPriceXOF String? } model Offer { id String @id @default(uuid()) title String type OfferType price Float currency String @default("XOF") description String? imageUrl String active Boolean @default(true) businessId String createdAt DateTime @default(now()) updatedAt DateTime @updatedAt business Business @relation(fields: [businessId], references: [id], onDelete: Cascade) } model BlogPost { id String @id @default(uuid()) title String excerpt String content String author String date DateTime @default(now()) imageUrl String createdAt DateTime @default(now()) updatedAt DateTime @updatedAt metaDescription String? metaTitle String? slug String? @unique tags String[] @default([]) publishedAt DateTime @default(now()) status ContentStatus @default(PUBLISHED) coverPosition String? @default("50% 50%") coverZoom Float? @default(1.0) } model HomeSlide { id String @id @default(uuid()) type HomeSlideType @default(CUSTOM) businessId String? title String? subtitle String? imageUrl String? linkUrl String? order Int @default(0) isActive Boolean @default(true) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt coverPosition String? @default("50% 50%") coverZoom Float? @default(1.0) business Business? @relation(fields: [businessId], references: [id]) } model Interview { id String @id @default(uuid()) title String guestName String companyName String role String type InterviewType thumbnailUrl String videoUrl String? content String? excerpt String date DateTime @default(now()) duration String? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt metaDescription String? metaTitle String? slug String? @unique tags String[] @default([]) publishedAt DateTime @default(now()) status ContentStatus @default(PUBLISHED) coverPosition String? @default("50% 50%") coverZoom Float? @default(1.0) } model Comment { id String @id @default(uuid()) content String authorId String businessId String createdAt DateTime @default(now()) updatedAt DateTime @updatedAt author User @relation(fields: [authorId], references: [id], onDelete: Cascade) business Business @relation(fields: [businessId], references: [id], onDelete: Cascade) } model AnalyticsEvent { id String @id @default(uuid()) type String path String label String? value Float? metadata Json? createdAt DateTime @default(now()) browser String? city String? country String? device String? ip String? os String? referrer String? userId String? } model Rating { id String @id @default(uuid()) value Int userId String businessId String createdAt DateTime @default(now()) updatedAt DateTime @updatedAt comment String? reply String? replyAt DateTime? status RatingStatus @default(PENDING) business Business @relation(fields: [businessId], references: [id], onDelete: Cascade) user User @relation(fields: [userId], references: [id], onDelete: Cascade) @@unique([userId, businessId]) } 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 isArchived Boolean @default(false) conversation Conversation @relation(fields: [conversationId], references: [id], onDelete: Cascade) user User @relation(fields: [userId], references: [id], onDelete: Cascade) @@unique([userId, conversationId]) } model Message { id String @id @default(uuid()) content String senderId String conversationId String createdAt DateTime @default(now()) read Boolean @default(false) conversation Conversation @relation(fields: [conversationId], references: [id], onDelete: Cascade) sender User @relation(fields: [senderId], 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) } model SiteSetting { id String @id @default("singleton") siteName String @default("Afrohub") siteSlogan String @default("La plateforme de référence pour l'entrepreneuriat africain.") contactEmail String @default("support@afrohub.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 Afrohub. Tous droits réservés.") updatedAt DateTime @updatedAt homeBlogCount Int @default(3) homeBlogShow Boolean @default(true) homeBlogSubtitle String @default("Toutes les actualités de l'entrepreneuriat africain.") homeBlogTitle String @default("Derniers Articles") homeBlogCategories String[] @default([]) homeBlogIds String[] @default([]) homeBlogSelection String @default("latest") homeCategories String[] @default(["Technologie & IT", "Agriculture & Agrobusiness", "Mode & Textile", "Cosmétique & Beauté"]) resetPasswordSubject String @default("Réinitialisation de votre mot de passe - Afrohub") resetPasswordTemplate String @default("

{siteName}

Bonjour {name},

Vous avez demandé la réinitialisation de votre mot de passe. Cliquez sur le bouton ci-dessous pour choisir un nouveau mot de passe :

Réinitialiser mon mot de passe

Ce lien expirera dans 1 heure. Si vous n'avez pas demandé cette réinitialisation, vous pouvez ignorer cet email.


© 2025 {siteName}. Tous droits réservés.

") verifyEmailSubject String @default("Vérification de votre compte - Afrohub") verifyEmailTemplate String @default("

{siteName}

Bonjour {name},

Merci de vous être inscrit sur {siteName}. Pour finaliser la création de votre compte, merci de vérifier votre adresse email en cliquant sur le bouton ci-dessous :

Vérifier mon compte

Si vous n'avez pas créé de compte sur notre plateforme, vous pouvez ignorer cet email.


© 2025 {siteName}. Tous droits réservés.

") } model OneShotPlan { id String @id @default(uuid()) type OneShotType @unique name String priceXOF Int @default(0) priceEUR Int @default(0) description String? updatedAt DateTime @updatedAt } enum OneShotType { BUMP POST_EVENT POST_NEWS AD_DIRECTORY } model LegalDocument { id String @id @default(uuid()) type String @unique title String content String updatedAt DateTime @updatedAt } model Event { id String @id @default(uuid()) title String description String date DateTime location String thumbnailUrl String link String? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt metaDescription String? metaTitle String? slug String? @unique tags String[] @default([]) publishedAt DateTime @default(now()) status ContentStatus @default(PUBLISHED) coverPosition String? @default("50% 50%") coverZoom Float? @default(1.0) } model Favorite { id String @id @default(uuid()) userId String businessId String createdAt DateTime @default(now()) business Business @relation(fields: [businessId], references: [id], onDelete: Cascade) user User @relation(fields: [userId], references: [id], onDelete: Cascade) @@unique([userId, businessId]) } enum HomeSlideType { BUSINESS CUSTOM } enum ContentStatus { DRAFT PENDING PUBLISHED ARCHIVED } enum RatingStatus { PENDING APPROVED REJECTED } enum ReportStatus { PENDING RESOLVED DISMISSED } enum UserRole { VISITOR ENTREPRENEUR ADMIN } enum Plan { STARTER BOOSTER EMPIRE } enum OfferType { PRODUCT SERVICE } enum InterviewType { VIDEO ARTICLE }