From ea9eaa4b8abb00db1c47d5a419a0dbe88509605e Mon Sep 17 00:00:00 2001 From: streaper2 Date: Mon, 11 May 2026 08:37:17 +0200 Subject: [PATCH] monorepo admin supp prisma --- admin/package.json | 4 +- admin/prisma/migrations/0_init/migration.sql | Bin 35984 -> 0 bytes .../20260427214502_init/migration.sql | 459 ------------------ .../migration.sql | 8 - .../migration.sql | 11 - admin/prisma/migrations/migration_lock.toml | 3 - admin/prisma/schema.prisma | 426 ---------------- package.json | 4 +- 8 files changed, 4 insertions(+), 911 deletions(-) delete mode 100644 admin/prisma/migrations/0_init/migration.sql delete mode 100644 admin/prisma/migrations/20260427214502_init/migration.sql delete mode 100644 admin/prisma/migrations/20260503171918_add_published_at/migration.sql delete mode 100644 admin/prisma/migrations/20260503172958_add_content_status/migration.sql delete mode 100644 admin/prisma/migrations/migration_lock.toml delete mode 100644 admin/prisma/schema.prisma diff --git a/admin/package.json b/admin/package.json index 05e45ad..226abcf 100644 --- a/admin/package.json +++ b/admin/package.json @@ -4,7 +4,7 @@ "private": true, "scripts": { "dev": "next dev", - "build": "prisma generate && next build", + "build": "prisma generate --schema=../prisma/schema.prisma && next build", "start": "next start -p 3000", "lint": "eslint" }, @@ -43,4 +43,4 @@ "tailwindcss": "^4", "typescript": "^5" } -} +} \ No newline at end of file diff --git a/admin/prisma/migrations/0_init/migration.sql b/admin/prisma/migrations/0_init/migration.sql deleted file mode 100644 index d14cf34644381de5b3a78be4e7446ccd813188a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35984 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 diff --git a/admin/prisma/migrations/20260427214502_init/migration.sql b/admin/prisma/migrations/20260427214502_init/migration.sql deleted file mode 100644 index 220c22c..0000000 --- a/admin/prisma/migrations/20260427214502_init/migration.sql +++ /dev/null @@ -1,459 +0,0 @@ --- CreateEnum -CREATE TYPE "RatingStatus" AS ENUM ('PENDING', 'APPROVED', 'REJECTED'); - --- CreateEnum -CREATE TYPE "ReportStatus" AS ENUM ('PENDING', 'RESOLVED', 'DISMISSED'); - --- CreateEnum -CREATE TYPE "UserRole" AS ENUM ('VISITOR', 'ENTREPRENEUR', 'ADMIN'); - --- CreateEnum -CREATE TYPE "Plan" AS ENUM ('STARTER', 'BOOSTER', 'EMPIRE'); - --- CreateEnum -CREATE TYPE "OfferType" AS ENUM ('PRODUCT', 'SERVICE'); - --- CreateEnum -CREATE TYPE "InterviewType" AS ENUM ('VIDEO', 'ARTICLE'); - --- CreateTable -CREATE TABLE "User" ( - "id" TEXT NOT NULL, - "name" TEXT NOT NULL, - "email" TEXT NOT NULL, - "password" TEXT NOT NULL, - "role" "UserRole" NOT NULL DEFAULT 'VISITOR', - "avatar" TEXT, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" TIMESTAMP(3) NOT NULL, - "bio" TEXT, - "location" TEXT, - "phone" TEXT, - "isSuspended" BOOLEAN NOT NULL DEFAULT false, - "suspensionReason" TEXT, - "countryId" TEXT, - "resetToken" TEXT, - "resetTokenExpiry" TIMESTAMP(3), - "emailVerified" BOOLEAN NOT NULL DEFAULT false, - "verificationToken" TEXT, - - CONSTRAINT "User_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "Business" ( - "id" TEXT NOT NULL, - "name" TEXT NOT NULL, - "category" TEXT NOT NULL, - "location" TEXT NOT NULL, - "description" TEXT NOT NULL, - "logoUrl" TEXT NOT NULL, - "videoUrl" TEXT, - "contactEmail" TEXT NOT NULL, - "contactPhone" TEXT, - "socialLinks" JSONB, - "verified" BOOLEAN NOT NULL DEFAULT false, - "viewCount" INTEGER NOT NULL DEFAULT 0, - "rating" DOUBLE PRECISION NOT NULL DEFAULT 0.0, - "ratingCount" INTEGER NOT NULL DEFAULT 0, - "tags" TEXT[], - "isFeatured" BOOLEAN NOT NULL DEFAULT false, - "founderName" TEXT, - "founderImageUrl" TEXT, - "keyMetric" TEXT, - "ownerId" TEXT NOT NULL, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" TIMESTAMP(3) NOT NULL, - "slug" TEXT, - "isActive" BOOLEAN NOT NULL DEFAULT false, - "showEmail" BOOLEAN NOT NULL DEFAULT true, - "showPhone" BOOLEAN NOT NULL DEFAULT true, - "showSocials" BOOLEAN NOT NULL DEFAULT true, - "websiteUrl" TEXT, - "isSuspended" BOOLEAN NOT NULL DEFAULT false, - "suspensionReason" TEXT, - "plan" "Plan" NOT NULL DEFAULT 'STARTER', - "city" TEXT, - "countryId" TEXT, - "coverUrl" TEXT, - "coverPosition" TEXT DEFAULT '50% 50%', - "coverZoom" DOUBLE PRECISION DEFAULT 1.0, - "suggestedCategory" TEXT, - "categoryId" TEXT, - - CONSTRAINT "Business_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "BusinessCategory" ( - "id" TEXT NOT NULL, - "name" TEXT NOT NULL, - "slug" TEXT NOT NULL, - "icon" TEXT, - "isActive" BOOLEAN NOT NULL DEFAULT true, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" TIMESTAMP(3) NOT NULL, - - CONSTRAINT "BusinessCategory_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "Country" ( - "id" TEXT NOT NULL, - "name" TEXT NOT NULL, - "code" TEXT NOT NULL, - "flag" TEXT, - "isActive" BOOLEAN NOT NULL DEFAULT true, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" TIMESTAMP(3) NOT NULL, - "description" TEXT, - - CONSTRAINT "Country_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "PricingPlan" ( - "id" TEXT NOT NULL, - "tier" "Plan" NOT NULL, - "name" TEXT NOT NULL, - "priceXOF" TEXT NOT NULL, - "priceEUR" TEXT NOT NULL, - "description" TEXT NOT NULL, - "features" TEXT[], - "offerLimit" INTEGER NOT NULL DEFAULT 1, - "recommended" BOOLEAN NOT NULL DEFAULT false, - "color" TEXT NOT NULL DEFAULT 'gray', - "updatedAt" TIMESTAMP(3) NOT NULL, - "yearlyPriceEUR" TEXT, - "yearlyPriceXOF" TEXT, - - CONSTRAINT "PricingPlan_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "Offer" ( - "id" TEXT NOT NULL, - "title" TEXT NOT NULL, - "type" "OfferType" NOT NULL, - "price" DOUBLE PRECISION NOT NULL, - "currency" TEXT NOT NULL DEFAULT 'XOF', - "description" TEXT, - "imageUrl" TEXT NOT NULL, - "active" BOOLEAN NOT NULL DEFAULT true, - "businessId" TEXT NOT NULL, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" TIMESTAMP(3) NOT NULL, - - CONSTRAINT "Offer_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "BlogPost" ( - "id" TEXT NOT NULL, - "title" TEXT NOT NULL, - "excerpt" TEXT NOT NULL, - "content" TEXT NOT NULL, - "author" TEXT NOT NULL, - "date" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "imageUrl" TEXT NOT NULL, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" TIMESTAMP(3) NOT NULL, - "metaDescription" TEXT, - "metaTitle" TEXT, - "slug" TEXT, - "tags" TEXT[] DEFAULT ARRAY[]::TEXT[], - - CONSTRAINT "BlogPost_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "Interview" ( - "id" TEXT NOT NULL, - "title" TEXT NOT NULL, - "guestName" TEXT NOT NULL, - "companyName" TEXT NOT NULL, - "role" TEXT NOT NULL, - "type" "InterviewType" NOT NULL, - "thumbnailUrl" TEXT NOT NULL, - "videoUrl" TEXT, - "content" TEXT, - "excerpt" TEXT NOT NULL, - "date" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "duration" TEXT, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" TIMESTAMP(3) NOT NULL, - "metaDescription" TEXT, - "metaTitle" TEXT, - "slug" TEXT, - "tags" TEXT[] DEFAULT ARRAY[]::TEXT[], - - CONSTRAINT "Interview_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "Comment" ( - "id" TEXT NOT NULL, - "content" TEXT NOT NULL, - "authorId" TEXT NOT NULL, - "businessId" TEXT NOT NULL, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" TIMESTAMP(3) NOT NULL, - - CONSTRAINT "Comment_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "AnalyticsEvent" ( - "id" TEXT NOT NULL, - "type" TEXT NOT NULL, - "path" TEXT NOT NULL, - "label" TEXT, - "value" DOUBLE PRECISION, - "metadata" JSONB, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "browser" TEXT, - "city" TEXT, - "country" TEXT, - "device" TEXT, - "ip" TEXT, - "os" TEXT, - "referrer" TEXT, - "userId" TEXT, - - CONSTRAINT "AnalyticsEvent_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "Rating" ( - "id" TEXT NOT NULL, - "value" INTEGER NOT NULL, - "userId" TEXT NOT NULL, - "businessId" TEXT NOT NULL, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" TIMESTAMP(3) NOT NULL, - "comment" TEXT, - "reply" TEXT, - "replyAt" TIMESTAMP(3), - "status" "RatingStatus" NOT NULL DEFAULT 'PENDING', - - CONSTRAINT "Rating_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "Conversation" ( - "id" TEXT NOT NULL, - "businessId" TEXT NOT NULL, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" TIMESTAMP(3) NOT NULL, - - CONSTRAINT "Conversation_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "ConversationParticipant" ( - "id" TEXT NOT NULL, - "userId" TEXT NOT NULL, - "conversationId" TEXT NOT NULL, - "isArchived" BOOLEAN NOT NULL DEFAULT false, - - CONSTRAINT "ConversationParticipant_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "Message" ( - "id" TEXT NOT NULL, - "content" TEXT NOT NULL, - "senderId" TEXT NOT NULL, - "conversationId" TEXT NOT NULL, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "read" BOOLEAN NOT NULL DEFAULT false, - - CONSTRAINT "Message_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "MessageReport" ( - "id" TEXT NOT NULL, - "reason" TEXT, - "messageId" TEXT NOT NULL, - "reporterId" TEXT NOT NULL, - "status" "ReportStatus" NOT NULL DEFAULT 'PENDING', - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - - CONSTRAINT "MessageReport_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "SiteSetting" ( - "id" TEXT NOT NULL DEFAULT 'singleton', - "siteName" TEXT NOT NULL DEFAULT 'Afrohub', - "siteSlogan" TEXT NOT NULL DEFAULT 'La plateforme de référence pour l''entrepreneuriat africain.', - "contactEmail" TEXT NOT NULL DEFAULT 'support@afrohub.com', - "contactPhone" TEXT DEFAULT '+225 00 00 00 00 00', - "address" TEXT DEFAULT 'Abidjan, Côte d''Ivoire', - "facebookUrl" TEXT, - "twitterUrl" TEXT, - "instagramUrl" TEXT, - "linkedinUrl" TEXT, - "footerText" TEXT DEFAULT '© 2025 Afrohub. Tous droits réservés.', - "updatedAt" TIMESTAMP(3) NOT NULL, - "homeBlogCount" INTEGER NOT NULL DEFAULT 3, - "homeBlogShow" BOOLEAN NOT NULL DEFAULT true, - "homeBlogSubtitle" TEXT NOT NULL DEFAULT 'Toutes les actualités de l''entrepreneuriat africain.', - "homeBlogTitle" TEXT NOT NULL DEFAULT 'Derniers Articles', - "homeBlogCategories" TEXT[] DEFAULT ARRAY[]::TEXT[], - "homeBlogIds" TEXT[] DEFAULT ARRAY[]::TEXT[], - "homeBlogSelection" TEXT NOT NULL DEFAULT 'latest', - "homeCategories" TEXT[] DEFAULT ARRAY['Technologie & IT', 'Agriculture & Agrobusiness', 'Mode & Textile', 'Cosmétique & Beauté']::TEXT[], - "resetPasswordSubject" TEXT NOT NULL DEFAULT 'Réinitialisation de votre mot de passe - Afrohub', - "resetPasswordTemplate" TEXT NOT NULL 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 :

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" TEXT NOT NULL DEFAULT 'Vérification de votre compte - Afrohub', - "verifyEmailTemplate" TEXT NOT NULL 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 :

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


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

', - - CONSTRAINT "SiteSetting_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "LegalDocument" ( - "id" TEXT NOT NULL, - "type" TEXT NOT NULL, - "title" TEXT NOT NULL, - "content" TEXT NOT NULL, - "updatedAt" TIMESTAMP(3) NOT NULL, - - CONSTRAINT "LegalDocument_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "Event" ( - "id" TEXT NOT NULL, - "title" TEXT NOT NULL, - "description" TEXT NOT NULL, - "date" TIMESTAMP(3) NOT NULL, - "location" TEXT NOT NULL, - "thumbnailUrl" TEXT NOT NULL, - "link" TEXT, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" TIMESTAMP(3) NOT NULL, - "metaDescription" TEXT, - "metaTitle" TEXT, - "slug" TEXT, - "tags" TEXT[] DEFAULT ARRAY[]::TEXT[], - - CONSTRAINT "Event_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "Favorite" ( - "id" TEXT NOT NULL, - "userId" TEXT NOT NULL, - "businessId" TEXT NOT NULL, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - - CONSTRAINT "Favorite_pkey" PRIMARY KEY ("id") -); - --- CreateIndex -CREATE UNIQUE INDEX "User_email_key" ON "User"("email"); - --- CreateIndex -CREATE UNIQUE INDEX "User_resetToken_key" ON "User"("resetToken"); - --- CreateIndex -CREATE UNIQUE INDEX "User_verificationToken_key" ON "User"("verificationToken"); - --- CreateIndex -CREATE UNIQUE INDEX "Business_ownerId_key" ON "Business"("ownerId"); - --- CreateIndex -CREATE UNIQUE INDEX "Business_slug_key" ON "Business"("slug"); - --- CreateIndex -CREATE UNIQUE INDEX "BusinessCategory_name_key" ON "BusinessCategory"("name"); - --- CreateIndex -CREATE UNIQUE INDEX "BusinessCategory_slug_key" ON "BusinessCategory"("slug"); - --- CreateIndex -CREATE UNIQUE INDEX "Country_name_key" ON "Country"("name"); - --- CreateIndex -CREATE UNIQUE INDEX "Country_code_key" ON "Country"("code"); - --- CreateIndex -CREATE UNIQUE INDEX "PricingPlan_tier_key" ON "PricingPlan"("tier"); - --- CreateIndex -CREATE UNIQUE INDEX "BlogPost_slug_key" ON "BlogPost"("slug"); - --- CreateIndex -CREATE UNIQUE INDEX "Interview_slug_key" ON "Interview"("slug"); - --- CreateIndex -CREATE UNIQUE INDEX "Rating_userId_businessId_key" ON "Rating"("userId", "businessId"); - --- CreateIndex -CREATE UNIQUE INDEX "ConversationParticipant_userId_conversationId_key" ON "ConversationParticipant"("userId", "conversationId"); - --- CreateIndex -CREATE UNIQUE INDEX "LegalDocument_type_key" ON "LegalDocument"("type"); - --- CreateIndex -CREATE UNIQUE INDEX "Event_slug_key" ON "Event"("slug"); - --- CreateIndex -CREATE UNIQUE INDEX "Favorite_userId_businessId_key" ON "Favorite"("userId", "businessId"); - --- AddForeignKey -ALTER TABLE "User" ADD CONSTRAINT "User_countryId_fkey" FOREIGN KEY ("countryId") REFERENCES "Country"("id") ON DELETE SET NULL ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "Business" ADD CONSTRAINT "Business_categoryId_fkey" FOREIGN KEY ("categoryId") REFERENCES "BusinessCategory"("id") ON DELETE SET NULL ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "Business" ADD CONSTRAINT "Business_countryId_fkey" FOREIGN KEY ("countryId") REFERENCES "Country"("id") ON DELETE SET NULL ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "Business" ADD CONSTRAINT "Business_ownerId_fkey" FOREIGN KEY ("ownerId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "Offer" ADD CONSTRAINT "Offer_businessId_fkey" FOREIGN KEY ("businessId") REFERENCES "Business"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "Comment" ADD CONSTRAINT "Comment_authorId_fkey" FOREIGN KEY ("authorId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "Comment" ADD CONSTRAINT "Comment_businessId_fkey" FOREIGN KEY ("businessId") REFERENCES "Business"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "Rating" ADD CONSTRAINT "Rating_businessId_fkey" FOREIGN KEY ("businessId") REFERENCES "Business"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "Rating" ADD CONSTRAINT "Rating_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "Conversation" ADD CONSTRAINT "Conversation_businessId_fkey" FOREIGN KEY ("businessId") REFERENCES "Business"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "ConversationParticipant" ADD CONSTRAINT "ConversationParticipant_conversationId_fkey" FOREIGN KEY ("conversationId") REFERENCES "Conversation"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "ConversationParticipant" ADD CONSTRAINT "ConversationParticipant_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "Message" ADD CONSTRAINT "Message_conversationId_fkey" FOREIGN KEY ("conversationId") REFERENCES "Conversation"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "Message" ADD CONSTRAINT "Message_senderId_fkey" FOREIGN KEY ("senderId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "MessageReport" ADD CONSTRAINT "MessageReport_messageId_fkey" FOREIGN KEY ("messageId") REFERENCES "Message"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "MessageReport" ADD CONSTRAINT "MessageReport_reporterId_fkey" FOREIGN KEY ("reporterId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "Favorite" ADD CONSTRAINT "Favorite_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "Favorite" ADD CONSTRAINT "Favorite_businessId_fkey" FOREIGN KEY ("businessId") REFERENCES "Business"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/admin/prisma/migrations/20260503171918_add_published_at/migration.sql b/admin/prisma/migrations/20260503171918_add_published_at/migration.sql deleted file mode 100644 index 5c2a930..0000000 --- a/admin/prisma/migrations/20260503171918_add_published_at/migration.sql +++ /dev/null @@ -1,8 +0,0 @@ --- AlterTable -ALTER TABLE "BlogPost" ADD COLUMN "publishedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP; - --- AlterTable -ALTER TABLE "Event" ADD COLUMN "publishedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP; - --- AlterTable -ALTER TABLE "Interview" ADD COLUMN "publishedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP; diff --git a/admin/prisma/migrations/20260503172958_add_content_status/migration.sql b/admin/prisma/migrations/20260503172958_add_content_status/migration.sql deleted file mode 100644 index f70ae9d..0000000 --- a/admin/prisma/migrations/20260503172958_add_content_status/migration.sql +++ /dev/null @@ -1,11 +0,0 @@ --- CreateEnum -CREATE TYPE "ContentStatus" AS ENUM ('DRAFT', 'PUBLISHED', 'ARCHIVED'); - --- AlterTable -ALTER TABLE "BlogPost" ADD COLUMN "status" "ContentStatus" NOT NULL DEFAULT 'PUBLISHED'; - --- AlterTable -ALTER TABLE "Event" ADD COLUMN "status" "ContentStatus" NOT NULL DEFAULT 'PUBLISHED'; - --- AlterTable -ALTER TABLE "Interview" ADD COLUMN "status" "ContentStatus" NOT NULL DEFAULT 'PUBLISHED'; diff --git a/admin/prisma/migrations/migration_lock.toml b/admin/prisma/migrations/migration_lock.toml deleted file mode 100644 index 044d57c..0000000 --- a/admin/prisma/migrations/migration_lock.toml +++ /dev/null @@ -1,3 +0,0 @@ -# Please do not edit this file manually -# It should be added in your version-control system (e.g., Git) -provider = "postgresql" diff --git a/admin/prisma/schema.prisma b/admin/prisma/schema.prisma deleted file mode 100644 index 37a4205..0000000 --- a/admin/prisma/schema.prisma +++ /dev/null @@ -1,426 +0,0 @@ -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 :

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 :

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 -} diff --git a/package.json b/package.json index 54f4bd8..c73323d 100644 --- a/package.json +++ b/package.json @@ -11,8 +11,8 @@ "dev:admin": "npm run dev --prefix admin -- -p 3001", "all": "concurrently \"npm run dev\" \"npm run dev:admin\"", "build": "prisma generate && next build && npm run build:admin", - "build:admin": "npm install --prefix admin --legacy-peer-deps && prisma generate && npm run build --prefix admin", - "generate": "npx prisma generate && cd admin && npx prisma generate && cd ..", + "build:admin": "npm install --prefix admin --legacy-peer-deps && npm run build --prefix admin", + "generate": "npx prisma generate && cd admin && npx prisma generate --schema=../prisma/schema.prisma && cd ..", "start": "npx prisma migrate deploy && next start", "start:admin": "npm run start --prefix admin", "db:migrate": "prisma migrate dev",