generator client { provider = "prisma-client-js" } datasource db { provider = "postgresql" } model Session { id String @id @default(uuid()) token String @unique userId String user User @relation(fields: [userId], references: [id], onDelete: Cascade) expiresAt DateTime createdAt DateTime @default(now()) @@index([userId]) @@index([token]) } model User { id String @id @default(uuid()) username String @unique password String // Bcrypt hash for login auth skywardPassword String // Encrypted password for Skyward API calls createdAt DateTime @default(now()) classes Class[] fetches Fetch[] finalGrades FinalGrade[] sessions Session[] } model Class { id String @id @default(uuid()) userId String user User @relation(fields: [userId], references: [id], onDelete: Cascade) className String teacher String period String category String createdAt DateTime @default(now()) assignments Assignment[] finalGrades FinalGrade[] @@unique([userId, category, className]) @@index([userId]) } model Assignment { id String @id @default(uuid()) classId String class Class @relation(fields: [classId], references: [id], onDelete: Cascade) name String dueDate String score String attempts String isMajorGrade Boolean createdAt DateTime @default(now()) @@index([classId]) } model FinalGrade { id String @id @default(uuid()) userId String user User @relation(fields: [userId], references: [id], onDelete: Cascade) classId String class Class @relation(fields: [classId], references: [id], onDelete: Cascade) grade String // The overall grade (e.g., "95.5%", "A", etc.) updatedAt DateTime @default(now()) @updatedAt @@unique([userId, classId]) // One final grade per user per class @@index([userId]) @@index([classId]) } model Fetch { id String @id @default(uuid()) userId String user User @relation(fields: [userId], references: [id], onDelete: Cascade) timestamp DateTime @default(now()) success Boolean @default(true) classCount Int @default(0) @@index([userId]) }