schema.prisma 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  1. // This is your Prisma schema file
  2. // Converted for MySQL
  3. generator client {
  4. provider = "prisma-client-js"
  5. }
  6. datasource db {
  7. provider = "mysql"
  8. url = env("DATABASE_URL")
  9. }
  10. enum UserRole {
  11. admin
  12. user
  13. }
  14. model User {
  15. id String @id
  16. firstName String @default("")
  17. lastName String @default("")
  18. name String
  19. email String @unique
  20. emailVerified Boolean
  21. image String?
  22. locale String? @default("fr")
  23. createdAt DateTime
  24. updatedAt DateTime
  25. sessions Session[]
  26. accounts Account[]
  27. feedbacks Feedbacks[]
  28. role UserRole? @default(user)
  29. banned Boolean? @default(false)
  30. banReason String?
  31. banExpires DateTime?
  32. WorkoutSession WorkoutSession[]
  33. @@map("user")
  34. }
  35. model Session {
  36. id String @id
  37. expiresAt DateTime
  38. token String @unique
  39. createdAt DateTime
  40. updatedAt DateTime
  41. ipAddress String?
  42. userAgent String?
  43. userId String
  44. user User @relation(fields: [userId], references: [id], onDelete: Cascade)
  45. impersonatedBy String?
  46. @@map("session")
  47. }
  48. model Account {
  49. id String @id
  50. accountId String
  51. providerId String
  52. userId String
  53. user User @relation(fields: [userId], references: [id], onDelete: Cascade)
  54. accessToken String?
  55. refreshToken String?
  56. idToken String?
  57. accessTokenExpiresAt DateTime?
  58. refreshTokenExpiresAt DateTime?
  59. scope String?
  60. password String?
  61. createdAt DateTime
  62. updatedAt DateTime
  63. @@map("account")
  64. }
  65. model Verification {
  66. id String @id
  67. identifier String
  68. value String
  69. expiresAt DateTime
  70. createdAt DateTime?
  71. updatedAt DateTime?
  72. @@map("verification")
  73. }
  74. model Feedbacks {
  75. id String @id @default(cuid())
  76. review Int
  77. message String
  78. email String?
  79. userId String?
  80. user User? @relation(fields: [userId], references: [id], onDelete: SetNull)
  81. createdAt DateTime @default(now())
  82. updatedAt DateTime @updatedAt
  83. @@map("feedbacks")
  84. }
  85. model Exercise {
  86. id String @id @default(cuid())
  87. name String
  88. nameEn String?
  89. description String?
  90. descriptionEn String?
  91. fullVideoUrl String?
  92. fullVideoImageUrl String?
  93. introduction String?
  94. introductionEn String?
  95. slug String? @unique
  96. slugEn String? @unique
  97. createdAt DateTime @default(now())
  98. updatedAt DateTime @updatedAt
  99. // Relations
  100. attributes ExerciseAttribute[]
  101. WorkoutSessionExercise WorkoutSessionExercise[]
  102. @@map("exercises")
  103. }
  104. model ExerciseAttributeName {
  105. id String @id @default(cuid())
  106. name ExerciseAttributeNameEnum @unique
  107. createdAt DateTime @default(now())
  108. updatedAt DateTime @updatedAt
  109. // Relations
  110. values ExerciseAttributeValue[]
  111. attributes ExerciseAttribute[]
  112. @@map("exercise_attribute_names")
  113. }
  114. model ExerciseAttributeValue {
  115. id String @id @default(cuid())
  116. attributeNameId String
  117. value ExerciseAttributeValueEnum
  118. createdAt DateTime @default(now())
  119. updatedAt DateTime @updatedAt
  120. // Relations
  121. attributeName ExerciseAttributeName @relation(fields: [attributeNameId], references: [id])
  122. attributes ExerciseAttribute[]
  123. @@unique([attributeNameId, value])
  124. @@map("exercise_attribute_values")
  125. }
  126. model ExerciseAttribute {
  127. id String @id @default(cuid())
  128. exerciseId String
  129. attributeNameId String
  130. attributeValueId String
  131. createdAt DateTime @default(now())
  132. updatedAt DateTime @updatedAt
  133. // Relations
  134. exercise Exercise @relation(fields: [exerciseId], references: [id], onDelete: Cascade)
  135. attributeName ExerciseAttributeName @relation(fields: [attributeNameId], references: [id])
  136. attributeValue ExerciseAttributeValue @relation(fields: [attributeValueId], references: [id])
  137. @@unique([exerciseId, attributeNameId, attributeValueId])
  138. @@map("exercise_attributes")
  139. }
  140. enum ExercisePrivacy {
  141. PUBLIC
  142. PRIVATE
  143. }
  144. enum ExerciseAttributeNameEnum {
  145. TYPE
  146. PRIMARY_MUSCLE
  147. SECONDARY_MUSCLE
  148. EQUIPMENT
  149. MECHANICS_TYPE
  150. }
  151. enum ExerciseAttributeValueEnum {
  152. BODYWEIGHT
  153. STRENGTH
  154. POWERLIFTING
  155. CALISTHENIC
  156. PLYOMETRICS
  157. STRETCHING
  158. STRONGMAN
  159. CARDIO
  160. STABILIZATION
  161. POWER
  162. RESISTANCE
  163. CROSSFIT
  164. WEIGHTLIFTING
  165. BICEPS
  166. SHOULDERS
  167. CHEST
  168. BACK
  169. GLUTES
  170. TRICEPS
  171. HAMSTRINGS
  172. QUADRICEPS
  173. FOREARMS
  174. CALVES
  175. TRAPS
  176. ABDOMINALS
  177. NECK
  178. LATS
  179. ADDUCTORS
  180. ABDUCTORS
  181. OBLIQUES
  182. GROIN
  183. FULL_BODY
  184. ROTATOR_CUFF
  185. HIP_FLEXOR
  186. ACHILLES_TENDON
  187. FINGERS
  188. DUMBBELL
  189. KETTLEBELLS
  190. BARBELL
  191. SMITH_MACHINE
  192. BODY_ONLY
  193. OTHER
  194. BANDS
  195. EZ_BAR
  196. MACHINE
  197. DESK
  198. PULLUP_BAR
  199. NONE
  200. CABLE
  201. MEDICINE_BALL
  202. SWISS_BALL
  203. FOAM_ROLL
  204. WEIGHT_PLATE
  205. TRX
  206. BOX
  207. ROPES
  208. SPIN_BIKE
  209. STEP
  210. BOSU
  211. TYRE
  212. SANDBAG
  213. POLE
  214. BENCH
  215. WALL
  216. BAR
  217. RACK
  218. CAR
  219. SLED
  220. CHAIN
  221. SKIERG
  222. ROPE
  223. NA
  224. ISOLATION
  225. COMPOUND
  226. ABS
  227. PUSH
  228. PULL
  229. SQUAT
  230. HINGE
  231. LUNGE
  232. CARRY
  233. ROTATION
  234. KETTLEBELL
  235. RESISTANCE_BAND
  236. BODYWEIGHT_EQUIPMENT
  237. DELTOIDS
  238. PECTORALS
  239. LOWER_BACK
  240. UPPER_BACK
  241. }
  242. model WorkoutSession {
  243. id String @id @default(cuid())
  244. userId String
  245. user User @relation(fields: [userId], references: [id])
  246. startedAt DateTime
  247. endedAt DateTime?
  248. duration Int? // en secondes
  249. exercises WorkoutSessionExercise[]
  250. muscles Json @default("[]")
  251. @@map("workout_sessions")
  252. }
  253. model WorkoutSessionExercise {
  254. id String @id @default(cuid())
  255. workoutSessionId String
  256. exerciseId String
  257. order Int
  258. workoutSession WorkoutSession @relation(fields: [workoutSessionId], references: [id], onDelete: Cascade)
  259. exercise Exercise @relation(fields: [exerciseId], references: [id])
  260. sets WorkoutSet[]
  261. @@map("workout_session_exercises")
  262. }
  263. model WorkoutSet {
  264. id String @id @default(cuid())
  265. workoutSessionExerciseId String
  266. setIndex Int
  267. type WorkoutSetType
  268. types Json @default("[]")
  269. valuesInt Json @default("[]")
  270. valuesSec Json @default("[]")
  271. units Json @default("[]")
  272. completed Boolean @default(false)
  273. workoutSessionExercise WorkoutSessionExercise @relation(fields: [workoutSessionExerciseId], references: [id], onDelete: Cascade)
  274. @@map("workout_sets")
  275. }
  276. enum WorkoutSetType {
  277. TIME
  278. WEIGHT
  279. REPS
  280. BODYWEIGHT
  281. NA
  282. }
  283. enum WorkoutSetUnit {
  284. kg
  285. lbs
  286. }