init
This commit is contained in:
210
backend/prisma/schema.prisma
Normal file
210
backend/prisma/schema.prisma
Normal 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())
|
||||
}
|
||||
Reference in New Issue
Block a user