229 lines
6.5 KiB
Plaintext
229 lines
6.5 KiB
Plaintext
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")
|
|
}
|
|
|