| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| generator client { |
| provider = "prisma-client-js" |
| } |
|
|
| datasource db { |
| provider = "sqlite" |
| url = env("DATABASE_URL") |
| } |
|
|
| model User { |
| id Int @id @default(autoincrement()) |
| email String @unique |
| passwordHash String |
| isActive Boolean @default(true) |
| telegramChatId String? |
| createdAt DateTime @default(now()) |
| updatedAt DateTime @updatedAt |
|
|
| positions Position[] |
| watchlist Watchlist[] |
| alerts Alert[] |
| } |
|
|
| model Market { |
| id String @id |
| question String |
| category String? |
| countryCode String? |
| yesPrice Float? |
| noPrice Float? |
| volumeEur Float? |
| liquidityEur Float? |
| spread Float? |
| bestBid Float? |
| bestAsk Float? |
| clobTokenId String? |
| analyzable Boolean @default(true) |
| status String @default("active") |
| closesAt DateTime? |
| lastSynced DateTime @default(now()) |
|
|
| signals AISignal[] |
| positions Position[] |
| watchlist Watchlist[] |
| alerts Alert[] |
| } |
|
|
| model AISignal { |
| id Int @id @default(autoincrement()) |
| marketId String |
| market Market @relation(fields: [marketId], references: [id], onDelete: Cascade) |
| signal String |
| confidence Float |
| summary String? |
| keyRisk String? |
| newsCount Int @default(0) |
| modelVersion String @default("Qwen3-8B") |
| impliedProb Float? |
| fairProb Float? |
| edgePoints Float? |
| generatedAt DateTime @default(now()) |
|
|
| @@index([marketId, generatedAt]) |
| } |
|
|
| model Position { |
| id Int @id @default(autoincrement()) |
| userId Int |
| user User @relation(fields: [userId], references: [id], onDelete: Cascade) |
| marketId String |
| market Market @relation(fields: [marketId], references: [id], onDelete: Cascade) |
| outcome String |
| amountEur Float |
| entryPrice Float |
| currentPrice Float? |
| pnl Float @default(0) |
| kellyFraction Float? |
| status String @default("open") |
| openedAt DateTime @default(now()) |
| closedAt DateTime? |
|
|
| @@index([userId, status]) |
| @@index([marketId]) |
| } |
|
|
| model Watchlist { |
| id Int @id @default(autoincrement()) |
| userId Int |
| user User @relation(fields: [userId], references: [id], onDelete: Cascade) |
| marketId String |
| market Market @relation(fields: [marketId], references: [id], onDelete: Cascade) |
| alertThreshold Float? |
| createdAt DateTime @default(now()) |
|
|
| @@unique([userId, marketId]) |
| @@index([userId]) |
| } |
|
|
| model Alert { |
| id Int @id @default(autoincrement()) |
| userId Int |
| user User @relation(fields: [userId], references: [id], onDelete: Cascade) |
| marketId String |
| market Market @relation(fields: [marketId], references: [id], onDelete: Cascade) |
| type String |
| message String |
| sentAt DateTime @default(now()) |
|
|
| @@index([userId, sentAt]) |
| @@index([marketId]) |
| } |
|
|