// This is your Prisma schema file, // learn more about it in the docs: https://pris.ly/d/prisma-schema // Get a free hosted Postgres database in seconds: `npx create-db` generator client { provider = "prisma-client" output = "../generated/prisma" } datasource db { provider = "mysql" } model User { id String @id name String @db.Text email String emailVerified Boolean @default(false) image String? @db.Text createdAt DateTime @default(now()) updatedAt DateTime @updatedAt sessions Session[] accounts Account[] mesoCycle MesoCycle[] workoutSession WorkoutSession[] @@unique([email]) @@map("user") } model Session { id String @id expiresAt DateTime token String createdAt DateTime @default(now()) updatedAt DateTime @updatedAt ipAddress String? @db.Text userAgent String? @db.Text userId String user User @relation(fields: [userId], references: [id], onDelete: Cascade) @@unique([token]) @@index([userId(length: 191)]) @@map("session") } model Account { id String @id accountId String @db.Text providerId String @db.Text userId String user User @relation(fields: [userId], references: [id], onDelete: Cascade) accessToken String? @db.Text refreshToken String? @db.Text idToken String? @db.Text accessTokenExpiresAt DateTime? refreshTokenExpiresAt DateTime? scope String? @db.Text password String? @db.Text createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@index([userId(length: 191)]) @@map("account") } model Verification { id String @id identifier String @db.Text value String @db.Text expiresAt DateTime createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@index([identifier(length: 191)]) @@map("verification") } model Exercise { id Int @id @default(autoincrement()) name String muscleGroup String SFR Decimal mesoCycleExercises MesoCycleExercise[] } model MesoCycle { id Int @id @default(autoincrement()) name String totalWeeks Int currentWeek Int isAsync Boolean user User @relation(fields: [userId], references: [id]) userId String mesoCycleDays MesoCycleDay[] } model MesoCycleDay { id Int @id @default(autoincrement()) weekday String? // If async === NULL orderIndex Int mesoCycle MesoCycle @relation(fields: [mesoCycleId], references: [id]) mesoCycleId Int mesoCycleExercises MesoCycleExercise[] workOutSessions WorkoutSession[] } model MesoCycleExercise { id Int @id @default(autoincrement()) startingSets Int orderIndex Int mesoCycleDay MesoCycleDay @relation(fields: [mesoCycleDayId], references: [id]) mesoCycleDayId Int exercise Exercise @relation(fields: [exerciseId], references: [id]) exerciseId Int exerciseLogs ExerciseLog[] } model WorkoutSession { id Int @id @default(autoincrement()) weekNumber Int isDeload Boolean completedAt DateTime? // Null until finished mesoCycleDay MesoCycleDay @relation(fields: [mesoCycleDayId], references: [id]) mesoCycleDayId Int user User @relation(fields: [userId], references: [id]) userId String exerciseLogs ExerciseLog[] } model ExerciseLog { id Int @id @default(autoincrement()) sets Int reps Int weight Decimal workoutSession WorkoutSession @relation(fields: [workoutSessionId], references: [id]) workoutSessionId Int mesoCycleExercise MesoCycleExercise @relation(fields: [mesoCycleExerciseId], references: [id]) mesoCycleExerciseId Int sessionFeedbacks SessionFeedback[] } model SessionFeedback { id Int @id @default(autoincrement()) question String answer String exerciseLog ExerciseLog @relation(fields: [exerciseLogId], references: [id]) exerciseLogId Int }