feat: initialize Prisma database with migration and seed scripts for blog and afrolife data
Some checks failed
Build and Push App / build (push) Failing after 11m14s
Some checks failed
Build and Push App / build (push) Failing after 11m14s
This commit is contained in:
3
.env
3
.env
@@ -1,5 +1,6 @@
|
||||
# Connexion locale via le Docker Compose fourni :
|
||||
DATABASE_URL="postgresql://admin:adminpassword@localhost:5432/afrohub_dev?schema=public"
|
||||
#DATABASE_URL="postgresql://admin:adminpassword@localhost:5432/afrohub_dev?schema=public"
|
||||
DATABASE_URL="postgresql://admin:adminpassword@192.168.1.25:5432/afrohub_dev?schema=public"
|
||||
|
||||
# Exemple avec Supabase ou Neon (si base distante)
|
||||
# DATABASE_URL="postgresql://postgres:[MOT_DE_PASSE]@db.[ID_PROJET].supabase.co:5432/postgres"
|
||||
459
prisma/migrations/20260427214502_init/migration.sql
Normal file
459
prisma/migrations/20260427214502_init/migration.sql
Normal file
@@ -0,0 +1,459 @@
|
||||
-- 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 '<div style="font-family: sans-serif; max-width: 600px; margin: 0 auto; padding: 20px; border: 1px solid #e5e7eb; border-radius: 8px;"><h2 style="color: #0d9488; text-align: center;">{siteName}</h2><p>Bonjour {name},</p><p>Vous avez demandé la réinitialisation de votre mot de passe. Cliquez sur le bouton ci-dessous pour choisir un nouveau mot de passe :</p><div style="text-align: center; margin: 30px 0;"><a href="{resetUrl}" style="background-color: #0d9488; color: white; padding: 12px 24px; text-decoration: none; border-radius: 6px; font-weight: bold;">Réinitialiser mon mot de passe</a></div><p>Ce lien expirera dans 1 heure. Si vous n''avez pas demandé cette réinitialisation, vous pouvez ignorer cet email.</p><hr style="border: 0; border-top: 1px solid #e5e7eb; margin: 20px 0;"><p style="font-size: 12px; color: #6b7280; text-align: center;">© 2025 {siteName}. Tous droits réservés.</p></div>',
|
||||
"verifyEmailSubject" TEXT NOT NULL DEFAULT 'Vérification de votre compte - Afrohub',
|
||||
"verifyEmailTemplate" TEXT NOT NULL DEFAULT '<div style="font-family: sans-serif; max-width: 600px; margin: 0 auto; padding: 20px; border: 1px solid #e5e7eb; border-radius: 8px;"><h2 style="color: #0d9488; text-align: center;">{siteName}</h2><p>Bonjour {name},</p><p>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 :</p><div style="text-align: center; margin: 30px 0;"><a href="{verifyUrl}" style="background-color: #0d9488; color: white; padding: 12px 24px; text-decoration: none; border-radius: 6px; font-weight: bold;">Vérifier mon compte</a></div><p>Si vous n''avez pas créé de compte sur notre plateforme, vous pouvez ignorer cet email.</p><hr style="border: 0; border-top: 1px solid #e5e7eb; margin: 20px 0;"><p style="font-size: 12px; color: #6b7280; text-align: center;">© 2025 {siteName}. Tous droits réservés.</p></div>',
|
||||
|
||||
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;
|
||||
3
prisma/migrations/migration_lock.toml
Normal file
3
prisma/migrations/migration_lock.toml
Normal file
@@ -0,0 +1,3 @@
|
||||
# Please do not edit this file manually
|
||||
# It should be added in your version-control system (e.g., Git)
|
||||
provider = "postgresql"
|
||||
376
prisma/seed-afrolife.ts
Normal file
376
prisma/seed-afrolife.ts
Normal file
@@ -0,0 +1,376 @@
|
||||
import { PrismaClient } from '@prisma/client';
|
||||
import { PrismaPg } from '@prisma/adapter-pg';
|
||||
import pg from 'pg';
|
||||
import { config } from 'dotenv';
|
||||
|
||||
config();
|
||||
config({ path: '.env.local', override: true });
|
||||
|
||||
const connectionString = process.env.DATABASE_URL!;
|
||||
const pool = new pg.Pool({ connectionString });
|
||||
const adapter = new PrismaPg(pool);
|
||||
const prisma = new PrismaClient({ adapter });
|
||||
|
||||
const ARTICLES = [
|
||||
{
|
||||
title: "Les 5 tendances de l'entrepreneuriat africain en 2026",
|
||||
slug: "tendances-entrepreneuriat-africain-2026",
|
||||
excerpt: "Découvrez les secteurs clés qui portent la croissance des startups sur le continent cette année.",
|
||||
content: "<p>L'année 2026 s'annonce prometteuse pour les entrepreneurs africains. Parmi les tendances majeures, on retrouve la Fintech, la Healthtech, mais aussi une forte poussée des solutions d'agritech...</p>",
|
||||
author: "Équipe Afrohub",
|
||||
date: new Date("2026-02-10T09:00:00Z"),
|
||||
imageUrl: "https://images.unsplash.com/photo-1556761175-5973dc0f32d7?auto=format&fit=crop&q=80&w=1200",
|
||||
tags: ["Tendances", "Startups", "Innovation"],
|
||||
metaTitle: "Tendances Entrepreneuriat Africain 2026",
|
||||
metaDescription: "Analyse des tendances 2026 pour les startups en Afrique."
|
||||
},
|
||||
{
|
||||
title: "Tech au Sénégal : Pourquoi Dakar attire les startups",
|
||||
slug: "tech-senegal-dakar-attire-startups",
|
||||
excerpt: "Dakar s'impose comme un hub technologique incontournable en Afrique de l'Ouest.",
|
||||
content: "<p>Le dynamisme de la scène tech dakaroise s'explique par un écosystème en pleine structuration, des talents qualifiés et un soutien gouvernemental accru. De plus en plus d'incubateurs voient le jour...</p>",
|
||||
author: "Marie Koné",
|
||||
date: new Date("2026-03-05T10:00:00Z"),
|
||||
imageUrl: "https://images.unsplash.com/photo-1517245386807-bb43f82c33c4?auto=format&fit=crop&q=80&w=1200",
|
||||
tags: ["Tech", "Sénégal", "Hub"],
|
||||
metaTitle: "Dakar, Hub Tech d'Afrique de l'Ouest",
|
||||
metaDescription: "Pourquoi Dakar devient la nouvelle Silicon Valley de l'Afrique de l'Ouest."
|
||||
},
|
||||
{
|
||||
title: "L'agrobusiness, moteur de la croissance au Kenya",
|
||||
slug: "agrobusiness-moteur-croissance-kenya",
|
||||
excerpt: "Comment les innovations technologiques transforment l'agriculture kenyane.",
|
||||
content: "<p>Au Kenya, l'agrobusiness ne se résume plus à l'agriculture traditionnelle. L'utilisation de drones, de capteurs IoT et d'applications mobiles permet d'optimiser les rendements et de réduire les pertes...</p>",
|
||||
author: "Paul Mwanza",
|
||||
date: new Date("2026-05-15T08:30:00Z"),
|
||||
imageUrl: "https://images.unsplash.com/photo-1505471768190-275e2ad7b3f9?auto=format&fit=crop&q=80&w=1200",
|
||||
tags: ["Agriculture", "Kenya", "Agrobusiness"],
|
||||
metaTitle: "L'Agrobusiness au Kenya en 2026",
|
||||
metaDescription: "L'impact des nouvelles technologies sur l'agriculture au Kenya."
|
||||
},
|
||||
{
|
||||
title: "Digitalisation en Afrique Centrale : Quels enjeux ?",
|
||||
slug: "digitalisation-afrique-centrale-enjeux",
|
||||
excerpt: "Une analyse des défis et opportunités liés à la transformation numérique dans la région.",
|
||||
content: "<p>La connectivité et l'inclusion financière restent des défis majeurs, mais les gouvernements et les acteurs privés collaborent pour accélérer la digitalisation des services publics et privés...</p>",
|
||||
author: "Équipe Afrohub",
|
||||
date: new Date("2026-06-10T14:00:00Z"),
|
||||
imageUrl: "https://images.unsplash.com/photo-1531297172866-d85ce3691ebc?auto=format&fit=crop&q=80&w=1200",
|
||||
tags: ["Digital", "Afrique Centrale"],
|
||||
metaTitle: "Enjeux de la Digitalisation en Afrique Centrale",
|
||||
metaDescription: "Défis et opportunités de la numérisation en Afrique Centrale."
|
||||
},
|
||||
{
|
||||
title: "Comment attirer des investisseurs internationaux au Nigeria",
|
||||
slug: "attirer-investisseurs-internationaux-nigeria",
|
||||
excerpt: "Les secrets d'une levée de fonds réussie dans le plus grand marché africain.",
|
||||
content: "<p>Le Nigeria reste la première destination des capitaux-risqueurs en Afrique. Pour tirer son épingle du jeu, il faut une équipe solide, une traction avérée et une capacité à scaler rapidement...</p>",
|
||||
author: "Chidi Okafor",
|
||||
date: new Date("2026-08-01T11:00:00Z"),
|
||||
imageUrl: "https://images.unsplash.com/photo-1553729459-efe14ef6055d?auto=format&fit=crop&q=80&w=1200",
|
||||
tags: ["Investissement", "Nigeria", "Levée de fonds"],
|
||||
metaTitle: "Levée de fonds au Nigeria",
|
||||
metaDescription: "Conseils pour attirer les investisseurs au Nigeria."
|
||||
},
|
||||
{
|
||||
title: "Le tourisme durable : une opportunité en or pour l'Afrique du Sud",
|
||||
slug: "tourisme-durable-opportunite-afrique-du-sud",
|
||||
excerpt: "L'émergence de l'éco-tourisme comme vecteur de développement local.",
|
||||
content: "<p>L'Afrique du Sud mise de plus en plus sur un tourisme respectueux de l'environnement et des communautés locales. Des lodges écologiques aux safaris responsables, le secteur se réinvente...</p>",
|
||||
author: "Sarah Van Der Merwe",
|
||||
date: new Date("2026-09-15T09:00:00Z"),
|
||||
imageUrl: "https://images.unsplash.com/photo-1516426122078-c23e76319801?auto=format&fit=crop&q=80&w=1200",
|
||||
tags: ["Tourisme", "Durable", "Afrique du Sud"],
|
||||
metaTitle: "Le Tourisme Durable en Afrique du Sud",
|
||||
metaDescription: "Comment l'éco-tourisme transforme l'économie locale."
|
||||
},
|
||||
{
|
||||
title: "Mode éthique : le Ghana donne le ton",
|
||||
slug: "mode-ethique-ghana",
|
||||
excerpt: "Les créateurs ghanéens réinventent la mode avec une approche durable et locale.",
|
||||
content: "<p>Utilisation de tissus recyclés, valorisation du savoir-faire artisanal et commerce équitable : la mode ghanéenne s'exporte tout en respectant ses racines et l'environnement...</p>",
|
||||
author: "Amina Diallo",
|
||||
date: new Date("2026-10-05T15:00:00Z"),
|
||||
imageUrl: "https://images.unsplash.com/photo-1528698827591-e19ccd7bc23d?auto=format&fit=crop&q=80&w=1200",
|
||||
tags: ["Mode", "Éthique", "Ghana"],
|
||||
metaTitle: "La Mode Éthique au Ghana",
|
||||
metaDescription: "Découvrez les créateurs ghanéens qui changent l'industrie de la mode."
|
||||
},
|
||||
{
|
||||
title: "Énergie solaire : le Maroc, leader africain",
|
||||
slug: "energie-solaire-maroc-leader",
|
||||
excerpt: "Comment le complexe Noor Ouarzazate inspire d'autres pays du continent.",
|
||||
content: "<p>Avec des investissements massifs dans les énergies renouvelables, le Maroc montre la voie. Ce modèle intéresse de nombreux pays voisins désireux d'assurer leur transition énergétique...</p>",
|
||||
author: "Hassan Berrada",
|
||||
date: new Date("2026-11-01T08:00:00Z"),
|
||||
imageUrl: "https://images.unsplash.com/photo-1509391366360-2e959784a276?auto=format&fit=crop&q=80&w=1200",
|
||||
tags: ["Énergie", "Solaire", "Maroc"],
|
||||
metaTitle: "Le Maroc, Leader du Solaire en Afrique",
|
||||
metaDescription: "La stratégie énergétique du Maroc et ses mégaprojets."
|
||||
},
|
||||
{
|
||||
title: "Edtech : repenser la formation professionnelle au Rwanda",
|
||||
slug: "edtech-formation-professionnelle-rwanda",
|
||||
excerpt: "Le numérique au service de l'employabilité des jeunes rwandais.",
|
||||
content: "<p>Le Rwanda multiplie les initiatives EdTech pour pallier le manque de compétences techniques. Des plateformes d'e-learning aux bootcamps de code, la formation se digitalise...</p>",
|
||||
author: "Jean Bosco",
|
||||
date: new Date("2026-12-01T10:00:00Z"),
|
||||
imageUrl: "https://images.unsplash.com/photo-1522202176988-66273c2fd55f?auto=format&fit=crop&q=80&w=1200",
|
||||
tags: ["Edtech", "Éducation", "Rwanda"],
|
||||
metaTitle: "L'EdTech Révolutionne la Formation au Rwanda",
|
||||
metaDescription: "Comment le numérique améliore l'accès à la formation au Rwanda."
|
||||
},
|
||||
{
|
||||
title: "Rétrospective 2026 : une année exceptionnelle pour les entrepreneurs",
|
||||
slug: "retrospective-2026-entrepreneurs-africains",
|
||||
excerpt: "Retour sur les moments forts et les réussites marquantes de l'année.",
|
||||
content: "<p>De la levée de fonds record de plusieurs licornes à l'émergence de nouveaux hubs d'innovation, 2026 a été une année charnière pour l'écosystème entrepreneurial africain. Bilan et perspectives pour 2027...</p>",
|
||||
author: "Équipe Afrohub",
|
||||
date: new Date("2026-12-15T12:00:00Z"),
|
||||
imageUrl: "https://images.unsplash.com/photo-1454165804606-c3d57bc86b40?auto=format&fit=crop&q=80&w=1200",
|
||||
tags: ["Rétrospective", "Bilan", "2026"],
|
||||
metaTitle: "Bilan Entrepreneuriat Africain 2026",
|
||||
metaDescription: "Retour sur les faits marquants de l'année 2026."
|
||||
}
|
||||
];
|
||||
|
||||
const VIDEOS = [
|
||||
{
|
||||
title: "Interview exclusive : Le futur de la Tech Africaine",
|
||||
slug: "interview-futur-tech-africaine-2026",
|
||||
guestName: "Amina Diop",
|
||||
companyName: "TechAfrica",
|
||||
role: "CEO",
|
||||
type: "VIDEO" as const,
|
||||
thumbnailUrl: "https://images.unsplash.com/photo-1573164713988-8665fc963095?auto=format&fit=crop&q=80&w=1200",
|
||||
videoUrl: "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
|
||||
excerpt: "Amina Diop partage sa vision de l'innovation sur le continent pour la prochaine décennie.",
|
||||
date: new Date("2026-02-20T14:00:00Z"),
|
||||
duration: "15:30",
|
||||
tags: ["Tech", "Interview", "Innovation"]
|
||||
},
|
||||
{
|
||||
title: "Agrobusiness : Comment réussir sa transformation",
|
||||
slug: "agrobusiness-reussir-transformation",
|
||||
guestName: "Kwame Osei",
|
||||
companyName: "AgriGrow",
|
||||
role: "Fondateur",
|
||||
type: "VIDEO" as const,
|
||||
thumbnailUrl: "https://images.unsplash.com/photo-1589923188900-85dae523342b?auto=format&fit=crop&q=80&w=1200",
|
||||
videoUrl: "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
|
||||
excerpt: "Les conseils de Kwame Osei pour digitaliser une exploitation agricole.",
|
||||
date: new Date("2026-03-15T11:00:00Z"),
|
||||
duration: "12:45",
|
||||
tags: ["Agrobusiness", "Transformation", "Conseils"]
|
||||
},
|
||||
{
|
||||
title: "Les défis de la digitalisation des services",
|
||||
slug: "defis-digitalisation-services",
|
||||
guestName: "Jean-Paul Mba",
|
||||
companyName: "DigiCent",
|
||||
role: "Directeur",
|
||||
type: "VIDEO" as const,
|
||||
thumbnailUrl: "https://images.unsplash.com/photo-1551836022-d5d88e9218df?auto=format&fit=crop&q=80&w=1200",
|
||||
videoUrl: "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
|
||||
excerpt: "Focus sur les obstacles technologiques et réglementaires en Afrique Centrale.",
|
||||
date: new Date("2026-05-25T16:00:00Z"),
|
||||
duration: "18:20",
|
||||
tags: ["Digitalisation", "Services", "Défis"]
|
||||
},
|
||||
{
|
||||
title: "Financement des startups : les clés du succès",
|
||||
slug: "financement-startups-cles-succes",
|
||||
guestName: "Sarah N'Diaye",
|
||||
companyName: "InvestAf",
|
||||
role: "Partner",
|
||||
type: "VIDEO" as const,
|
||||
thumbnailUrl: "https://images.unsplash.com/photo-1573164574572-cb89e39749b4?auto=format&fit=crop&q=80&w=1200",
|
||||
videoUrl: "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
|
||||
excerpt: "Comment convaincre les fonds d'investissement de miser sur votre projet.",
|
||||
date: new Date("2026-06-20T10:30:00Z"),
|
||||
duration: "20:15",
|
||||
tags: ["Financement", "Levée de fonds", "Startups"]
|
||||
},
|
||||
{
|
||||
title: "Tourisme responsable : retours d'expérience",
|
||||
slug: "tourisme-responsable-retours-experience",
|
||||
guestName: "David Smith",
|
||||
companyName: "EcoTour",
|
||||
role: "Co-fondateur",
|
||||
type: "VIDEO" as const,
|
||||
thumbnailUrl: "https://images.unsplash.com/photo-1534008897995-27a23e859048?auto=format&fit=crop&q=80&w=1200",
|
||||
videoUrl: "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
|
||||
excerpt: "Créer une entreprise rentable tout en préservant l'environnement, c'est possible.",
|
||||
date: new Date("2026-08-10T09:00:00Z"),
|
||||
duration: "14:50",
|
||||
tags: ["Tourisme", "Responsable", "Environnement"]
|
||||
},
|
||||
{
|
||||
title: "L'essor de la mode africaine à l'international",
|
||||
slug: "essor-mode-africaine-international",
|
||||
guestName: "Fatou Sow",
|
||||
companyName: "AfriStyle",
|
||||
role: "Créatrice",
|
||||
type: "VIDEO" as const,
|
||||
thumbnailUrl: "https://images.unsplash.com/photo-1529626455594-4ff0802cfb7e?auto=format&fit=crop&q=80&w=1200",
|
||||
videoUrl: "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
|
||||
excerpt: "L'exportation des marques de mode ouest-africaines vers l'Europe et les États-Unis.",
|
||||
date: new Date("2026-09-25T15:30:00Z"),
|
||||
duration: "16:10",
|
||||
tags: ["Mode", "Export", "Création"]
|
||||
},
|
||||
{
|
||||
title: "Transition énergétique : le rôle des PME",
|
||||
slug: "transition-energetique-role-pme",
|
||||
guestName: "Hassan Youssef",
|
||||
companyName: "SolarMaroc",
|
||||
role: "CEO",
|
||||
type: "VIDEO" as const,
|
||||
thumbnailUrl: "https://images.unsplash.com/photo-1560250097-0b93528c311a?auto=format&fit=crop&q=80&w=1200",
|
||||
videoUrl: "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
|
||||
excerpt: "Les petites entreprises en première ligne pour la démocratisation du solaire.",
|
||||
date: new Date("2026-10-15T11:45:00Z"),
|
||||
duration: "19:00",
|
||||
tags: ["Énergie", "PME", "Solaire"]
|
||||
},
|
||||
{
|
||||
title: "Innovation dans l'éducation : les EdTech",
|
||||
slug: "innovation-education-edtech",
|
||||
guestName: "Alice Muhire",
|
||||
companyName: "EduRwanda",
|
||||
role: "Fondatrice",
|
||||
type: "VIDEO" as const,
|
||||
thumbnailUrl: "https://images.unsplash.com/photo-1573167507017-6c0e536ad955?auto=format&fit=crop&q=80&w=1200",
|
||||
videoUrl: "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
|
||||
excerpt: "Comment les EdTech transforment l'accès au savoir au Rwanda et au-delà.",
|
||||
date: new Date("2026-11-12T10:00:00Z"),
|
||||
duration: "17:40",
|
||||
tags: ["EdTech", "Éducation", "Innovation"]
|
||||
},
|
||||
{
|
||||
title: "Le e-commerce en Afrique de l'Ouest",
|
||||
slug: "ecommerce-afrique-ouest-2026",
|
||||
guestName: "Marc Yao",
|
||||
companyName: "Afrishop",
|
||||
role: "COO",
|
||||
type: "VIDEO" as const,
|
||||
thumbnailUrl: "https://images.unsplash.com/photo-1556742049-0cfed4f6a45d?auto=format&fit=crop&q=80&w=1200",
|
||||
videoUrl: "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
|
||||
excerpt: "Logistique, paiement en ligne... Les clés de la réussite dans le e-commerce.",
|
||||
date: new Date("2026-12-08T13:30:00Z"),
|
||||
duration: "21:05",
|
||||
tags: ["E-commerce", "Logistique", "Afrique de l'Ouest"]
|
||||
},
|
||||
{
|
||||
title: "Bilan 2026 et perspectives 2027",
|
||||
slug: "bilan-2026-perspectives-2027",
|
||||
guestName: "Marie Koné",
|
||||
companyName: "EntreprendreAf",
|
||||
role: "Analyste",
|
||||
type: "VIDEO" as const,
|
||||
thumbnailUrl: "https://images.unsplash.com/photo-1573164713714-d95e436ab8d6?auto=format&fit=crop&q=80&w=1200",
|
||||
videoUrl: "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
|
||||
excerpt: "Une analyse complète de l'année écoulée et les tendances à surveiller pour 2027.",
|
||||
date: new Date("2026-12-25T10:00:00Z"),
|
||||
duration: "25:00",
|
||||
tags: ["Bilan", "Perspectives", "Analyse"]
|
||||
}
|
||||
];
|
||||
|
||||
const INTERVIEW_ARTICLES = [
|
||||
{
|
||||
title: "Interview : Aminata Diop, la révolution verte au Sénégal",
|
||||
slug: "interview-aminata-diop-revolution-verte-senegal",
|
||||
guestName: "Aminata Diop",
|
||||
companyName: "AgriTech SN",
|
||||
role: "Fondatrice",
|
||||
type: "ARTICLE" as const,
|
||||
thumbnailUrl: "https://images.unsplash.com/photo-1573164713988-8665fc963095?auto=format&fit=crop&q=80&w=1200",
|
||||
excerpt: "Rencontre avec la fondatrice d'AgriTech SN, qui transforme l'agriculture locale grâce aux capteurs connectés.",
|
||||
content: "<p><strong>Résumé :</strong> Aminata Diop a fondé AgriTech SN pour aider les agriculteurs sénégalais à optimiser leur consommation d'eau et leurs rendements. Dans cet entretien, elle revient sur son parcours, de ses études d'ingénieur à son retour au pays, et partage sa vision d'une agriculture africaine résiliente face au changement climatique.</p><h3>« La technologie doit s'adapter à la réalité de nos champs, et non l'inverse. »</h3><p><strong>Afrohub :</strong> Qu'est-ce qui vous a poussé à lancer AgriTech SN ?</p><p><strong>Aminata Diop :</strong> En voyant les difficultés de ma famille dans la Vallée du Fleuve Sénégal face à l'irrégularité des pluies, j'ai compris que les données pouvaient sauver nos récoltes. Nous avons développé des capteurs low-cost qui communiquent par SMS, car tout le monde n'a pas un smartphone dans les zones rurales.</p><p><strong>Afrohub :</strong> Quel est votre plus grand défi aujourd'hui ?</p><p><strong>A.D. :</strong> Convaincre les banques de financer l'équipement des petits exploitants. La technologie est prête, l'impact est prouvé, c'est maintenant une question d'échelle et de confiance institutionnelle.</p>",
|
||||
date: new Date("2026-10-12T09:00:00Z"),
|
||||
tags: ["Afrolife", "Interview", "AgriTech", "Sénégal"],
|
||||
metaTitle: "Interview : Aminata Diop, AgriTech au Sénégal",
|
||||
metaDescription: "Découvrez le parcours d'Aminata Diop et sa startup AgriTech SN."
|
||||
},
|
||||
{
|
||||
title: "Portrait : Kwame Mensah, l'artisan du e-commerce éthique au Ghana",
|
||||
slug: "portrait-kwame-mensah-ecommerce-ethique-ghana",
|
||||
guestName: "Kwame Mensah",
|
||||
companyName: "KenteConnect",
|
||||
role: "Fondateur",
|
||||
type: "ARTICLE" as const,
|
||||
thumbnailUrl: "https://images.unsplash.com/photo-1531384441138-2736e62e0919?auto=format&fit=crop&q=80&w=1200",
|
||||
excerpt: "Comment un jeune diplômé a connecté des milliers d'artisans ghanéens au marché mondial.",
|
||||
content: "<p><strong>Résumé :</strong> Kwame Mensah est la force motrice derrière <em>KenteConnect</em>, une plateforme de commerce électronique qui supprime les intermédiaires pour les artisans locaux. Son initiative garantit un revenu équitable aux créateurs tout en préservant le patrimoine culturel ghanéen à l'ère numérique.</p><h3>« Le digital est notre meilleur outil pour préserver notre patrimoine. »</h3><p><strong>Afrohub :</strong> Comment est née l'idée de KenteConnect ?</p><p><strong>Kwame Mensah :</strong> Je voyais des tisseuses de Kente travailler des semaines pour des revenus dérisoires, tandis que leurs œuvres étaient revendues à prix d'or à l'international. J'ai voulu créer un pont direct entre leur talent et les acheteurs mondiaux.</p><p><strong>Afrohub :</strong> En quoi votre modèle est-il différent ?</p><p><strong>K.M. :</strong> Nous ne sommes pas juste une marketplace. Nous formons les artisans à la photographie mobile, à la gestion des stocks sur smartphone et nous réinvestissons 10% de nos marges dans des coopératives locales.</p>",
|
||||
date: new Date("2026-10-25T14:30:00Z"),
|
||||
tags: ["Afrolife", "Interview", "E-commerce", "Ghana"],
|
||||
metaTitle: "Kwame Mensah : Le e-commerce éthique",
|
||||
metaDescription: "Interview de Kwame Mensah, fondateur de KenteConnect."
|
||||
},
|
||||
{
|
||||
title: "Rencontre avec Zineb Bennis, pionnière de la HealthTech au Maroc",
|
||||
slug: "rencontre-zineb-bennis-pionniere-healthtech-maroc",
|
||||
guestName: "Zineb Bennis",
|
||||
companyName: "SahaTech",
|
||||
role: "Fondatrice",
|
||||
type: "ARTICLE" as const,
|
||||
thumbnailUrl: "https://images.unsplash.com/photo-1559839734-2b71ea197ec2?auto=format&fit=crop&q=80&w=1200",
|
||||
excerpt: "Elle a créé la première application de télémédecine inclusive d'Afrique du Nord.",
|
||||
content: "<p><strong>Résumé :</strong> Zineb Bennis, médecin de formation, a troqué sa blouse blanche pour l'entrepreneuriat. Avec <em>SahaTech</em>, elle offre des consultations médicales à distance aux populations des zones enclavées de l'Atlas marocain, avec une approche centrée sur l'humain et l'accessibilité.</p><h3>« La santé n'est pas un luxe, c'est un droit que la technologie peut démocratiser. »</h3><p><strong>Afrohub :</strong> Passer de médecin à entrepreneure, c'est un grand saut. Pourquoi ce choix ?</p><p><strong>Zineb Bennis :</strong> Aux urgences, je voyais des patients arriver dans des états critiques simplement parce qu'ils vivaient à trois heures du premier dispensaire. Il fallait agir en amont. SahaTech est née de cette frustration et de l'envie de faire de la prévention à l'échelle nationale.</p><p><strong>Afrohub :</strong> Comment gérez-vous la barrière technologique chez les patients âgés ?</p><p><strong>Z.B. :</strong> C'est notre plus belle victoire ! Nous avons conçu une interface ultra-simplifiée, basée sur la voix et les dialectes locaux. Souvent, ce sont les petits-enfants qui initient le premier appel, puis les grands-parents deviennent autonomes.</p>",
|
||||
date: new Date("2026-11-05T10:00:00Z"),
|
||||
tags: ["Afrolife", "Interview", "HealthTech", "Maroc"],
|
||||
metaTitle: "Zineb Bennis : Innover dans la santé au Maroc",
|
||||
metaDescription: "SahaTech, la startup qui révolutionne la télémédecine au Maroc."
|
||||
},
|
||||
{
|
||||
title: "Interview : Chidi Okeke, redéfinir la logistique au Nigeria",
|
||||
slug: "interview-chidi-okeke-redefinir-logistique-nigeria",
|
||||
guestName: "Chidi Okeke",
|
||||
companyName: "LagosRoute",
|
||||
role: "Fondateur",
|
||||
type: "ARTICLE" as const,
|
||||
thumbnailUrl: "https://images.unsplash.com/photo-1507679799987-c73779587ccf?auto=format&fit=crop&q=80&w=1200",
|
||||
excerpt: "L'entrepreneur qui fluidifie le trafic de Lagos grâce à l'intelligence artificielle.",
|
||||
content: "<p><strong>Résumé :</strong> Ancien ingénieur logistique, Chidi Okeke a fondé <em>LagosRoute</em> pour s'attaquer aux célèbres embouteillages de la capitale nigériane. Sa plateforme d'optimisation de flotte pour les PME a déjà réduit de 30% les retards de livraison de ses clients.</p><h3>« Nos villes grandissent vite, notre logistique doit être plus intelligente. »</h3><p><strong>Afrohub :</strong> La logistique à Lagos a la réputation d'être chaotique. Comment y mettez-vous de l'ordre ?</p><p><strong>Chidi Okeke :</strong> Le chaos est juste un manque de données exploitables. Nous agrégeons en temps réel les données de trafic, la météo, et même les signalements communautaires pour créer des itinéraires dynamiques pour les livreurs à moto et les camions.</p><p><strong>Afrohub :</strong> Quelle est la prochaine étape pour LagosRoute ?</p><p><strong>C.O. :</strong> L'électrification. Nous préparons une transition vers une flotte de deux-roues électriques d'ici 2028, couplée à notre algorithme pour gérer l'autonomie et les stations de recharge.</p>",
|
||||
date: new Date("2026-11-18T16:00:00Z"),
|
||||
tags: ["Afrolife", "Interview", "Logistique", "Nigeria"],
|
||||
metaTitle: "Chidi Okeke : Optimiser la logistique au Nigeria",
|
||||
metaDescription: "Comment LagosRoute utilise l'IA pour améliorer les livraisons."
|
||||
}
|
||||
];
|
||||
|
||||
async function main() {
|
||||
console.log('--- Seeding AfroLife (Articles & Videos) ---');
|
||||
|
||||
for (const article of ARTICLES) {
|
||||
await prisma.blogPost.upsert({
|
||||
where: { slug: article.slug },
|
||||
update: article,
|
||||
create: article,
|
||||
});
|
||||
}
|
||||
console.log(`✅ 10 Articles (BlogPosts) générés.`);
|
||||
|
||||
for (const video of VIDEOS) {
|
||||
await prisma.interview.upsert({
|
||||
where: { slug: video.slug },
|
||||
update: video,
|
||||
create: video,
|
||||
});
|
||||
}
|
||||
console.log(`✅ 10 Vidéos (Interviews type VIDEO) générées.`);
|
||||
|
||||
for (const interviewArticle of INTERVIEW_ARTICLES) {
|
||||
await prisma.interview.upsert({
|
||||
where: { slug: interviewArticle.slug },
|
||||
update: interviewArticle,
|
||||
create: interviewArticle,
|
||||
});
|
||||
}
|
||||
console.log(`✅ 4 Articles d'Interview (Interviews type ARTICLE) générés.`);
|
||||
|
||||
console.log('✅ Seeding AfroLife terminé avec succès.');
|
||||
}
|
||||
|
||||
main().catch(console.error).finally(() => pool.end());
|
||||
152
prisma/seed-blog.ts
Normal file
152
prisma/seed-blog.ts
Normal file
@@ -0,0 +1,152 @@
|
||||
import { PrismaClient } from '@prisma/client';
|
||||
import { PrismaPg } from '@prisma/adapter-pg';
|
||||
import pg from 'pg';
|
||||
import { config } from 'dotenv';
|
||||
|
||||
config();
|
||||
config({ path: '.env.local', override: true });
|
||||
|
||||
const connectionString = process.env.DATABASE_URL!;
|
||||
const pool = new pg.Pool({ connectionString });
|
||||
const adapter = new PrismaPg(pool);
|
||||
const prisma = new PrismaClient({ adapter });
|
||||
|
||||
const BLOG_ARTICLES = [
|
||||
{
|
||||
title: "L'essor de l'Intelligence Artificielle générative dans les startups",
|
||||
slug: "essor-ia-generative-startups-africaines",
|
||||
excerpt: "Comment l'IA générative est rapidement adoptée pour résoudre des problèmes locaux.",
|
||||
content: "<p>L'Intelligence Artificielle générative n'est plus l'apanage de la Silicon Valley. De nombreuses startups sur le continent l'intègrent désormais pour automatiser le service client dans des langues locales, générer du contenu éducatif sur mesure, ou encore optimiser des diagnostics médicaux à distance.</p>",
|
||||
author: "Rédaction Afrohub",
|
||||
date: new Date("2026-01-15T09:00:00Z"),
|
||||
imageUrl: "https://images.unsplash.com/photo-1677442136019-21780ecad995?auto=format&fit=crop&q=80&w=1200",
|
||||
tags: ["IA", "Tech", "Innovation"],
|
||||
metaTitle: "L'IA générative en Afrique",
|
||||
metaDescription: "Adoption de l'IA par les startups africaines."
|
||||
},
|
||||
{
|
||||
title: "Couverture 5G : Où en sommes-nous en 2026 ?",
|
||||
slug: "couverture-5g-afrique-2026",
|
||||
excerpt: "Le point sur le déploiement de la 5G et son impact sur la connectivité.",
|
||||
content: "<p>Alors que plusieurs capitales africaines ont lancé leurs premiers réseaux 5G commerciaux, l'enjeu se déplace désormais vers la couverture des zones périurbaines. La baisse du coût des smartphones compatibles accélère l'adoption et ouvre la voie à de nouveaux usages comme l'IoT industriel.</p>",
|
||||
author: "Rédaction Afrohub",
|
||||
date: new Date("2026-02-05T10:30:00Z"),
|
||||
imageUrl: "https://images.unsplash.com/photo-1616423640778-28d1b53229bd?auto=format&fit=crop&q=80&w=1200",
|
||||
tags: ["5G", "Télécoms", "Connectivité"],
|
||||
metaTitle: "Déploiement de la 5G",
|
||||
metaDescription: "État des lieux de la 5G en 2026."
|
||||
},
|
||||
{
|
||||
title: "Les événements incontournables de la tech cette année",
|
||||
slug: "evenements-incontournables-tech-2026",
|
||||
excerpt: "L'agenda des sommets et salons à ne pas manquer pour les passionnés de tech.",
|
||||
content: "<p>L'année 2026 est riche en événements technologiques. Du grand salon de l'innovation de Dakar au sommet sur la cybersécurité d'Abidjan, ces rencontres sont cruciales pour le networking, la découverte de nouvelles tendances et la signature de partenariats stratégiques régionaux.</p>",
|
||||
author: "Rédaction Afrohub",
|
||||
date: new Date("2026-02-28T08:00:00Z"),
|
||||
imageUrl: "https://images.unsplash.com/photo-1540575467063-178a50c2df87?auto=format&fit=crop&q=80&w=1200",
|
||||
tags: ["Événements", "Agenda", "Networking"],
|
||||
metaTitle: "Agenda Tech 2026",
|
||||
metaDescription: "Les meilleurs événements tech de l'année."
|
||||
},
|
||||
{
|
||||
title: "Comment les paiements mobiles transforment l'économie informelle",
|
||||
slug: "paiements-mobiles-economie-informelle",
|
||||
excerpt: "Le mobile money continue de redéfinir les échanges commerciaux quotidiens.",
|
||||
content: "<p>Bien au-delà du simple transfert d'argent, les plateformes de paiement mobile intègrent aujourd'hui la micro-assurance, le micro-crédit et l'épargne. Cette numérisation permet aux commerçants du secteur informel de se constituer un historique financier et d'accéder à des services bancaires traditionnels.</p>",
|
||||
author: "Rédaction Afrohub",
|
||||
date: new Date("2026-03-20T14:15:00Z"),
|
||||
imageUrl: "https://images.unsplash.com/photo-1556742049-0cfed4f6a45d?auto=format&fit=crop&q=80&w=1200",
|
||||
tags: ["Mobile Money", "Fintech", "Économie"],
|
||||
metaTitle: "Mobile Money et Économie",
|
||||
metaDescription: "L'impact du paiement mobile sur l'économie informelle."
|
||||
},
|
||||
{
|
||||
title: "Afro-futurisme : Quand la tech rencontre l'art",
|
||||
slug: "afro-futurisme-tech-rencontre-art",
|
||||
excerpt: "L'intersection fascinante entre l'art numérique, la réalité virtuelle et la culture.",
|
||||
content: "<p>Les artistes numériques du continent s'emparent de la Réalité Virtuelle (VR) et des NFTs pour raconter de nouvelles histoires. L'Afro-futurisme ne se limite plus à la littérature ou au cinéma, il devient une expérience immersive interactive qui repousse les frontières de l'expression culturelle.</p>",
|
||||
author: "Rédaction Afrohub",
|
||||
date: new Date("2026-04-10T11:00:00Z"),
|
||||
imageUrl: "https://images.unsplash.com/photo-1618005182384-a83a8bd57fbe?auto=format&fit=crop&q=80&w=1200",
|
||||
tags: ["Afrolife", "Art", "VR"],
|
||||
metaTitle: "Afro-futurisme et Art Numérique",
|
||||
metaDescription: "L'essor de l'art numérique et de la VR."
|
||||
},
|
||||
{
|
||||
title: "Cybersécurité : Les nouveaux défis des entreprises",
|
||||
slug: "cybersecurite-nouveaux-defis-entreprises",
|
||||
excerpt: "Face à la numérisation croissante, la protection des données devient primordiale.",
|
||||
content: "<p>La multiplication des services cloud et du télétravail a élargi la surface d'attaque des PME. Les entreprises prennent conscience qu'investir dans la cybersécurité n'est plus une option, mais une nécessité pour protéger leurs données sensibles et assurer la continuité de leurs opérations.</p>",
|
||||
author: "Rédaction Afrohub",
|
||||
date: new Date("2026-05-02T09:30:00Z"),
|
||||
imageUrl: "https://images.unsplash.com/photo-1550751827-4bd374c3f58b?auto=format&fit=crop&q=80&w=1200",
|
||||
tags: ["Cybersécurité", "Données", "Tech"],
|
||||
metaTitle: "Défis de la Cybersécurité",
|
||||
metaDescription: "Pourquoi la cybersécurité est cruciale pour les PME."
|
||||
},
|
||||
{
|
||||
title: "La blockchain pour sécuriser les titres fonciers",
|
||||
slug: "blockchain-securiser-titres-fonciers",
|
||||
excerpt: "Une solution technologique à l'un des problèmes les plus complexes du continent.",
|
||||
content: "<p>Des projets pilotes utilisant la blockchain pour numériser et sécuriser les registres fonciers montrent des résultats prometteurs. En rendant les transactions immobilières transparentes et inaltérables, la technologie pourrait résoudre de nombreux conflits liés à la propriété terrienne.</p>",
|
||||
author: "Rédaction Afrohub",
|
||||
date: new Date("2026-06-15T15:45:00Z"),
|
||||
imageUrl: "https://images.unsplash.com/photo-1639762681485-074b7f4ecfc0?auto=format&fit=crop&q=80&w=1200",
|
||||
tags: ["Blockchain", "Propriété", "Innovation"],
|
||||
metaTitle: "Blockchain et Titres Fonciers",
|
||||
metaDescription: "Sécuriser l'immobilier grâce à la blockchain."
|
||||
},
|
||||
{
|
||||
title: "Retour sur le grand sommet du numérique de la saison",
|
||||
slug: "retour-sommet-numerique-saison",
|
||||
excerpt: "Les annonces majeures et les tendances qui ont marqué l'événement.",
|
||||
content: "<p>Le dernier sommet du numérique a tenu toutes ses promesses. Entre les annonces de nouveaux fonds d'investissement régionaux et les débats sur la souveraineté des données, l'événement a souligné la maturité grandissante de l'écosystème tech continental.</p>",
|
||||
author: "Rédaction Afrohub",
|
||||
date: new Date("2026-07-20T12:00:00Z"),
|
||||
imageUrl: "https://images.unsplash.com/photo-1505373877841-8d25f7d46678?auto=format&fit=crop&q=80&w=1200",
|
||||
tags: ["Événements", "Bilan", "Tech"],
|
||||
metaTitle: "Bilan du Sommet Numérique",
|
||||
metaDescription: "Résumé des temps forts du dernier sommet."
|
||||
},
|
||||
{
|
||||
title: "Smart Cities : Utopie ou réalité imminente ?",
|
||||
slug: "smart-cities-utopie-realite",
|
||||
excerpt: "L'intégration de la technologie dans la gestion urbaine s'accélère.",
|
||||
content: "<p>Face à une urbanisation galopante, plusieurs métropoles expérimentent le concept de ville intelligente. Gestion optimisée du trafic, éclairage public solaire intelligent et gestion des déchets connectée : les premières initiatives démontrent que la tech peut améliorer le quotidien des citadins.</p>",
|
||||
author: "Rédaction Afrohub",
|
||||
date: new Date("2026-08-10T08:15:00Z"),
|
||||
imageUrl: "https://images.unsplash.com/photo-1480714378408-67cf0d13bc1b?auto=format&fit=crop&q=80&w=1200",
|
||||
tags: ["Smart City", "Urbanisme", "IoT"],
|
||||
metaTitle: "Les Smart Cities en Développement",
|
||||
metaDescription: "Les technologies au service des villes africaines."
|
||||
},
|
||||
{
|
||||
title: "L'impact des câbles sous-marins sur la connectivité",
|
||||
slug: "impact-cables-sous-marins-connectivite",
|
||||
excerpt: "De nouvelles infrastructures promettent de décupler la bande passante.",
|
||||
content: "<p>L'arrivée de nouveaux câbles sous-marins à fibre optique sur les côtes africaines est une véritable révolution. Ces infrastructures massives promettent non seulement de réduire les coûts de connexion, mais aussi d'offrir une bande passante suffisante pour soutenir l'économie numérique de demain.</p>",
|
||||
author: "Rédaction Afrohub",
|
||||
date: new Date("2026-09-05T10:00:00Z"),
|
||||
imageUrl: "https://images.unsplash.com/photo-1581091226825-a6a2a5aee158?auto=format&fit=crop&q=80&w=1200",
|
||||
tags: ["Infrastructures", "Internet", "Tech"],
|
||||
metaTitle: "Câbles Sous-marins et Internet",
|
||||
metaDescription: "Amélioration de la connectivité via les nouvelles infrastructures."
|
||||
}
|
||||
];
|
||||
|
||||
async function main() {
|
||||
console.log('--- Seeding Blog (Tech, Events, Life) ---');
|
||||
|
||||
for (const article of BLOG_ARTICLES) {
|
||||
await prisma.blogPost.upsert({
|
||||
where: { slug: article.slug },
|
||||
update: article,
|
||||
create: article,
|
||||
});
|
||||
}
|
||||
|
||||
console.log(`✅ 10 Nouveaux Articles de Blog générés.`);
|
||||
console.log('✅ Seeding Blog terminé avec succès.');
|
||||
}
|
||||
|
||||
main().catch(console.error).finally(() => pool.end());
|
||||
@@ -19,8 +19,12 @@ async function main() {
|
||||
// 1. CLEANING DATA
|
||||
console.log('🧹 Cleaning existing data...');
|
||||
// Note: Only clean structure/system tables for a fresh core seed
|
||||
await prisma.favorite.deleteMany({});
|
||||
await prisma.rating.deleteMany({});
|
||||
await prisma.comment.deleteMany({});
|
||||
await prisma.message.deleteMany({});
|
||||
await prisma.conversationParticipant.deleteMany({});
|
||||
await prisma.conversation.deleteMany({});
|
||||
await prisma.offer.deleteMany({});
|
||||
await prisma.business.deleteMany({});
|
||||
await prisma.businessCategory.deleteMany({});
|
||||
|
||||
Reference in New Issue
Block a user