@hed-hog/lms 0.0.358 → 0.0.364

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (330) hide show
  1. package/dist/bitcode-wallet/bitcode-wallet.service.d.ts +65 -0
  2. package/dist/bitcode-wallet/bitcode-wallet.service.d.ts.map +1 -1
  3. package/dist/bitcode-wallet/bitcode-wallet.service.js +72 -0
  4. package/dist/bitcode-wallet/bitcode-wallet.service.js.map +1 -1
  5. package/dist/bitcode-wallet/dto/create-current-bitcode-wallet-transaction.dto.d.ts +8 -0
  6. package/dist/bitcode-wallet/dto/create-current-bitcode-wallet-transaction.dto.d.ts.map +1 -0
  7. package/dist/bitcode-wallet/dto/create-current-bitcode-wallet-transaction.dto.js +40 -0
  8. package/dist/bitcode-wallet/dto/create-current-bitcode-wallet-transaction.dto.js.map +1 -0
  9. package/dist/class-group/class-group.controller.d.ts +16 -16
  10. package/dist/class-group/class-group.service.d.ts +12 -12
  11. package/dist/course/course-audio-transcription.service.d.ts +3 -2
  12. package/dist/course/course-audio-transcription.service.d.ts.map +1 -1
  13. package/dist/course/course-audio-transcription.service.js +49 -8
  14. package/dist/course/course-audio-transcription.service.js.map +1 -1
  15. package/dist/course/course-lesson.controller.d.ts +4 -0
  16. package/dist/course/course-lesson.controller.d.ts.map +1 -1
  17. package/dist/course/course-lesson.controller.js +10 -0
  18. package/dist/course/course-lesson.controller.js.map +1 -1
  19. package/dist/course/course-structure.controller.d.ts +11 -4
  20. package/dist/course/course-structure.controller.d.ts.map +1 -1
  21. package/dist/course/course-structure.controller.js +14 -0
  22. package/dist/course/course-structure.controller.js.map +1 -1
  23. package/dist/course/course-structure.service.d.ts +15 -1
  24. package/dist/course/course-structure.service.d.ts.map +1 -1
  25. package/dist/course/course-structure.service.js +139 -4
  26. package/dist/course/course-structure.service.js.map +1 -1
  27. package/dist/course/course-video-conversion.service.d.ts +8 -0
  28. package/dist/course/course-video-conversion.service.d.ts.map +1 -1
  29. package/dist/course/course-video-conversion.service.js +87 -51
  30. package/dist/course/course-video-conversion.service.js.map +1 -1
  31. package/dist/course/course.controller.d.ts +73 -1
  32. package/dist/course/course.controller.d.ts.map +1 -1
  33. package/dist/course/course.controller.js +27 -3
  34. package/dist/course/course.controller.js.map +1 -1
  35. package/dist/course/course.module.d.ts.map +1 -1
  36. package/dist/course/course.module.js +15 -3
  37. package/dist/course/course.module.js.map +1 -1
  38. package/dist/course/course.service.d.ts +108 -4
  39. package/dist/course/course.service.d.ts.map +1 -1
  40. package/dist/course/course.service.js +631 -30
  41. package/dist/course/course.service.js.map +1 -1
  42. package/dist/course/dto/cleanup-course-storage.dto.d.ts +6 -0
  43. package/dist/course/dto/cleanup-course-storage.dto.d.ts.map +1 -0
  44. package/dist/course/dto/cleanup-course-storage.dto.js +33 -0
  45. package/dist/course/dto/cleanup-course-storage.dto.js.map +1 -0
  46. package/dist/course/dto/cleanup-upload-history.dto.d.ts +9 -0
  47. package/dist/course/dto/cleanup-upload-history.dto.d.ts.map +1 -0
  48. package/dist/course/dto/cleanup-upload-history.dto.js +36 -0
  49. package/dist/course/dto/cleanup-upload-history.dto.js.map +1 -0
  50. package/dist/course/dto/create-course-bulk-job.dto.d.ts +4 -0
  51. package/dist/course/dto/create-course-bulk-job.dto.d.ts.map +1 -0
  52. package/dist/course/dto/create-course-bulk-job.dto.js +21 -0
  53. package/dist/course/dto/create-course-bulk-job.dto.js.map +1 -0
  54. package/dist/course/lms-bulk-upload-automation.service.d.ts +39 -0
  55. package/dist/course/lms-bulk-upload-automation.service.d.ts.map +1 -0
  56. package/dist/course/lms-bulk-upload-automation.service.js +443 -0
  57. package/dist/course/lms-bulk-upload-automation.service.js.map +1 -0
  58. package/dist/course/lms-bulk-upload-infra.service.d.ts +31 -0
  59. package/dist/course/lms-bulk-upload-infra.service.d.ts.map +1 -0
  60. package/dist/course/lms-bulk-upload-infra.service.js +277 -0
  61. package/dist/course/lms-bulk-upload-infra.service.js.map +1 -0
  62. package/dist/course/lms-bulk-upload.constants.d.ts +4 -0
  63. package/dist/course/lms-bulk-upload.constants.d.ts.map +1 -0
  64. package/dist/course/lms-bulk-upload.constants.js +7 -0
  65. package/dist/course/lms-bulk-upload.constants.js.map +1 -0
  66. package/dist/course/lms-bulk-upload.controller.d.ts +153 -0
  67. package/dist/course/lms-bulk-upload.controller.d.ts.map +1 -0
  68. package/dist/course/lms-bulk-upload.controller.js +129 -0
  69. package/dist/course/lms-bulk-upload.controller.js.map +1 -0
  70. package/dist/course/lms-bulk-upload.service.d.ts +181 -0
  71. package/dist/course/lms-bulk-upload.service.d.ts.map +1 -0
  72. package/dist/course/lms-bulk-upload.service.js +754 -0
  73. package/dist/course/lms-bulk-upload.service.js.map +1 -0
  74. package/dist/course/lms-setting.controller.d.ts +7 -1
  75. package/dist/course/lms-setting.controller.d.ts.map +1 -1
  76. package/dist/course/lms-setting.controller.js +26 -3
  77. package/dist/course/lms-setting.controller.js.map +1 -1
  78. package/dist/enterprise/enterprise.controller.d.ts +20 -20
  79. package/dist/enterprise/enterprise.service.d.ts +20 -20
  80. package/dist/enterprise/training/training-admin.controller.d.ts +11 -11
  81. package/dist/enterprise/training/training-admin.service.d.ts +11 -11
  82. package/dist/enterprise/training/training-instructor.controller.d.ts +2 -2
  83. package/dist/enterprise/training/training-instructor.service.d.ts +2 -2
  84. package/dist/enterprise/training/training-student.controller.d.ts +1 -1
  85. package/dist/enterprise/training/training-student.service.d.ts +1 -1
  86. package/dist/enterprise/training/training-viewer.controller.d.ts +2 -2
  87. package/dist/evaluation/evaluation.controller.d.ts +8 -8
  88. package/dist/evaluation/evaluation.service.d.ts +8 -8
  89. package/dist/lesson-xp-map/dto/create-lesson-xp-map.dto.d.ts +6 -0
  90. package/dist/lesson-xp-map/dto/create-lesson-xp-map.dto.d.ts.map +1 -0
  91. package/dist/lesson-xp-map/dto/create-lesson-xp-map.dto.js +34 -0
  92. package/dist/lesson-xp-map/dto/create-lesson-xp-map.dto.js.map +1 -0
  93. package/dist/lesson-xp-map/dto/create-lesson-xp-segment.dto.d.ts +28 -0
  94. package/dist/lesson-xp-map/dto/create-lesson-xp-segment.dto.d.ts.map +1 -0
  95. package/dist/lesson-xp-map/dto/create-lesson-xp-segment.dto.js +123 -0
  96. package/dist/lesson-xp-map/dto/create-lesson-xp-segment.dto.js.map +1 -0
  97. package/dist/lesson-xp-map/dto/review-lesson-xp-map.dto.d.ts +4 -0
  98. package/dist/lesson-xp-map/dto/review-lesson-xp-map.dto.d.ts.map +1 -0
  99. package/dist/lesson-xp-map/dto/review-lesson-xp-map.dto.js +22 -0
  100. package/dist/lesson-xp-map/dto/review-lesson-xp-map.dto.js.map +1 -0
  101. package/dist/lesson-xp-map/dto/update-lesson-xp-map.dto.d.ts +10 -0
  102. package/dist/lesson-xp-map/dto/update-lesson-xp-map.dto.d.ts.map +1 -0
  103. package/dist/lesson-xp-map/dto/update-lesson-xp-map.dto.js +52 -0
  104. package/dist/lesson-xp-map/dto/update-lesson-xp-map.dto.js.map +1 -0
  105. package/dist/lesson-xp-map/dto/update-lesson-xp-segment.dto.d.ts +15 -0
  106. package/dist/lesson-xp-map/dto/update-lesson-xp-segment.dto.d.ts.map +1 -0
  107. package/dist/lesson-xp-map/dto/update-lesson-xp-segment.dto.js +86 -0
  108. package/dist/lesson-xp-map/dto/update-lesson-xp-segment.dto.js.map +1 -0
  109. package/dist/lesson-xp-map/lesson-xp-ai-calculation.service.d.ts +26 -0
  110. package/dist/lesson-xp-map/lesson-xp-ai-calculation.service.d.ts.map +1 -0
  111. package/dist/lesson-xp-map/lesson-xp-ai-calculation.service.js +304 -0
  112. package/dist/lesson-xp-map/lesson-xp-ai-calculation.service.js.map +1 -0
  113. package/dist/lesson-xp-map/lesson-xp-map.controller.d.ts +87 -0
  114. package/dist/lesson-xp-map/lesson-xp-map.controller.d.ts.map +1 -0
  115. package/dist/lesson-xp-map/lesson-xp-map.controller.js +185 -0
  116. package/dist/lesson-xp-map/lesson-xp-map.controller.js.map +1 -0
  117. package/dist/lesson-xp-map/lesson-xp-map.module.d.ts +3 -0
  118. package/dist/lesson-xp-map/lesson-xp-map.module.d.ts.map +1 -0
  119. package/dist/lesson-xp-map/lesson-xp-map.module.js +34 -0
  120. package/dist/lesson-xp-map/lesson-xp-map.module.js.map +1 -0
  121. package/dist/lesson-xp-map/lesson-xp-map.service.d.ts +84 -0
  122. package/dist/lesson-xp-map/lesson-xp-map.service.d.ts.map +1 -0
  123. package/dist/lesson-xp-map/lesson-xp-map.service.js +353 -0
  124. package/dist/lesson-xp-map/lesson-xp-map.service.js.map +1 -0
  125. package/dist/lesson-xp-map/lesson-xp-segment.controller.d.ts +10 -0
  126. package/dist/lesson-xp-map/lesson-xp-segment.controller.d.ts.map +1 -0
  127. package/dist/lesson-xp-map/lesson-xp-segment.controller.js +63 -0
  128. package/dist/lesson-xp-map/lesson-xp-segment.controller.js.map +1 -0
  129. package/dist/lesson-xp-map/lesson-xp-segment.service.d.ts +27 -0
  130. package/dist/lesson-xp-map/lesson-xp-segment.service.d.ts.map +1 -0
  131. package/dist/lesson-xp-map/lesson-xp-segment.service.js +194 -0
  132. package/dist/lesson-xp-map/lesson-xp-segment.service.js.map +1 -0
  133. package/dist/libraries/lms/tsconfig.tsbuildinfo +1 -0
  134. package/dist/lms.module.d.ts.map +1 -1
  135. package/dist/lms.module.js +17 -2
  136. package/dist/lms.module.js.map +1 -1
  137. package/dist/platforma/dto/update-profile.dto.d.ts +17 -0
  138. package/dist/platforma/dto/update-profile.dto.d.ts.map +1 -0
  139. package/dist/platforma/dto/update-profile.dto.js +87 -0
  140. package/dist/platforma/dto/update-profile.dto.js.map +1 -0
  141. package/dist/platforma/platforma.controller.d.ts +94 -7
  142. package/dist/platforma/platforma.controller.d.ts.map +1 -1
  143. package/dist/platforma/platforma.controller.js +85 -2
  144. package/dist/platforma/platforma.controller.js.map +1 -1
  145. package/dist/platforma/platforma.service.d.ts +27 -0
  146. package/dist/platforma/platforma.service.d.ts.map +1 -0
  147. package/dist/platforma/platforma.service.js +274 -0
  148. package/dist/platforma/platforma.service.js.map +1 -0
  149. package/dist/student-xp/student-xp.controller.d.ts +41 -0
  150. package/dist/student-xp/student-xp.controller.d.ts.map +1 -0
  151. package/dist/student-xp/student-xp.controller.js +114 -0
  152. package/dist/student-xp/student-xp.controller.js.map +1 -0
  153. package/dist/student-xp/student-xp.module.d.ts +3 -0
  154. package/dist/student-xp/student-xp.module.d.ts.map +1 -0
  155. package/dist/student-xp/student-xp.module.js +25 -0
  156. package/dist/student-xp/student-xp.module.js.map +1 -0
  157. package/dist/student-xp/student-xp.service.d.ts +65 -0
  158. package/dist/student-xp/student-xp.service.d.ts.map +1 -0
  159. package/dist/student-xp/student-xp.service.js +197 -0
  160. package/dist/student-xp/student-xp.service.js.map +1 -0
  161. package/dist/xp-catalog/dto/create-xp-area.dto.d.ts +12 -0
  162. package/dist/xp-catalog/dto/create-xp-area.dto.d.ts.map +1 -0
  163. package/dist/xp-catalog/dto/create-xp-area.dto.js +63 -0
  164. package/dist/xp-catalog/dto/create-xp-area.dto.js.map +1 -0
  165. package/dist/xp-catalog/dto/create-xp-learning-type.dto.d.ts +11 -0
  166. package/dist/xp-catalog/dto/create-xp-learning-type.dto.d.ts.map +1 -0
  167. package/dist/xp-catalog/dto/create-xp-learning-type.dto.js +57 -0
  168. package/dist/xp-catalog/dto/create-xp-learning-type.dto.js.map +1 -0
  169. package/dist/xp-catalog/dto/create-xp-skill.dto.d.ts +11 -0
  170. package/dist/xp-catalog/dto/create-xp-skill.dto.d.ts.map +1 -0
  171. package/dist/xp-catalog/dto/create-xp-skill.dto.js +57 -0
  172. package/dist/xp-catalog/dto/create-xp-skill.dto.js.map +1 -0
  173. package/dist/xp-catalog/dto/update-xp-area.dto.d.ts +12 -0
  174. package/dist/xp-catalog/dto/update-xp-area.dto.d.ts.map +1 -0
  175. package/dist/xp-catalog/dto/update-xp-area.dto.js +66 -0
  176. package/dist/xp-catalog/dto/update-xp-area.dto.js.map +1 -0
  177. package/dist/xp-catalog/dto/update-xp-learning-type.dto.d.ts +11 -0
  178. package/dist/xp-catalog/dto/update-xp-learning-type.dto.d.ts.map +1 -0
  179. package/dist/xp-catalog/dto/update-xp-learning-type.dto.js +60 -0
  180. package/dist/xp-catalog/dto/update-xp-learning-type.dto.js.map +1 -0
  181. package/dist/xp-catalog/dto/update-xp-skill.dto.d.ts +11 -0
  182. package/dist/xp-catalog/dto/update-xp-skill.dto.d.ts.map +1 -0
  183. package/dist/xp-catalog/dto/update-xp-skill.dto.js +60 -0
  184. package/dist/xp-catalog/dto/update-xp-skill.dto.js.map +1 -0
  185. package/dist/xp-catalog/xp-area.controller.d.ts +25 -0
  186. package/dist/xp-catalog/xp-area.controller.d.ts.map +1 -0
  187. package/dist/xp-catalog/xp-area.controller.js +105 -0
  188. package/dist/xp-catalog/xp-area.controller.js.map +1 -0
  189. package/dist/xp-catalog/xp-area.service.d.ts +35 -0
  190. package/dist/xp-catalog/xp-area.service.d.ts.map +1 -0
  191. package/dist/xp-catalog/xp-area.service.js +168 -0
  192. package/dist/xp-catalog/xp-area.service.js.map +1 -0
  193. package/dist/xp-catalog/xp-catalog.module.d.ts +3 -0
  194. package/dist/xp-catalog/xp-catalog.module.d.ts.map +1 -0
  195. package/dist/xp-catalog/xp-catalog.module.js +29 -0
  196. package/dist/xp-catalog/xp-catalog.module.js.map +1 -0
  197. package/dist/xp-catalog/xp-learning-type.controller.d.ts +20 -0
  198. package/dist/xp-catalog/xp-learning-type.controller.d.ts.map +1 -0
  199. package/dist/xp-catalog/xp-learning-type.controller.js +96 -0
  200. package/dist/xp-catalog/xp-learning-type.controller.js.map +1 -0
  201. package/dist/xp-catalog/xp-learning-type.service.d.ts +30 -0
  202. package/dist/xp-catalog/xp-learning-type.service.d.ts.map +1 -0
  203. package/dist/xp-catalog/xp-learning-type.service.js +146 -0
  204. package/dist/xp-catalog/xp-learning-type.service.js.map +1 -0
  205. package/dist/xp-catalog/xp-skill.controller.d.ts +26 -0
  206. package/dist/xp-catalog/xp-skill.controller.d.ts.map +1 -0
  207. package/dist/xp-catalog/xp-skill.controller.js +113 -0
  208. package/dist/xp-catalog/xp-skill.controller.js.map +1 -0
  209. package/dist/xp-catalog/xp-skill.service.d.ts +37 -0
  210. package/dist/xp-catalog/xp-skill.service.d.ts.map +1 -0
  211. package/dist/xp-catalog/xp-skill.service.js +174 -0
  212. package/dist/xp-catalog/xp-skill.service.js.map +1 -0
  213. package/hedhog/data/menu.yaml +101 -0
  214. package/hedhog/data/role.yaml +8 -0
  215. package/hedhog/data/route.yaml +547 -0
  216. package/hedhog/data/setting_group.yaml +33 -0
  217. package/hedhog/data/xp_area.yaml +164 -0
  218. package/hedhog/data/xp_learning_type.yaml +131 -0
  219. package/hedhog/data/xp_skill.yaml +1834 -0
  220. package/hedhog/frontend/app/achievements/page.tsx.ejs +108 -118
  221. package/hedhog/frontend/app/bitcodes/page.tsx.ejs +22 -34
  222. package/hedhog/frontend/app/bulk-upload-sessions/page.tsx.ejs +1453 -0
  223. package/hedhog/frontend/app/certificates/models/page.tsx.ejs +21 -45
  224. package/hedhog/frontend/app/classes/[id]/page.tsx.ejs +40 -74
  225. package/hedhog/frontend/app/classes/page.tsx.ejs +56 -85
  226. package/hedhog/frontend/app/courses/[id]/_components/CourseDangerZoneCard.tsx.ejs +3 -2
  227. package/hedhog/frontend/app/courses/[id]/_components/CourseMediaCard.tsx.ejs +48 -5
  228. package/hedhog/frontend/app/courses/[id]/page.tsx.ejs +4 -4
  229. package/hedhog/frontend/app/courses/[id]/structure/_components/course-operations-tab.tsx.ejs +19 -2
  230. package/hedhog/frontend/app/courses/[id]/structure/_components/course-overview-tab.tsx.ejs +1170 -0
  231. package/hedhog/frontend/app/courses/[id]/structure/_components/course-tree-dnd.tsx.ejs +16 -0
  232. package/hedhog/frontend/app/courses/[id]/structure/_components/course-tree.tsx.ejs +2 -0
  233. package/hedhog/frontend/app/courses/[id]/structure/_components/course-xp-overview-tab.tsx.ejs +623 -0
  234. package/hedhog/frontend/app/courses/[id]/structure/_components/detail-lesson-xp-tab.tsx.ejs +1458 -0
  235. package/hedhog/frontend/app/courses/[id]/structure/_components/detail-lesson.tsx.ejs +55 -2
  236. package/hedhog/frontend/app/courses/[id]/structure/_components/editor-course.tsx.ejs +442 -104
  237. package/hedhog/frontend/app/courses/[id]/structure/_components/editor-lesson.tsx.ejs +296 -49
  238. package/hedhog/frontend/app/courses/[id]/structure/_components/sortable-tree-row.tsx.ejs +3 -0
  239. package/hedhog/frontend/app/courses/[id]/structure/_components/store.ts.ejs +1 -0
  240. package/hedhog/frontend/app/courses/[id]/structure/_components/tree-display-settings-popover.tsx.ejs +101 -85
  241. package/hedhog/frontend/app/courses/[id]/structure/_components/tree-row-lesson.tsx.ejs +21 -1
  242. package/hedhog/frontend/app/courses/[id]/structure/_components/tree-row.tsx.ejs +3 -0
  243. package/hedhog/frontend/app/courses/[id]/structure/_components/use-tree-display-settings.ts.ejs +7 -1
  244. package/hedhog/frontend/app/courses/[id]/structure/_components/xp-premium-pills.tsx.ejs +44 -0
  245. package/hedhog/frontend/app/courses/[id]/structure/_data/use-course-content-overview.ts.ejs +54 -0
  246. package/hedhog/frontend/app/courses/[id]/structure/_data/use-course-structure-mutations.ts.ejs +52 -0
  247. package/hedhog/frontend/app/courses/[id]/structure/_data/use-course-xp-overview.ts.ejs +76 -0
  248. package/hedhog/frontend/app/courses/[id]/structure/_data/use-lesson-xp-map.ts.ejs +128 -0
  249. package/hedhog/frontend/app/courses/[id]/structure/_data/use-transcription-segments.ts.ejs +30 -0
  250. package/hedhog/frontend/app/courses/[id]/structure/_utils/xp-color-config.ts.ejs +115 -0
  251. package/hedhog/frontend/app/courses/_components/CourseDeleteDialog.tsx.ejs +223 -0
  252. package/hedhog/frontend/app/courses/_components/CourseRowActions.tsx.ejs +89 -0
  253. package/hedhog/frontend/app/courses/page.tsx.ejs +400 -230
  254. package/hedhog/frontend/app/enterprise/page.tsx.ejs +39 -63
  255. package/hedhog/frontend/app/exams/[id]/questions/page.tsx.ejs +53 -77
  256. package/hedhog/frontend/app/exams/page.tsx.ejs +54 -90
  257. package/hedhog/frontend/app/instructor-skills/page.tsx.ejs +23 -36
  258. package/hedhog/frontend/app/instructors/page.tsx.ejs +72 -81
  259. package/hedhog/frontend/app/paths/page.tsx.ejs +40 -68
  260. package/hedhog/frontend/app/training/page.tsx.ejs +40 -68
  261. package/hedhog/frontend/app/xp/areas/page.tsx.ejs +782 -0
  262. package/hedhog/frontend/app/xp/learning-types/page.tsx.ejs +690 -0
  263. package/hedhog/frontend/app/xp/skills/page.tsx.ejs +811 -0
  264. package/hedhog/frontend/messages/en.json +386 -3
  265. package/hedhog/frontend/messages/pt.json +386 -3
  266. package/hedhog/table/lesson_xp_map.yaml +50 -0
  267. package/hedhog/table/lesson_xp_segment.yaml +40 -0
  268. package/hedhog/table/lesson_xp_segment_area.yaml +24 -0
  269. package/hedhog/table/lesson_xp_segment_learning_type.yaml +24 -0
  270. package/hedhog/table/lesson_xp_segment_skill.yaml +24 -0
  271. package/hedhog/table/lms_bulk_upload_item.yaml +44 -0
  272. package/hedhog/table/lms_bulk_upload_session.yaml +42 -0
  273. package/hedhog/table/student_area_xp.yaml +30 -0
  274. package/hedhog/table/student_learning_type_xp.yaml +30 -0
  275. package/hedhog/table/student_skill_xp.yaml +30 -0
  276. package/hedhog/table/student_xp_event.yaml +34 -0
  277. package/hedhog/table/xp_area.yaml +39 -0
  278. package/hedhog/table/xp_learning_type.yaml +34 -0
  279. package/hedhog/table/xp_skill.yaml +39 -0
  280. package/package.json +9 -8
  281. package/src/bitcode-wallet/bitcode-wallet.service.ts +113 -0
  282. package/src/bitcode-wallet/dto/create-current-bitcode-wallet-transaction.dto.ts +32 -0
  283. package/src/course/course-audio-transcription.service.ts +58 -21
  284. package/src/course/course-lesson.controller.ts +6 -1
  285. package/src/course/course-structure.controller.ts +10 -0
  286. package/src/course/course-structure.service.ts +174 -1
  287. package/src/course/course-video-conversion.service.ts +113 -75
  288. package/src/course/course.controller.ts +22 -3
  289. package/src/course/course.module.ts +15 -3
  290. package/src/course/course.service.ts +847 -30
  291. package/src/course/dto/cleanup-course-storage.dto.ts +22 -0
  292. package/src/course/dto/cleanup-upload-history.dto.ts +26 -0
  293. package/src/course/dto/create-course-bulk-job.dto.ts +6 -0
  294. package/src/course/lms-bulk-upload-automation.service.ts +560 -0
  295. package/src/course/lms-bulk-upload-infra.service.ts +327 -0
  296. package/src/course/lms-bulk-upload.constants.ts +5 -0
  297. package/src/course/lms-bulk-upload.controller.ts +103 -0
  298. package/src/course/lms-bulk-upload.service.ts +1029 -0
  299. package/src/course/lms-setting.controller.ts +28 -1
  300. package/src/lesson-xp-map/dto/create-lesson-xp-map.dto.ts +17 -0
  301. package/src/lesson-xp-map/dto/create-lesson-xp-segment.dto.ts +102 -0
  302. package/src/lesson-xp-map/dto/review-lesson-xp-map.dto.ts +7 -0
  303. package/src/lesson-xp-map/dto/update-lesson-xp-map.dto.ts +36 -0
  304. package/src/lesson-xp-map/dto/update-lesson-xp-segment.dto.ts +78 -0
  305. package/src/lesson-xp-map/lesson-xp-ai-calculation.service.ts +396 -0
  306. package/src/lesson-xp-map/lesson-xp-map.controller.ts +116 -0
  307. package/src/lesson-xp-map/lesson-xp-map.module.ts +21 -0
  308. package/src/lesson-xp-map/lesson-xp-map.service.ts +442 -0
  309. package/src/lesson-xp-map/lesson-xp-segment.controller.ts +36 -0
  310. package/src/lesson-xp-map/lesson-xp-segment.service.ts +229 -0
  311. package/src/lms.module.ts +17 -2
  312. package/src/platforma/dto/update-profile.dto.ts +59 -0
  313. package/src/platforma/platforma.controller.ts +57 -2
  314. package/src/platforma/platforma.service.ts +268 -0
  315. package/src/student-xp/student-xp.controller.ts +76 -0
  316. package/src/student-xp/student-xp.module.ts +12 -0
  317. package/src/student-xp/student-xp.service.ts +236 -0
  318. package/src/xp-catalog/dto/create-xp-area.dto.ts +40 -0
  319. package/src/xp-catalog/dto/create-xp-learning-type.dto.ts +35 -0
  320. package/src/xp-catalog/dto/create-xp-skill.dto.ts +35 -0
  321. package/src/xp-catalog/dto/update-xp-area.dto.ts +43 -0
  322. package/src/xp-catalog/dto/update-xp-learning-type.dto.ts +38 -0
  323. package/src/xp-catalog/dto/update-xp-skill.dto.ts +38 -0
  324. package/src/xp-catalog/xp-area.controller.ts +64 -0
  325. package/src/xp-catalog/xp-area.service.ts +196 -0
  326. package/src/xp-catalog/xp-catalog.module.ts +16 -0
  327. package/src/xp-catalog/xp-learning-type.controller.ts +59 -0
  328. package/src/xp-catalog/xp-learning-type.service.ts +170 -0
  329. package/src/xp-catalog/xp-skill.controller.ts +71 -0
  330. package/src/xp-catalog/xp-skill.service.ts +205 -0
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.LessonXpMapModule = void 0;
10
+ const api_prisma_1 = require("@hed-hog/api-prisma");
11
+ const core_1 = require("@hed-hog/core");
12
+ const queue_1 = require("@hed-hog/queue");
13
+ const common_1 = require("@nestjs/common");
14
+ const lesson_xp_ai_calculation_service_1 = require("./lesson-xp-ai-calculation.service");
15
+ const lesson_xp_map_controller_1 = require("./lesson-xp-map.controller");
16
+ const lesson_xp_map_service_1 = require("./lesson-xp-map.service");
17
+ const lesson_xp_segment_controller_1 = require("./lesson-xp-segment.controller");
18
+ const lesson_xp_segment_service_1 = require("./lesson-xp-segment.service");
19
+ let LessonXpMapModule = class LessonXpMapModule {
20
+ };
21
+ exports.LessonXpMapModule = LessonXpMapModule;
22
+ exports.LessonXpMapModule = LessonXpMapModule = __decorate([
23
+ (0, common_1.Module)({
24
+ imports: [
25
+ (0, common_1.forwardRef)(() => api_prisma_1.PrismaModule),
26
+ (0, common_1.forwardRef)(() => core_1.CoreModule),
27
+ (0, common_1.forwardRef)(() => queue_1.QueueModule),
28
+ ],
29
+ controllers: [lesson_xp_map_controller_1.LessonXpMapController, lesson_xp_segment_controller_1.LessonXpSegmentController],
30
+ providers: [lesson_xp_map_service_1.LessonXpMapService, lesson_xp_segment_service_1.LessonXpSegmentService, lesson_xp_ai_calculation_service_1.LessonXpAiCalculationService],
31
+ exports: [lesson_xp_map_service_1.LessonXpMapService, lesson_xp_segment_service_1.LessonXpSegmentService, lesson_xp_ai_calculation_service_1.LessonXpAiCalculationService],
32
+ })
33
+ ], LessonXpMapModule);
34
+ //# sourceMappingURL=lesson-xp-map.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lesson-xp-map.module.js","sourceRoot":"","sources":["../../src/lesson-xp-map/lesson-xp-map.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,oDAAmD;AACnD,wCAA2C;AAC3C,0CAA6C;AAC7C,2CAAoD;AACpD,yFAAkF;AAClF,yEAAmE;AACnE,mEAA6D;AAC7D,iFAA2E;AAC3E,2EAAqE;AAY9D,IAAM,iBAAiB,GAAvB,MAAM,iBAAiB;CAAG,CAAA;AAApB,8CAAiB;4BAAjB,iBAAiB;IAV7B,IAAA,eAAM,EAAC;QACN,OAAO,EAAE;YACP,IAAA,mBAAU,EAAC,GAAG,EAAE,CAAC,yBAAY,CAAC;YAC9B,IAAA,mBAAU,EAAC,GAAG,EAAE,CAAC,iBAAU,CAAC;YAC5B,IAAA,mBAAU,EAAC,GAAG,EAAE,CAAC,mBAAW,CAAC;SAC9B;QACD,WAAW,EAAE,CAAC,gDAAqB,EAAE,wDAAyB,CAAC;QAC/D,SAAS,EAAE,CAAC,0CAAkB,EAAE,kDAAsB,EAAE,+DAA4B,CAAC;QACrF,OAAO,EAAE,CAAC,0CAAkB,EAAE,kDAAsB,EAAE,+DAA4B,CAAC;KACpF,CAAC;GACW,iBAAiB,CAAG"}
@@ -0,0 +1,84 @@
1
+ import { PrismaService } from '@hed-hog/api-prisma';
2
+ import { CreateLessonXpMapDto } from './dto/create-lesson-xp-map.dto';
3
+ import { UpdateLessonXpMapDto } from './dto/update-lesson-xp-map.dto';
4
+ export declare class LessonXpMapService {
5
+ private readonly prisma;
6
+ constructor(prisma: PrismaService);
7
+ list(params: {
8
+ page?: number;
9
+ pageSize?: number;
10
+ search?: string;
11
+ status?: string;
12
+ courseLessonId?: number;
13
+ }): Promise<{
14
+ data: any[];
15
+ total: number;
16
+ page: number;
17
+ pageSize: number;
18
+ lastPage: number;
19
+ }>;
20
+ getById(id: number): Promise<any>;
21
+ getByLessonId(lessonId: number): Promise<any>;
22
+ getCourseOverview(courseId: number): Promise<{
23
+ summary: {
24
+ totalLessons: number;
25
+ mappedLessons: number;
26
+ unmappedLessons: number;
27
+ totalXp: number;
28
+ totalSegments: number;
29
+ averageXpPerMappedLesson: number;
30
+ };
31
+ lessons: {
32
+ courseLessonId: number;
33
+ lessonCode: string | null;
34
+ lessonTitle: string;
35
+ totalXp: number;
36
+ status: string;
37
+ segmentCount: number;
38
+ hasMap: boolean;
39
+ }[];
40
+ areas: ({
41
+ xpAreaId: number;
42
+ slug: string;
43
+ name: string;
44
+ xp: number;
45
+ lessonCount: number;
46
+ segmentCount: number;
47
+ } & {
48
+ sharePercent: number;
49
+ })[];
50
+ skills: ({
51
+ xpSkillId: number;
52
+ slug: string;
53
+ name: string;
54
+ xp: number;
55
+ lessonCount: number;
56
+ segmentCount: number;
57
+ } & {
58
+ sharePercent: number;
59
+ })[];
60
+ learningTypes: ({
61
+ xpLearningTypeId: number;
62
+ slug: string;
63
+ name: string;
64
+ multiplier: number;
65
+ xp: number;
66
+ lessonCount: number;
67
+ segmentCount: number;
68
+ } & {
69
+ sharePercent: number;
70
+ })[];
71
+ }>;
72
+ create(dto: CreateLessonXpMapDto): Promise<any>;
73
+ update(id: number, dto: UpdateLessonXpMapDto): Promise<any>;
74
+ delete(id: number): Promise<void>;
75
+ approve(id: number, reviewerPersonId: number): Promise<any>;
76
+ reject(id: number, reviewerPersonId: number, notes?: string): Promise<any>;
77
+ recalculateTotalXp(mapId: number): Promise<void>;
78
+ private ensureExists;
79
+ private param;
80
+ private withShare;
81
+ private queryRows;
82
+ private querySingle;
83
+ }
84
+ //# sourceMappingURL=lesson-xp-map.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lesson-xp-map.service.d.ts","sourceRoot":"","sources":["../../src/lesson-xp-map/lesson-xp-map.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AAEtE,qBACa,kBAAkB;IACjB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,aAAa;IAE5C,IAAI,CAAC,MAAM,EAAE;QACjB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB;;;;;;;IA2DK,OAAO,CAAC,EAAE,EAAE,MAAM;IAiFlB,aAAa,CAAC,QAAQ,EAAE,MAAM;IAS9B,iBAAiB,CAAC,QAAQ,EAAE,MAAM;;;;;;;;;;4BAEpB,MAAM;wBACV,MAAM,GAAG,IAAI;yBACZ,MAAM;qBACV,MAAM;oBACP,MAAM;0BACA,MAAM;oBACZ,OAAO;;;sBAyBL,MAAM;kBACV,MAAM;kBACN,MAAM;gBACR,MAAM;yBACG,MAAM;0BACL,MAAM;;;;;uBA8BT,MAAM;kBACX,MAAM;kBACN,MAAM;gBACR,MAAM;yBACG,MAAM;0BACL,MAAM;;;;;8BA8BF,MAAM;kBAClB,MAAM;kBACN,MAAM;wBACA,MAAM;gBACd,MAAM;yBACG,MAAM;0BACL,MAAM;;;;;IAwDlB,MAAM,CAAC,GAAG,EAAE,oBAAoB;IAgBhC,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,oBAAoB;IAuB5C,MAAM,CAAC,EAAE,EAAE,MAAM;IAKjB,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM;IAc5C,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM;IAe3D,kBAAkB,CAAC,KAAK,EAAE,MAAM;YAcxB,YAAY;IAK1B,OAAO,CAAC,KAAK;IAKb,OAAO,CAAC,SAAS;YAOH,SAAS;YAIT,WAAW;CAI1B"}
@@ -0,0 +1,353 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.LessonXpMapService = void 0;
13
+ const api_prisma_1 = require("@hed-hog/api-prisma");
14
+ const common_1 = require("@nestjs/common");
15
+ let LessonXpMapService = class LessonXpMapService {
16
+ constructor(prisma) {
17
+ this.prisma = prisma;
18
+ }
19
+ async list(params) {
20
+ var _a, _b, _c;
21
+ const page = Math.max(Number(params.page) || 1, 1);
22
+ const pageSize = Math.max(Number(params.pageSize) || 20, 1);
23
+ const offset = (page - 1) * pageSize;
24
+ const values = [];
25
+ const where = ['1 = 1'];
26
+ if ((_a = params.search) === null || _a === void 0 ? void 0 : _a.trim()) {
27
+ const p = this.param(values, `%${params.search.trim()}%`);
28
+ where.push(`cl.title ILIKE ${p}`);
29
+ }
30
+ if ((_b = params.status) === null || _b === void 0 ? void 0 : _b.trim()) {
31
+ where.push(`m.status::text = ${this.param(values, params.status.trim())}`);
32
+ }
33
+ if (params.courseLessonId) {
34
+ where.push(`m.course_lesson_id = ${this.param(values, params.courseLessonId)}`);
35
+ }
36
+ const whereClause = where.join(' AND ');
37
+ const totalRow = await this.querySingle(`SELECT COUNT(*)::text AS total
38
+ FROM lesson_xp_map m
39
+ JOIN course_lesson cl ON cl.id = m.course_lesson_id
40
+ WHERE ${whereClause}`, values);
41
+ const q = [...values];
42
+ const rows = await this.queryRows(`SELECT
43
+ m.id,
44
+ m.course_lesson_id AS "courseLessonId",
45
+ cl.title AS "lessonTitle",
46
+ m.version,
47
+ m.total_xp AS "totalXp",
48
+ m.status::text AS status,
49
+ m.generated_at::text AS "generatedAt",
50
+ m.reviewed_at::text AS "reviewedAt",
51
+ m.reviewed_by_person_id AS "reviewedByPersonId",
52
+ m.review_notes AS "reviewNotes",
53
+ m.ai_model_version AS "aiModelVersion",
54
+ m.processing_error AS "processingError",
55
+ m.created_at::text AS "createdAt",
56
+ m.updated_at::text AS "updatedAt",
57
+ (SELECT COUNT(*) FROM lesson_xp_segment s WHERE s.lesson_xp_map_id = m.id)::int AS "segmentCount"
58
+ FROM lesson_xp_map m
59
+ JOIN course_lesson cl ON cl.id = m.course_lesson_id
60
+ WHERE ${whereClause}
61
+ ORDER BY m.updated_at DESC
62
+ LIMIT ${this.param(q, pageSize)} OFFSET ${this.param(q, offset)}`, q);
63
+ const total = Number((_c = totalRow === null || totalRow === void 0 ? void 0 : totalRow.total) !== null && _c !== void 0 ? _c : 0);
64
+ return { data: rows, total, page, pageSize, lastPage: Math.ceil(total / pageSize) };
65
+ }
66
+ async getById(id) {
67
+ const row = await this.querySingle(`SELECT
68
+ m.id,
69
+ m.course_lesson_id AS "courseLessonId",
70
+ cl.title AS "lessonTitle",
71
+ m.version,
72
+ m.total_xp AS "totalXp",
73
+ m.status::text AS status,
74
+ m.generated_at::text AS "generatedAt",
75
+ m.reviewed_at::text AS "reviewedAt",
76
+ m.reviewed_by_person_id AS "reviewedByPersonId",
77
+ m.review_notes AS "reviewNotes",
78
+ m.ai_model_version AS "aiModelVersion",
79
+ m.processing_error AS "processingError",
80
+ m.created_at::text AS "createdAt",
81
+ m.updated_at::text AS "updatedAt"
82
+ FROM lesson_xp_map m
83
+ JOIN course_lesson cl ON cl.id = m.course_lesson_id
84
+ WHERE m.id = $1`, [id]);
85
+ if (!row)
86
+ throw new common_1.NotFoundException('Lesson XP map not found');
87
+ const segments = await this.queryRows(`SELECT
88
+ s.id,
89
+ s.start_seconds::float AS "startSeconds",
90
+ s.end_seconds::float AS "endSeconds",
91
+ s.xp_value AS "xpValue",
92
+ s.difficulty::text AS difficulty,
93
+ s.should_grant_xp AS "shouldGrantXp",
94
+ s.ai_summary AS "aiSummary",
95
+ s.ai_confidence::float AS "aiConfidence",
96
+ s.sort_order AS "sortOrder",
97
+ COALESCE(
98
+ (SELECT json_agg(json_build_object('xpAreaId', sa.xp_area_id, 'weightPercent', sa.weight_percent::float))
99
+ FROM lesson_xp_segment_area sa WHERE sa.lesson_xp_segment_id = s.id),
100
+ '[]'
101
+ ) AS areas,
102
+ COALESCE(
103
+ (SELECT json_agg(json_build_object('xpSkillId', ss.xp_skill_id, 'weightPercent', ss.weight_percent::float))
104
+ FROM lesson_xp_segment_skill ss WHERE ss.lesson_xp_segment_id = s.id),
105
+ '[]'
106
+ ) AS skills,
107
+ COALESCE(
108
+ (SELECT json_agg(
109
+ json_build_object(
110
+ 'xpLearningTypeId', sl.xp_learning_type_id,
111
+ 'weightPercent', sl.weight_percent::float,
112
+ 'slug', lt.slug,
113
+ 'name', COALESCE(lt_pt.name, lt_en.name, lt.slug),
114
+ 'multiplier', lt.multiplier::float
115
+ )
116
+ )
117
+ FROM lesson_xp_segment_learning_type sl
118
+ JOIN xp_learning_type lt ON lt.id = sl.xp_learning_type_id
119
+ LEFT JOIN xp_learning_type_locale lt_pt
120
+ ON lt_pt.xp_learning_type_id = lt.id
121
+ AND COALESCE(
122
+ (SELECT code FROM locale WHERE id = NULLIF(to_jsonb(lt_pt)->>'locale_id', '')::int),
123
+ to_jsonb(lt_pt)->>'locale'
124
+ ) = 'pt'
125
+ LEFT JOIN xp_learning_type_locale lt_en
126
+ ON lt_en.xp_learning_type_id = lt.id
127
+ AND COALESCE(
128
+ (SELECT code FROM locale WHERE id = NULLIF(to_jsonb(lt_en)->>'locale_id', '')::int),
129
+ to_jsonb(lt_en)->>'locale'
130
+ ) = 'en'
131
+ WHERE sl.lesson_xp_segment_id = s.id),
132
+ '[]'
133
+ ) AS "learningTypes"
134
+ FROM lesson_xp_segment s
135
+ WHERE s.lesson_xp_map_id = $1
136
+ ORDER BY s.sort_order ASC, s.start_seconds ASC`, [id]);
137
+ return Object.assign(Object.assign({}, row), { segments });
138
+ }
139
+ async getByLessonId(lessonId) {
140
+ const row = await this.querySingle(`SELECT id FROM lesson_xp_map WHERE course_lesson_id = $1`, [lessonId]);
141
+ if (!row)
142
+ return null;
143
+ return this.getById(row.id);
144
+ }
145
+ async getCourseOverview(courseId) {
146
+ const lessons = await this.queryRows(`SELECT
147
+ l.id AS "courseLessonId",
148
+ l.id::text AS "lessonCode",
149
+ l.title AS "lessonTitle",
150
+ COALESCE(lm.total_xp, 0)::int AS "totalXp",
151
+ COALESCE(lm.status::text, 'pending') AS status,
152
+ COALESCE(
153
+ (SELECT COUNT(*)::int
154
+ FROM lesson_xp_segment s
155
+ WHERE s.lesson_xp_map_id = lm.id
156
+ AND s.should_grant_xp = true),
157
+ 0
158
+ )::int AS "segmentCount",
159
+ (lm.id IS NOT NULL) AS "hasMap"
160
+ FROM course_lesson l
161
+ JOIN course_module cm ON cm.id = l.course_module_id
162
+ LEFT JOIN lesson_xp_map lm ON lm.course_lesson_id = l.id
163
+ WHERE cm.course_id = $1
164
+ ORDER BY l.id ASC`, [courseId]);
165
+ const areas = await this.queryRows(`SELECT
166
+ a.id AS "xpAreaId",
167
+ a.slug,
168
+ COALESCE(a_pt.name, a_en.name, a.slug) AS name,
169
+ SUM(ROUND(s.xp_value * (sa.weight_percent::numeric / 100)))::int AS xp,
170
+ COUNT(DISTINCT lm.course_lesson_id)::int AS "lessonCount",
171
+ COUNT(*)::int AS "segmentCount"
172
+ FROM lesson_xp_map lm
173
+ JOIN course_lesson l ON l.id = lm.course_lesson_id
174
+ JOIN course_module cm ON cm.id = l.course_module_id
175
+ JOIN lesson_xp_segment s
176
+ ON s.lesson_xp_map_id = lm.id
177
+ AND s.should_grant_xp = true
178
+ JOIN lesson_xp_segment_area sa ON sa.lesson_xp_segment_id = s.id
179
+ JOIN xp_area a ON a.id = sa.xp_area_id
180
+ LEFT JOIN xp_area_locale a_pt
181
+ ON a_pt.xp_area_id = a.id
182
+ AND a_pt.locale_id = (SELECT id FROM locale WHERE code = 'pt')
183
+ LEFT JOIN xp_area_locale a_en
184
+ ON a_en.xp_area_id = a.id
185
+ AND a_en.locale_id = (SELECT id FROM locale WHERE code = 'en')
186
+ WHERE cm.course_id = $1
187
+ GROUP BY a.id, a.slug, a_pt.name, a_en.name
188
+ ORDER BY xp DESC, name ASC`, [courseId]);
189
+ const skills = await this.queryRows(`SELECT
190
+ sk.id AS "xpSkillId",
191
+ sk.slug,
192
+ COALESCE(sk_pt.name, sk_en.name, sk.slug) AS name,
193
+ SUM(ROUND(s.xp_value * (ss.weight_percent::numeric / 100)))::int AS xp,
194
+ COUNT(DISTINCT lm.course_lesson_id)::int AS "lessonCount",
195
+ COUNT(*)::int AS "segmentCount"
196
+ FROM lesson_xp_map lm
197
+ JOIN course_lesson l ON l.id = lm.course_lesson_id
198
+ JOIN course_module cm ON cm.id = l.course_module_id
199
+ JOIN lesson_xp_segment s
200
+ ON s.lesson_xp_map_id = lm.id
201
+ AND s.should_grant_xp = true
202
+ JOIN lesson_xp_segment_skill ss ON ss.lesson_xp_segment_id = s.id
203
+ JOIN xp_skill sk ON sk.id = ss.xp_skill_id
204
+ LEFT JOIN xp_skill_locale sk_pt
205
+ ON sk_pt.xp_skill_id = sk.id
206
+ AND sk_pt.locale_id = (SELECT id FROM locale WHERE code = 'pt')
207
+ LEFT JOIN xp_skill_locale sk_en
208
+ ON sk_en.xp_skill_id = sk.id
209
+ AND sk_en.locale_id = (SELECT id FROM locale WHERE code = 'en')
210
+ WHERE cm.course_id = $1
211
+ GROUP BY sk.id, sk.slug, sk_pt.name, sk_en.name
212
+ ORDER BY xp DESC, name ASC`, [courseId]);
213
+ const learningTypes = await this.queryRows(`SELECT
214
+ lt.id AS "xpLearningTypeId",
215
+ lt.slug,
216
+ COALESCE(lt_pt.name, lt_en.name, lt.slug) AS name,
217
+ lt.multiplier::float AS multiplier,
218
+ SUM(ROUND(s.xp_value * (sl.weight_percent::numeric / 100)))::int AS xp,
219
+ COUNT(DISTINCT lm.course_lesson_id)::int AS "lessonCount",
220
+ COUNT(*)::int AS "segmentCount"
221
+ FROM lesson_xp_map lm
222
+ JOIN course_lesson l ON l.id = lm.course_lesson_id
223
+ JOIN course_module cm ON cm.id = l.course_module_id
224
+ JOIN lesson_xp_segment s
225
+ ON s.lesson_xp_map_id = lm.id
226
+ AND s.should_grant_xp = true
227
+ JOIN lesson_xp_segment_learning_type sl ON sl.lesson_xp_segment_id = s.id
228
+ JOIN xp_learning_type lt ON lt.id = sl.xp_learning_type_id
229
+ LEFT JOIN xp_learning_type_locale lt_pt
230
+ ON lt_pt.xp_learning_type_id = lt.id
231
+ AND COALESCE(
232
+ (SELECT code FROM locale WHERE id = NULLIF(to_jsonb(lt_pt)->>'locale_id', '')::int),
233
+ to_jsonb(lt_pt)->>'locale'
234
+ ) = 'pt'
235
+ LEFT JOIN xp_learning_type_locale lt_en
236
+ ON lt_en.xp_learning_type_id = lt.id
237
+ AND COALESCE(
238
+ (SELECT code FROM locale WHERE id = NULLIF(to_jsonb(lt_en)->>'locale_id', '')::int),
239
+ to_jsonb(lt_en)->>'locale'
240
+ ) = 'en'
241
+ WHERE cm.course_id = $1
242
+ GROUP BY lt.id, lt.slug, lt.multiplier, lt_pt.name, lt_en.name
243
+ ORDER BY xp DESC, name ASC`, [courseId]);
244
+ const totalXp = lessons.reduce((sum, lesson) => sum + Number(lesson.totalXp || 0), 0);
245
+ const mappedLessons = lessons.filter((lesson) => lesson.hasMap).length;
246
+ const totalSegments = lessons.reduce((sum, lesson) => sum + Number(lesson.segmentCount || 0), 0);
247
+ return {
248
+ summary: {
249
+ totalLessons: lessons.length,
250
+ mappedLessons,
251
+ unmappedLessons: Math.max(lessons.length - mappedLessons, 0),
252
+ totalXp,
253
+ totalSegments,
254
+ averageXpPerMappedLesson: mappedLessons > 0 ? totalXp / mappedLessons : 0,
255
+ },
256
+ lessons,
257
+ areas: this.withShare(areas, totalXp),
258
+ skills: this.withShare(skills, totalXp),
259
+ learningTypes: this.withShare(learningTypes, totalXp),
260
+ };
261
+ }
262
+ async create(dto) {
263
+ var _a, _b;
264
+ const existing = await this.querySingle(`SELECT id FROM lesson_xp_map WHERE course_lesson_id = $1`, [dto.courseLessonId]);
265
+ if (existing)
266
+ throw new common_1.NotFoundException(`A lesson XP map already exists for lesson ${dto.courseLessonId}. Use PATCH to update it.`);
267
+ const created = await this.querySingle(`INSERT INTO lesson_xp_map (course_lesson_id, version, total_xp, status, ai_model_version, created_at, updated_at)
268
+ VALUES ($1, $2, 0, 'pending'::lesson_xp_map_status_d4e5f6a7b8_enum, $3, NOW(), NOW())
269
+ RETURNING id`, [dto.courseLessonId, (_a = dto.version) !== null && _a !== void 0 ? _a : 1, (_b = dto.aiModelVersion) !== null && _b !== void 0 ? _b : null]);
270
+ return this.getById(created.id);
271
+ }
272
+ async update(id, dto) {
273
+ await this.ensureExists(id);
274
+ const updates = [];
275
+ const values = [];
276
+ if (dto.status !== undefined)
277
+ updates.push(`status = ${this.param(values, dto.status)}::lesson_xp_map_status_d4e5f6a7b8_enum`);
278
+ if (dto.reviewNotes !== undefined)
279
+ updates.push(`review_notes = ${this.param(values, dto.reviewNotes)}`);
280
+ if (dto.aiModelVersion !== undefined)
281
+ updates.push(`ai_model_version = ${this.param(values, dto.aiModelVersion)}`);
282
+ if (dto.processingError !== undefined)
283
+ updates.push(`processing_error = ${this.param(values, dto.processingError)}`);
284
+ if (dto.totalXp !== undefined)
285
+ updates.push(`total_xp = ${this.param(values, dto.totalXp)}`);
286
+ if (updates.length > 0) {
287
+ values.push(id);
288
+ await this.prisma.$executeRawUnsafe(`UPDATE lesson_xp_map SET ${updates.join(', ')}, updated_at = NOW() WHERE id = $${values.length}`, ...values);
289
+ }
290
+ return this.getById(id);
291
+ }
292
+ async delete(id) {
293
+ await this.ensureExists(id);
294
+ await this.prisma.$executeRawUnsafe(`DELETE FROM lesson_xp_map WHERE id = $1`, id);
295
+ }
296
+ async approve(id, reviewerPersonId) {
297
+ await this.ensureExists(id);
298
+ await this.prisma.$executeRawUnsafe(`UPDATE lesson_xp_map
299
+ SET status = 'approved'::lesson_xp_map_status_d4e5f6a7b8_enum,
300
+ reviewed_at = NOW(),
301
+ reviewed_by_person_id = $1,
302
+ updated_at = NOW()
303
+ WHERE id = $2`, reviewerPersonId, id);
304
+ return this.getById(id);
305
+ }
306
+ async reject(id, reviewerPersonId, notes) {
307
+ await this.ensureExists(id);
308
+ await this.prisma.$executeRawUnsafe(`UPDATE lesson_xp_map
309
+ SET status = 'rejected'::lesson_xp_map_status_d4e5f6a7b8_enum,
310
+ reviewed_at = NOW(),
311
+ reviewed_by_person_id = $1,
312
+ review_notes = $2,
313
+ updated_at = NOW()
314
+ WHERE id = $3`, reviewerPersonId, notes !== null && notes !== void 0 ? notes : null, id);
315
+ return this.getById(id);
316
+ }
317
+ async recalculateTotalXp(mapId) {
318
+ await this.prisma.$executeRawUnsafe(`UPDATE lesson_xp_map
319
+ SET total_xp = COALESCE(
320
+ (SELECT SUM(xp_value) FROM lesson_xp_segment
321
+ WHERE lesson_xp_map_id = $1 AND should_grant_xp = true),
322
+ 0
323
+ ),
324
+ updated_at = NOW()
325
+ WHERE id = $1`, mapId);
326
+ }
327
+ async ensureExists(id) {
328
+ const row = await this.querySingle(`SELECT id FROM lesson_xp_map WHERE id = $1`, [id]);
329
+ if (!row)
330
+ throw new common_1.NotFoundException('Lesson XP map not found');
331
+ }
332
+ param(values, value) {
333
+ values.push(value);
334
+ return `$${values.length}`;
335
+ }
336
+ withShare(items, totalXp) {
337
+ return items.map((item) => (Object.assign(Object.assign({}, item), { sharePercent: totalXp > 0 ? Number(((item.xp / totalXp) * 100).toFixed(2)) : 0 })));
338
+ }
339
+ async queryRows(query, values = []) {
340
+ return this.prisma.$queryRawUnsafe(query, ...values);
341
+ }
342
+ async querySingle(query, values = []) {
343
+ var _a;
344
+ const rows = await this.prisma.$queryRawUnsafe(query, ...values);
345
+ return (_a = rows[0]) !== null && _a !== void 0 ? _a : null;
346
+ }
347
+ };
348
+ exports.LessonXpMapService = LessonXpMapService;
349
+ exports.LessonXpMapService = LessonXpMapService = __decorate([
350
+ (0, common_1.Injectable)(),
351
+ __metadata("design:paramtypes", [api_prisma_1.PrismaService])
352
+ ], LessonXpMapService);
353
+ //# sourceMappingURL=lesson-xp-map.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lesson-xp-map.service.js","sourceRoot":"","sources":["../../src/lesson-xp-map/lesson-xp-map.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { UpdateLessonXpSegmentDto } from './dto/update-lesson-xp-segment.dto';
2
+ import { LessonXpSegmentService } from './lesson-xp-segment.service';
3
+ export declare class LessonXpSegmentController {
4
+ private readonly lessonXpSegmentService;
5
+ constructor(lessonXpSegmentService: LessonXpSegmentService);
6
+ getById(id: number): Promise<any>;
7
+ update(id: number, dto: UpdateLessonXpSegmentDto): Promise<any>;
8
+ remove(id: number): Promise<void>;
9
+ }
10
+ //# sourceMappingURL=lesson-xp-segment.controller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lesson-xp-segment.controller.d.ts","sourceRoot":"","sources":["../../src/lesson-xp-map/lesson-xp-segment.controller.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,wBAAwB,EAAE,MAAM,oCAAoC,CAAC;AAC9E,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAErE,qBAEa,yBAAyB;IACxB,OAAO,CAAC,QAAQ,CAAC,sBAAsB;gBAAtB,sBAAsB,EAAE,sBAAsB;IAG3E,OAAO,CAA4B,EAAE,EAAE,MAAM;IAK7C,MAAM,CAA4B,EAAE,EAAE,MAAM,EAAU,GAAG,EAAE,wBAAwB;IAMnF,MAAM,CAA4B,EAAE,EAAE,MAAM;CAG7C"}
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.LessonXpSegmentController = void 0;
16
+ const api_1 = require("@hed-hog/api");
17
+ const common_1 = require("@nestjs/common");
18
+ const update_lesson_xp_segment_dto_1 = require("./dto/update-lesson-xp-segment.dto");
19
+ const lesson_xp_segment_service_1 = require("./lesson-xp-segment.service");
20
+ let LessonXpSegmentController = class LessonXpSegmentController {
21
+ constructor(lessonXpSegmentService) {
22
+ this.lessonXpSegmentService = lessonXpSegmentService;
23
+ }
24
+ getById(id) {
25
+ return this.lessonXpSegmentService.getById(id);
26
+ }
27
+ update(id, dto) {
28
+ return this.lessonXpSegmentService.update(id, dto);
29
+ }
30
+ remove(id) {
31
+ return this.lessonXpSegmentService.delete(id);
32
+ }
33
+ };
34
+ exports.LessonXpSegmentController = LessonXpSegmentController;
35
+ __decorate([
36
+ (0, common_1.Get)(':id'),
37
+ __param(0, (0, common_1.Param)('id', common_1.ParseIntPipe)),
38
+ __metadata("design:type", Function),
39
+ __metadata("design:paramtypes", [Number]),
40
+ __metadata("design:returntype", void 0)
41
+ ], LessonXpSegmentController.prototype, "getById", null);
42
+ __decorate([
43
+ (0, common_1.Patch)(':id'),
44
+ __param(0, (0, common_1.Param)('id', common_1.ParseIntPipe)),
45
+ __param(1, (0, common_1.Body)()),
46
+ __metadata("design:type", Function),
47
+ __metadata("design:paramtypes", [Number, update_lesson_xp_segment_dto_1.UpdateLessonXpSegmentDto]),
48
+ __metadata("design:returntype", void 0)
49
+ ], LessonXpSegmentController.prototype, "update", null);
50
+ __decorate([
51
+ (0, common_1.Delete)(':id'),
52
+ (0, common_1.HttpCode)(common_1.HttpStatus.NO_CONTENT),
53
+ __param(0, (0, common_1.Param)('id', common_1.ParseIntPipe)),
54
+ __metadata("design:type", Function),
55
+ __metadata("design:paramtypes", [Number]),
56
+ __metadata("design:returntype", void 0)
57
+ ], LessonXpSegmentController.prototype, "remove", null);
58
+ exports.LessonXpSegmentController = LessonXpSegmentController = __decorate([
59
+ (0, api_1.Role)(),
60
+ (0, common_1.Controller)('lms/xp/segments'),
61
+ __metadata("design:paramtypes", [lesson_xp_segment_service_1.LessonXpSegmentService])
62
+ ], LessonXpSegmentController);
63
+ //# sourceMappingURL=lesson-xp-segment.controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lesson-xp-segment.controller.js","sourceRoot":"","sources":["../../src/lesson-xp-map/lesson-xp-segment.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,sCAAoC;AACpC,2CAUwB;AACxB,qFAA8E;AAC9E,2EAAqE;AAI9D,IAAM,yBAAyB,GAA/B,MAAM,yBAAyB;IACpC,YAA6B,sBAA8C;QAA9C,2BAAsB,GAAtB,sBAAsB,CAAwB;IAAG,CAAC;IAG/E,OAAO,CAA4B,EAAU;QAC3C,OAAO,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACjD,CAAC;IAGD,MAAM,CAA4B,EAAU,EAAU,GAA6B;QACjF,OAAO,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IACrD,CAAC;IAID,MAAM,CAA4B,EAAU;QAC1C,OAAO,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAChD,CAAC;CACF,CAAA;AAlBY,8DAAyB;AAIpC;IADC,IAAA,YAAG,EAAC,KAAK,CAAC;IACF,WAAA,IAAA,cAAK,EAAC,IAAI,EAAE,qBAAY,CAAC,CAAA;;;;wDAEjC;AAGD;IADC,IAAA,cAAK,EAAC,KAAK,CAAC;IACL,WAAA,IAAA,cAAK,EAAC,IAAI,EAAE,qBAAY,CAAC,CAAA;IAAc,WAAA,IAAA,aAAI,GAAE,CAAA;;6CAAM,uDAAwB;;uDAElF;AAID;IAFC,IAAA,eAAM,EAAC,KAAK,CAAC;IACb,IAAA,iBAAQ,EAAC,mBAAU,CAAC,UAAU,CAAC;IACxB,WAAA,IAAA,cAAK,EAAC,IAAI,EAAE,qBAAY,CAAC,CAAA;;;;uDAEhC;oCAjBU,yBAAyB;IAFrC,IAAA,UAAI,GAAE;IACN,IAAA,mBAAU,EAAC,iBAAiB,CAAC;qCAEyB,kDAAsB;GADhE,yBAAyB,CAkBrC"}
@@ -0,0 +1,27 @@
1
+ import { PrismaService } from '@hed-hog/api-prisma';
2
+ import { CreateLessonXpSegmentDto } from './dto/create-lesson-xp-segment.dto';
3
+ import { UpdateLessonXpSegmentDto } from './dto/update-lesson-xp-segment.dto';
4
+ export declare class LessonXpSegmentService {
5
+ private readonly prisma;
6
+ constructor(prisma: PrismaService);
7
+ listByMap(mapId: number, params: {
8
+ page?: number;
9
+ pageSize?: number;
10
+ }): Promise<{
11
+ data: any[];
12
+ total: number;
13
+ page: number;
14
+ pageSize: number;
15
+ lastPage: number;
16
+ }>;
17
+ getById(id: number): Promise<any>;
18
+ create(mapId: number, dto: CreateLessonXpSegmentDto): Promise<any>;
19
+ update(id: number, dto: UpdateLessonXpSegmentDto): Promise<any>;
20
+ delete(id: number): Promise<void>;
21
+ private syncRelations;
22
+ private recalculateTotalXp;
23
+ private param;
24
+ private queryRows;
25
+ private querySingle;
26
+ }
27
+ //# sourceMappingURL=lesson-xp-segment.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lesson-xp-segment.service.d.ts","sourceRoot":"","sources":["../../src/lesson-xp-map/lesson-xp-segment.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAIL,wBAAwB,EACzB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,wBAAwB,EAAE,MAAM,oCAAoC,CAAC;AAE9E,qBACa,sBAAsB;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,aAAa;IAE5C,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE;;;;;;;IAkDrE,OAAO,CAAC,EAAE,EAAE,MAAM;IA6BlB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,wBAAwB;IAsBnD,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,wBAAwB;IAmChD,MAAM,CAAC,EAAE,EAAE,MAAM;YAWT,aAAa;YAwCb,kBAAkB;IAchC,OAAO,CAAC,KAAK;YAKC,SAAS;YAIT,WAAW;CAI1B"}