This commit is contained in:
echo committed 2025-05-06 10:01:03 +02:00
commit 0fa3c7ac48
140 files changed
+24289

No files matched your search

@@ -0,0 +1,58 @@
-- CreateTable
CREATE TABLE "Product" (
"id" SERIAL NOT NULL,
"name" TEXT NOT NULL,
"description" TEXT,
"category" TEXT NOT NULL,
"availability" BOOLEAN NOT NULL DEFAULT true,
"sourceProductId" TEXT,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL,
"sourceId" INTEGER NOT NULL,
CONSTRAINT "Product_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "Price" (
"id" SERIAL NOT NULL,
"productId" INTEGER NOT NULL,
"sourceId" INTEGER NOT NULL,
"regularPrice" DOUBLE PRECISION NOT NULL,
"discountedPrice" DOUBLE PRECISION,
"discountPercentage" DOUBLE PRECISION,
"unitPrice" TEXT,
"promotionType" TEXT,
"promotionStart" TIMESTAMP(3),
"promotionEnd" TIMESTAMP(3),
"vatIncluded" BOOLEAN NOT NULL DEFAULT true,
"lastUpdated" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "Price_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "Source" (
"id" SERIAL NOT NULL,
"name" TEXT NOT NULL,
"url" TEXT NOT NULL,
"logo" TEXT,
"lastScraped" TIMESTAMP(3),
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL,
CONSTRAINT "Source_pkey" PRIMARY KEY ("id")
);
-- CreateIndex
CREATE UNIQUE INDEX "Product_name_sourceId_key" ON "Product"("name", "sourceId");
-- CreateIndex
CREATE UNIQUE INDEX "Source_name_key" ON "Source"("name");
-- AddForeignKey
ALTER TABLE "Price" ADD CONSTRAINT "Price_productId_fkey" FOREIGN KEY ("productId") REFERENCES "Product"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "Price" ADD CONSTRAINT "Price_sourceId_fkey" FOREIGN KEY ("sourceId") REFERENCES "Source"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
@@ -0,0 +1,56 @@
-- CreateTable
CREATE TABLE "User" (
"id" SERIAL NOT NULL,
"email" TEXT NOT NULL,
"name" TEXT,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL,
CONSTRAINT "User_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "WatchlistItem" (
"id" SERIAL NOT NULL,
"userId" INTEGER NOT NULL,
"productId" INTEGER NOT NULL,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "WatchlistItem_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "Notification" (
"id" SERIAL NOT NULL,
"userId" INTEGER NOT NULL,
"productId" INTEGER NOT NULL,
"priceThreshold" DOUBLE PRECISION,
"percentThreshold" DOUBLE PRECISION,
"notifyOnAnyChange" BOOLEAN NOT NULL DEFAULT false,
"isActive" BOOLEAN NOT NULL DEFAULT true,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL,
CONSTRAINT "Notification_pkey" PRIMARY KEY ("id")
);
-- CreateIndex
CREATE UNIQUE INDEX "User_email_key" ON "User"("email");
-- CreateIndex
CREATE UNIQUE INDEX "WatchlistItem_userId_productId_key" ON "WatchlistItem"("userId", "productId");
-- CreateIndex
CREATE UNIQUE INDEX "Notification_userId_productId_key" ON "Notification"("userId", "productId");
-- AddForeignKey
ALTER TABLE "WatchlistItem" ADD CONSTRAINT "WatchlistItem_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "WatchlistItem" ADD CONSTRAINT "WatchlistItem_productId_fkey" FOREIGN KEY ("productId") REFERENCES "Product"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "Notification" ADD CONSTRAINT "Notification_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "Notification" ADD CONSTRAINT "Notification_productId_fkey" FOREIGN KEY ("productId") REFERENCES "Product"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
@@ -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"
+92
View File
@@ -0,0 +1,92 @@
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
directUrl = env("DIRECT_URL")
}
model Product {
id Int @id @default(autoincrement())
name String
description String?
category String
availability Boolean @default(true)
sourceProductId String? // Original ID from the source
prices Price[]
watchlistItems WatchlistItem[]
notifications Notification[]
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
sourceId Int // Added for the composite unique constraint
@@unique([name, sourceId])
}
model Price {
id Int @id @default(autoincrement())
productId Int
product Product @relation(fields: [productId], references: [id])
sourceId Int
source Source @relation(fields: [sourceId], references: [id])
regularPrice Float
discountedPrice Float?
discountPercentage Float?
unitPrice String?
promotionType String?
promotionStart DateTime?
promotionEnd DateTime?
vatIncluded Boolean @default(true)
lastUpdated DateTime @default(now())
createdAt DateTime @default(now())
}
model Source {
id Int @id @default(autoincrement())
name String @unique
url String
logo String?
lastScraped DateTime?
prices Price[]
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
watchlist WatchlistItem[]
notifications Notification[]
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model WatchlistItem {
id Int @id @default(autoincrement())
userId Int
user User @relation(fields: [userId], references: [id])
productId Int
product Product @relation(fields: [productId], references: [id])
createdAt DateTime @default(now())
@@unique([userId, productId])
}
model Notification {
id Int @id @default(autoincrement())
userId Int
user User @relation(fields: [userId], references: [id])
productId Int
product Product @relation(fields: [productId], references: [id])
priceThreshold Float?
percentThreshold Float?
notifyOnAnyChange Boolean @default(false)
isActive Boolean @default(true)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@unique([userId, productId])
}