Admin panel for VinEye with dashboard, users, diseases, guides, alerts management. Stack: Next.js App Router + Prisma + PostgreSQL + better-auth. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
209 lines
6.2 KiB
SQL
209 lines
6.2 KiB
SQL
-- CreateEnum
|
|
CREATE TYPE "DiseaseType" AS ENUM ('FUNGAL', 'BACTERIAL', 'PEST', 'ABIOTIC');
|
|
|
|
-- CreateEnum
|
|
CREATE TYPE "Severity" AS ENUM ('LOW', 'MEDIUM', 'HIGH');
|
|
|
|
-- CreateEnum
|
|
CREATE TYPE "AlertType" AS ENUM ('WARNING', 'INFO', 'DANGER');
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "users" (
|
|
"id" TEXT NOT NULL,
|
|
"name" TEXT NOT NULL,
|
|
"email" TEXT NOT NULL,
|
|
"emailVerified" BOOLEAN NOT NULL DEFAULT false,
|
|
"image" TEXT,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
"role" TEXT NOT NULL DEFAULT 'USER',
|
|
"xp" INTEGER NOT NULL DEFAULT 0,
|
|
"level" INTEGER NOT NULL DEFAULT 1,
|
|
"banned" BOOLEAN NOT NULL DEFAULT false,
|
|
"bannedReason" TEXT,
|
|
|
|
CONSTRAINT "users_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "sessions" (
|
|
"id" TEXT NOT NULL,
|
|
"expiresAt" TIMESTAMP(3) NOT NULL,
|
|
"token" TEXT NOT NULL,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
"ipAddress" TEXT,
|
|
"userAgent" TEXT,
|
|
"userId" TEXT NOT NULL,
|
|
|
|
CONSTRAINT "sessions_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "accounts" (
|
|
"id" TEXT NOT NULL,
|
|
"accountId" TEXT NOT NULL,
|
|
"providerId" TEXT NOT NULL,
|
|
"userId" TEXT NOT NULL,
|
|
"accessToken" TEXT,
|
|
"refreshToken" TEXT,
|
|
"idToken" TEXT,
|
|
"accessTokenExpiresAt" TIMESTAMP(3),
|
|
"refreshTokenExpiresAt" TIMESTAMP(3),
|
|
"scope" TEXT,
|
|
"password" TEXT,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "accounts_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "verifications" (
|
|
"id" TEXT NOT NULL,
|
|
"identifier" TEXT NOT NULL,
|
|
"value" TEXT NOT NULL,
|
|
"expiresAt" TIMESTAMP(3) NOT NULL,
|
|
"createdAt" TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3),
|
|
|
|
CONSTRAINT "verifications_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "diseases" (
|
|
"id" TEXT NOT NULL,
|
|
"slug" TEXT NOT NULL,
|
|
"name" TEXT NOT NULL,
|
|
"nameEn" TEXT NOT NULL DEFAULT '',
|
|
"scientificName" TEXT NOT NULL DEFAULT '',
|
|
"type" "DiseaseType" NOT NULL,
|
|
"severity" "Severity" NOT NULL,
|
|
"description" TEXT NOT NULL,
|
|
"descriptionEn" TEXT NOT NULL DEFAULT '',
|
|
"symptoms" TEXT[],
|
|
"symptomsEn" TEXT[],
|
|
"treatment" TEXT NOT NULL,
|
|
"treatmentEn" TEXT NOT NULL DEFAULT '',
|
|
"season" TEXT NOT NULL,
|
|
"seasonEn" TEXT NOT NULL DEFAULT '',
|
|
"iconName" TEXT NOT NULL DEFAULT 'leaf',
|
|
"iconColor" TEXT NOT NULL DEFAULT '#1D9E75',
|
|
"bgColor" TEXT NOT NULL DEFAULT '#E1F5EE',
|
|
"imageUrl" TEXT,
|
|
"published" BOOLEAN NOT NULL DEFAULT true,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "diseases_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "guides" (
|
|
"id" TEXT NOT NULL,
|
|
"slug" TEXT NOT NULL,
|
|
"title" TEXT NOT NULL,
|
|
"titleEn" TEXT NOT NULL DEFAULT '',
|
|
"subtitle" TEXT NOT NULL,
|
|
"subtitleEn" TEXT NOT NULL DEFAULT '',
|
|
"content" TEXT NOT NULL,
|
|
"contentEn" TEXT NOT NULL DEFAULT '',
|
|
"category" TEXT NOT NULL DEFAULT 'general',
|
|
"iconName" TEXT NOT NULL DEFAULT 'book',
|
|
"iconColor" TEXT NOT NULL DEFAULT '#185FA5',
|
|
"bgColor" TEXT NOT NULL DEFAULT '#E6F1FB',
|
|
"published" BOOLEAN NOT NULL DEFAULT true,
|
|
"order" INTEGER NOT NULL DEFAULT 0,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "guides_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "scans" (
|
|
"id" TEXT NOT NULL,
|
|
"userId" TEXT NOT NULL,
|
|
"diseaseId" TEXT,
|
|
"confidence" DOUBLE PRECISION NOT NULL DEFAULT 0,
|
|
"latitude" DOUBLE PRECISION,
|
|
"longitude" DOUBLE PRECISION,
|
|
"imageUrl" TEXT,
|
|
"deviceId" TEXT,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "scans_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "season_alerts" (
|
|
"id" TEXT NOT NULL,
|
|
"title" TEXT NOT NULL,
|
|
"titleEn" TEXT NOT NULL DEFAULT '',
|
|
"message" TEXT NOT NULL,
|
|
"messageEn" TEXT NOT NULL DEFAULT '',
|
|
"type" "AlertType" NOT NULL DEFAULT 'WARNING',
|
|
"region" TEXT NOT NULL DEFAULT 'bordeaux',
|
|
"active" BOOLEAN NOT NULL DEFAULT true,
|
|
"activeFrom" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"activeTo" TIMESTAMP(3),
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "season_alerts_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "users_email_key" ON "users"("email");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "sessions_token_key" ON "sessions"("token");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "diseases_slug_key" ON "diseases"("slug");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "diseases_type_idx" ON "diseases"("type");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "diseases_severity_idx" ON "diseases"("severity");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "diseases_published_idx" ON "diseases"("published");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "guides_slug_key" ON "guides"("slug");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "guides_published_idx" ON "guides"("published");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "guides_order_idx" ON "guides"("order");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "scans_userId_idx" ON "scans"("userId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "scans_diseaseId_idx" ON "scans"("diseaseId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "scans_createdAt_idx" ON "scans"("createdAt");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "season_alerts_active_idx" ON "season_alerts"("active");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "season_alerts_region_idx" ON "season_alerts"("region");
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "sessions" ADD CONSTRAINT "sessions_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "accounts" ADD CONSTRAINT "accounts_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "scans" ADD CONSTRAINT "scans_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "scans" ADD CONSTRAINT "scans_diseaseId_fkey" FOREIGN KEY ("diseaseId") REFERENCES "diseases"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|