← back to Handbag Auth Nextjs
prisma/schema.prisma
132 lines
// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "sqlite"
url = env("DATABASE_URL")
}
model Listing {
id Int @id @default(autoincrement())
externalId String? @unique @map("external_id")
source String
title String
brand String?
model String?
priceJpy Float @map("price_jpy")
priceUsd Float? @map("price_usd")
currency String?
condition String?
imageUrl String? @map("image_url")
thumbnailUrl String? @map("thumbnail_url")
productUrl String? @map("product_url")
listingType String? @map("listing_type")
auctionEndDate String? @map("auction_end_date")
location String?
sellerName String? @map("seller_name")
description String?
crawledAt String? @map("crawled_at")
isActive Int @default(1) @map("is_active")
isNew Int? @default(0) @map("is_new")
usComparisons UsComparison[]
dealAnalysis DealAnalysis?
priceHistory PriceHistory[]
@@unique([externalId, source])
@@index([brand])
@@index([priceUsd])
@@index([listingType])
@@index([crawledAt])
@@map("listings")
}
model UsComparison {
id Int @id @default(autoincrement())
listingId Int @map("listing_id")
usSource String @map("us_source")
usPriceUsd Float? @map("us_price_usd")
usUrl String? @map("us_url")
usCondition String? @map("us_condition")
comparisonDate String? @map("comparison_date")
listing Listing @relation(fields: [listingId], references: [id], onDelete: Cascade)
@@map("us_comparisons")
}
model DealAnalysis {
id Int @id @default(autoincrement())
listingId Int @unique @map("listing_id")
avgUsPrice Float? @map("avg_us_price")
minUsPrice Float? @map("min_us_price")
maxUsPrice Float? @map("max_us_price")
dealPercentage Float? @map("deal_percentage")
confidenceScore Float? @map("confidence_score")
isDeal Int @default(0) @map("is_deal")
analysisDate String? @map("analysis_date")
aiNotes String? @map("ai_notes")
listing Listing @relation(fields: [listingId], references: [id], onDelete: Cascade)
@@index([dealPercentage])
@@index([isDeal])
@@map("deal_analysis")
}
model CrawlHistory {
id Int @id @default(autoincrement())
source String
startTime String? @map("start_time")
endTime String? @map("end_time")
itemsFound Int @default(0) @map("items_found")
itemsAdded Int @default(0) @map("items_added")
itemsUpdated Int @default(0) @map("items_updated")
status String // running, completed, failed
errorMessage String? @map("error_message")
@@map("crawl_history")
}
model PriceHistory {
id Int @id @default(autoincrement())
listingId Int @map("listing_id")
externalId String @map("external_id")
source String
priceJpy Float @map("price_jpy")
priceUsd Float? @map("price_usd")
condition String?
listingType String? @map("listing_type")
recordedAt String @map("recorded_at")
isAvailable Int @default(1) @map("is_available")
listing Listing @relation(fields: [listingId], references: [id], onDelete: Cascade)
@@index([externalId])
@@index([listingId])
@@index([recordedAt])
@@map("price_history")
}
model PriceAlert {
id Int @id @default(autoincrement())
listingId Int @map("listing_id")
externalId String @map("external_id")
userEmail String? @map("user_email")
targetPrice Float @map("target_price")
alertType String @default("below") // below, above, change
isActive Int @default(1) @map("is_active")
createdAt String @map("created_at")
triggeredAt String? @map("triggered_at")
notified Int @default(0)
@@index([externalId])
@@index([listingId])
@@index([isActive])
@@map("price_alerts")
}