generator client { provider = "prisma-client-js" } datasource db { provider = "postgresql" } // ─── Enums ─────────────────────────────────────────────────────────────────── enum Role { USER COACH ADMIN } enum Difficulty { BEGINNER INTERMEDIATE ADVANCED } enum GroupRole { MEMBER COACH ADMIN } enum FriendStatus { PENDING ACCEPTED REJECTED } // ─── User ──────────────────────────────────────────────────────────────────── model User { id String @id @default(uuid()) username String @unique email String @unique password String role Role @default(USER) avatar String? bio String? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt programs Program[] histories History[] groupMemberships GroupMember[] sentRequests FriendRequest[] @relation("SentRequests") receivedRequests FriendRequest[] @relation("ReceivedRequests") rewards UserReward[] @@map("users") } // ─── Exercise ──────────────────────────────────────────────────────────────── model Exercise { id String @id @default(uuid()) name String description String? difficulty Difficulty @default(BEGINNER) modelPath String? muscleGroups String[] createdAt DateTime @default(now()) updatedAt DateTime @updatedAt programExercises ProgramExercise[] historyEntries HistoryEntry[] @@map("exercises") } // ─── Program ───────────────────────────────────────────────────────────────── model Program { id String @id @default(uuid()) name String description String? isPublic Boolean @default(false) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt authorId String author User @relation(fields: [authorId], references: [id], onDelete: Cascade) exercises ProgramExercise[] groups GroupProgram[] histories History[] @@map("programs") } model ProgramExercise { id String @id @default(uuid()) sets Int reps Int? durationSec Int? order Int @default(0) programId String program Program @relation(fields: [programId], references: [id], onDelete: Cascade) exerciseId String exercise Exercise @relation(fields: [exerciseId], references: [id], onDelete: Cascade) @@unique([programId, exerciseId]) @@map("program_exercises") } // ─── History ───────────────────────────────────────────────────────────────── model History { id String @id @default(uuid()) date DateTime @default(now()) completedAt DateTime? notes String? userId String user User @relation(fields: [userId], references: [id], onDelete: Cascade) programId String program Program @relation(fields: [programId], references: [id], onDelete: Cascade) entries HistoryEntry[] @@map("histories") } model HistoryEntry { id String @id @default(uuid()) sets Int reps Int? weightKg Float? durationSec Int? historyId String history History @relation(fields: [historyId], references: [id], onDelete: Cascade) exerciseId String exercise Exercise @relation(fields: [exerciseId], references: [id], onDelete: Cascade) @@map("history_entries") } // ─── Group ─────────────────────────────────────────────────────────────────── model Group { id String @id @default(uuid()) name String description String? isPublic Boolean @default(false) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt members GroupMember[] programs GroupProgram[] @@map("groups") } model GroupMember { role GroupRole @default(MEMBER) joinedAt DateTime @default(now()) groupId String group Group @relation(fields: [groupId], references: [id], onDelete: Cascade) userId String user User @relation(fields: [userId], references: [id], onDelete: Cascade) @@id([groupId, userId]) @@map("group_members") } model GroupProgram { addedAt DateTime @default(now()) groupId String group Group @relation(fields: [groupId], references: [id], onDelete: Cascade) programId String program Program @relation(fields: [programId], references: [id], onDelete: Cascade) @@id([groupId, programId]) @@map("group_programs") } // ─── Friends ───────────────────────────────────────────────────────────────── model FriendRequest { id String @id @default(uuid()) status FriendStatus @default(PENDING) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt senderId String sender User @relation("SentRequests", fields: [senderId], references: [id], onDelete: Cascade) receiverId String receiver User @relation("ReceivedRequests", fields: [receiverId], references: [id], onDelete: Cascade) @@unique([senderId, receiverId]) @@map("friend_requests") } // ─── Rewards ───────────────────────────────────────────────────────────────── model Reward { id String @id @default(uuid()) name String description String iconPath String? condition String users UserReward[] @@map("rewards") } model UserReward { earnedAt DateTime @default(now()) userId String user User @relation(fields: [userId], references: [id], onDelete: Cascade) rewardId String reward Reward @relation(fields: [rewardId], references: [id], onDelete: Cascade) @@id([userId, rewardId]) @@map("user_rewards") }