This commit is contained in:
talorr
2026-03-27 03:36:08 +03:00
parent 8a97ce6d54
commit cda36918e8
225 changed files with 35641 additions and 0 deletions

View File

@@ -0,0 +1,210 @@
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())
}