211 lines
5.6 KiB
Plaintext
211 lines
5.6 KiB
Plaintext
generator client {
|
|
provider = "prisma-client-js"
|
|
}
|
|
|
|
datasource db {
|
|
provider = "postgresql"
|
|
url = env("DATABASE_URL")
|
|
}
|
|
|
|
enum UserRole {
|
|
admin
|
|
user
|
|
}
|
|
|
|
enum SignalStatus {
|
|
pending
|
|
win
|
|
lose
|
|
void
|
|
manual_review
|
|
unpublished
|
|
}
|
|
|
|
enum SourceType {
|
|
manual
|
|
provider
|
|
}
|
|
|
|
enum SubscriptionStatus {
|
|
active
|
|
expired
|
|
canceled
|
|
}
|
|
|
|
model User {
|
|
id String @id @default(cuid())
|
|
email String @unique
|
|
passwordHash String
|
|
role UserRole @default(user)
|
|
active Boolean @default(true)
|
|
sessionVersion Int @default(0)
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
notificationSetting NotificationSetting?
|
|
pushSubscriptions PushSubscription[]
|
|
nativePushSubscriptions NativePushSubscription[]
|
|
botAccesses UserBotAccess[]
|
|
passwordResetTokens PasswordResetToken[]
|
|
adminActions AdminActionLog[]
|
|
}
|
|
|
|
model PasswordResetToken {
|
|
id String @id @default(cuid())
|
|
userId String
|
|
tokenHash String @unique
|
|
expiresAt DateTime
|
|
usedAt DateTime?
|
|
createdAt DateTime @default(now())
|
|
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
|
|
@@index([userId])
|
|
@@index([expiresAt])
|
|
}
|
|
|
|
model Bot {
|
|
id String @id @default(cuid())
|
|
key String @unique
|
|
name String
|
|
sourceUrl String
|
|
active Boolean @default(true)
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
userAccesses UserBotAccess[]
|
|
}
|
|
|
|
model UserBotAccess {
|
|
id String @id @default(cuid())
|
|
userId String
|
|
botId String
|
|
status SubscriptionStatus @default(active)
|
|
startsAt DateTime @default(now())
|
|
expiresAt DateTime?
|
|
notes String?
|
|
grantedAt DateTime @default(now())
|
|
grantedById String?
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
bot Bot @relation(fields: [botId], references: [id], onDelete: Cascade)
|
|
|
|
@@unique([userId, botId])
|
|
}
|
|
|
|
model Signal {
|
|
id String @id @default(cuid())
|
|
providerId String?
|
|
eventId String
|
|
sportType String
|
|
leagueName String
|
|
homeTeam String
|
|
awayTeam String
|
|
eventStartTime DateTime
|
|
marketType String
|
|
selection String
|
|
forecast String?
|
|
lineValue Float?
|
|
odds Float
|
|
signalTime DateTime
|
|
status SignalStatus @default(pending)
|
|
sourceType SourceType
|
|
comment String?
|
|
published Boolean @default(true)
|
|
dedupeKey String @unique
|
|
rawPayload Json?
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
settlement Settlement?
|
|
notifications NotificationLog[]
|
|
}
|
|
|
|
model EventResult {
|
|
id String @id @default(cuid())
|
|
eventId String @unique
|
|
homeScore Int?
|
|
awayScore Int?
|
|
status String
|
|
payload Json?
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
}
|
|
|
|
model Settlement {
|
|
id String @id @default(cuid())
|
|
signalId String @unique
|
|
result SignalStatus
|
|
explanation String
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
signal Signal @relation(fields: [signalId], references: [id], onDelete: Cascade)
|
|
}
|
|
|
|
model PushSubscription {
|
|
id String @id @default(cuid())
|
|
userId String
|
|
endpoint String
|
|
p256dh String
|
|
auth String
|
|
active Boolean @default(true)
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
|
|
@@unique([userId, endpoint])
|
|
}
|
|
|
|
model NativePushSubscription {
|
|
id String @id @default(cuid())
|
|
userId String
|
|
token String
|
|
platform String
|
|
deviceId String?
|
|
active Boolean @default(true)
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
|
|
@@unique([userId, token])
|
|
}
|
|
|
|
model NotificationSetting {
|
|
id String @id @default(cuid())
|
|
userId String @unique
|
|
signalsPushEnabled Boolean @default(true)
|
|
resultsPushEnabled Boolean @default(false)
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
}
|
|
|
|
model NotificationLog {
|
|
id String @id @default(cuid())
|
|
signalId String?
|
|
type String
|
|
recipients Int
|
|
successCount Int
|
|
failedCount Int
|
|
payload Json?
|
|
createdAt DateTime @default(now())
|
|
signal Signal? @relation(fields: [signalId], references: [id], onDelete: SetNull)
|
|
}
|
|
|
|
model AdminActionLog {
|
|
id String @id @default(cuid())
|
|
adminId String
|
|
action String
|
|
entityType String
|
|
entityId String
|
|
metadata Json?
|
|
createdAt DateTime @default(now())
|
|
admin User @relation(fields: [adminId], references: [id], onDelete: Cascade)
|
|
}
|
|
|
|
model IntegrationLog {
|
|
id String @id @default(cuid())
|
|
provider String
|
|
level String
|
|
message String
|
|
payload Json?
|
|
createdAt DateTime @default(now())
|
|
}
|