synchronisation du contenu avec la DB et amélioration du CMS

- Migration du blog et des interviews des données mockées vers PostgreSQL (Prisma).
- Refonte des pages publiques en Server Components pour de meilleures performances/SEO.
- Intégration d'un éditeur de texte riche (React Quill) avec titres H1-H6 et séparateurs.
- Correction des erreurs de validation Prisma liées aux paramètres asynchrones (Next.js 15+).
- Correction des problèmes d'affichage des modales de suspension via React Portals.
- Installation de @tailwindcss/typography et correction du débordement de texte (break-words).
- Implémentation des actions de modération (suspension/révocation) pour les utilisateurs et boutiques.
This commit is contained in:
2026-04-12 18:59:20 +02:00
parent b73939d381
commit 887030ee47
84 changed files with 5577 additions and 15128 deletions

View File

@@ -19,11 +19,21 @@ model User {
password String
role UserRole @default(VISITOR)
avatar String?
phone String?
bio String? @db.Text
location String?
isSuspended Boolean @default(false)
suspensionReason String?
businesses Business[]
businesses Business?
comments Comment[]
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
// Messaging relations
sentMessages Message[]
conversations ConversationParticipant[]
reports MessageReport[]
}
model Business {
@@ -39,14 +49,23 @@ model Business {
// 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)
@@ -59,6 +78,7 @@ model Business {
owner User @relation(fields: [ownerId], references: [id])
offers Offer[]
comments Comment[]
conversations Conversation[]
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@ -146,3 +166,57 @@ model AnalyticsEvent {
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
}