init: pulseform v2 — Express/Prisma/React/SCSS/R3F stack
This commit is contained in:
225
backend/prisma/schema.prisma
Normal file
225
backend/prisma/schema.prisma
Normal file
@@ -0,0 +1,225 @@
|
||||
generator client {
|
||||
provider = "prisma-client-js"
|
||||
}
|
||||
|
||||
datasource db {
|
||||
provider = "postgresql"
|
||||
url = env("DATABASE_URL")
|
||||
}
|
||||
|
||||
// ─── 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")
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user