Files
pulseform/backend/prisma/schema.prisma

225 lines
6.3 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[]
@@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())
notes String?
userId String
user User @relation(fields: [userId], 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")
}