@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,42 @@
1
+ columns:
2
+ - type: pk
3
+ - name: user_id
4
+ type: fk
5
+ references:
6
+ table: user
7
+ column: id
8
+ onDelete: CASCADE
9
+ - name: app_name
10
+ type: varchar
11
+ length: 80
12
+ default: hedhog-desktop
13
+ - name: folder_path
14
+ type: text
15
+ isNullable: true
16
+ - name: status
17
+ type: enum
18
+ values: [started, uploading, paused, cancelling, completed, failed, cancelled]
19
+ default: started
20
+ - name: progress_percent
21
+ type: int
22
+ default: 0
23
+ - name: total_files
24
+ type: int
25
+ default: 0
26
+ - name: total_bytes
27
+ type: bigint
28
+ default: 0
29
+ - name: heartbeat_at
30
+ type: datetime
31
+ isNullable: true
32
+ - name: started_at
33
+ type: datetime
34
+ - name: finished_at
35
+ type: datetime
36
+ isNullable: true
37
+ - type: created_at
38
+ - type: updated_at
39
+
40
+ indices:
41
+ - columns: [user_id, created_at]
42
+ - columns: [status, updated_at]
@@ -0,0 +1,30 @@
1
+ columns:
2
+ - type: pk
3
+ - name: person_id
4
+ type: fk
5
+ references:
6
+ table: person
7
+ column: id
8
+ onDelete: CASCADE
9
+ - name: xp_area_id
10
+ type: fk
11
+ references:
12
+ table: xp_area
13
+ column: id
14
+ onDelete: CASCADE
15
+ - name: total_xp
16
+ type: int
17
+ default: 0
18
+ - name: event_count
19
+ type: int
20
+ default: 0
21
+ - name: last_updated_at
22
+ type: datetime
23
+ - type: created_at
24
+ - type: updated_at
25
+
26
+ indices:
27
+ - columns: [person_id, xp_area_id]
28
+ isUnique: true
29
+ - columns: [xp_area_id]
30
+ - columns: [person_id, total_xp]
@@ -0,0 +1,30 @@
1
+ columns:
2
+ - type: pk
3
+ - name: person_id
4
+ type: fk
5
+ references:
6
+ table: person
7
+ column: id
8
+ onDelete: CASCADE
9
+ - name: xp_learning_type_id
10
+ type: fk
11
+ references:
12
+ table: xp_learning_type
13
+ column: id
14
+ onDelete: CASCADE
15
+ - name: total_xp
16
+ type: int
17
+ default: 0
18
+ - name: event_count
19
+ type: int
20
+ default: 0
21
+ - name: last_updated_at
22
+ type: datetime
23
+ - type: created_at
24
+ - type: updated_at
25
+
26
+ indices:
27
+ - columns: [person_id, xp_learning_type_id]
28
+ isUnique: true
29
+ - columns: [xp_learning_type_id]
30
+ - columns: [person_id, total_xp]
@@ -0,0 +1,30 @@
1
+ columns:
2
+ - type: pk
3
+ - name: person_id
4
+ type: fk
5
+ references:
6
+ table: person
7
+ column: id
8
+ onDelete: CASCADE
9
+ - name: xp_skill_id
10
+ type: fk
11
+ references:
12
+ table: xp_skill
13
+ column: id
14
+ onDelete: CASCADE
15
+ - name: total_xp
16
+ type: int
17
+ default: 0
18
+ - name: event_count
19
+ type: int
20
+ default: 0
21
+ - name: last_updated_at
22
+ type: datetime
23
+ - type: created_at
24
+ - type: updated_at
25
+
26
+ indices:
27
+ - columns: [person_id, xp_skill_id]
28
+ isUnique: true
29
+ - columns: [xp_skill_id]
30
+ - columns: [person_id, total_xp]
@@ -0,0 +1,34 @@
1
+ columns:
2
+ - type: pk
3
+ - name: course_enrollment_id
4
+ type: fk
5
+ references:
6
+ table: course_enrollment
7
+ column: id
8
+ onDelete: CASCADE
9
+ - name: lesson_xp_segment_id
10
+ type: fk
11
+ references:
12
+ table: lesson_xp_segment
13
+ column: id
14
+ onDelete: CASCADE
15
+ - name: xp_earned
16
+ type: int
17
+ default: 0
18
+ - name: watch_percent
19
+ type: NUMERIC(5,2)
20
+ default: 0
21
+ - name: granted_at
22
+ type: datetime
23
+ - name: source
24
+ type: enum
25
+ values: [video_watch, manual_grant, recalculation, admin_override]
26
+ default: video_watch
27
+ - type: created_at
28
+ - type: updated_at
29
+
30
+ indices:
31
+ - columns: [course_enrollment_id, lesson_xp_segment_id]
32
+ isUnique: true
33
+ - columns: [lesson_xp_segment_id]
34
+ - columns: [course_enrollment_id, granted_at]
@@ -0,0 +1,39 @@
1
+ columns:
2
+ - type: pk
3
+ - name: slug
4
+ type: varchar
5
+ length: 100
6
+ isUnique: true
7
+ - name: name
8
+ type: locale_varchar
9
+ locale:
10
+ pt: Nome
11
+ en: Name
12
+ - name: description
13
+ type: locale_text
14
+ isNullable: true
15
+ locale:
16
+ pt: Descrição
17
+ en: Description
18
+ - name: icon_slug
19
+ type: varchar
20
+ length: 100
21
+ isNullable: true
22
+ - name: color
23
+ type: varchar
24
+ length: 9
25
+ isNullable: true
26
+ - name: sort_order
27
+ type: int
28
+ default: 0
29
+ - name: status
30
+ type: enum
31
+ values: [active, inactive]
32
+ default: active
33
+ - type: created_at
34
+ - type: updated_at
35
+
36
+ indices:
37
+ - columns: [slug]
38
+ isUnique: true
39
+ - columns: [status]
@@ -0,0 +1,34 @@
1
+ columns:
2
+ - type: pk
3
+ - name: slug
4
+ type: varchar
5
+ length: 100
6
+ isUnique: true
7
+ - name: name
8
+ type: locale_varchar
9
+ locale:
10
+ pt: Nome
11
+ en: Name
12
+ - name: description
13
+ type: locale_text
14
+ isNullable: true
15
+ locale:
16
+ pt: Descrição
17
+ en: Description
18
+ - name: multiplier
19
+ type: NUMERIC(5,2)
20
+ default: 1.00
21
+ - name: sort_order
22
+ type: int
23
+ default: 0
24
+ - name: status
25
+ type: enum
26
+ values: [active, inactive]
27
+ default: active
28
+ - type: created_at
29
+ - type: updated_at
30
+
31
+ indices:
32
+ - columns: [slug]
33
+ isUnique: true
34
+ - columns: [status]
@@ -0,0 +1,39 @@
1
+ columns:
2
+ - type: pk
3
+ - name: xp_area_id
4
+ type: fk
5
+ references:
6
+ table: xp_area
7
+ column: id
8
+ onDelete: SET NULL
9
+ isNullable: true
10
+ - name: slug
11
+ type: varchar
12
+ length: 100
13
+ isUnique: true
14
+ - name: name
15
+ type: locale_varchar
16
+ locale:
17
+ pt: Nome
18
+ en: Name
19
+ - name: description
20
+ type: locale_text
21
+ isNullable: true
22
+ locale:
23
+ pt: Descrição
24
+ en: Description
25
+ - name: sort_order
26
+ type: int
27
+ default: 0
28
+ - name: status
29
+ type: enum
30
+ values: [active, inactive]
31
+ default: active
32
+ - type: created_at
33
+ - type: updated_at
34
+
35
+ indices:
36
+ - columns: [slug]
37
+ isUnique: true
38
+ - columns: [xp_area_id]
39
+ - columns: [status]
package/package.json CHANGED
@@ -1,24 +1,25 @@
1
1
  {
2
2
  "name": "@hed-hog/lms",
3
- "version": "0.0.358",
3
+ "version": "0.0.364",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "dependencies": {
7
+ "@aws-sdk/client-s3": "^3.888.0",
7
8
  "@nestjs/common": "*",
8
9
  "@nestjs/config": "^4.0.2",
9
10
  "@nestjs/core": "^11",
10
11
  "@nestjs/jwt": "^11",
11
12
  "@nestjs/mapped-types": "*",
12
- "@hed-hog/api": "0.0.8",
13
+ "@hed-hog/api-types": "0.0.1",
13
14
  "@hed-hog/api-prisma": "0.0.6",
14
15
  "@hed-hog/api-locale": "0.0.14",
15
- "@hed-hog/api-types": "0.0.1",
16
+ "@hed-hog/api": "0.0.8",
16
17
  "@hed-hog/api-pagination": "0.0.7",
17
- "@hed-hog/crm": "0.0.358",
18
- "@hed-hog/category": "0.0.358",
19
- "@hed-hog/queue": "0.0.358",
20
- "@hed-hog/finance": "0.0.358",
21
- "@hed-hog/core": "0.0.358"
18
+ "@hed-hog/finance": "0.0.364",
19
+ "@hed-hog/category": "0.0.364",
20
+ "@hed-hog/core": "0.0.364",
21
+ "@hed-hog/crm": "0.0.364",
22
+ "@hed-hog/queue": "0.0.364"
22
23
  },
23
24
  "exports": {
24
25
  ".": {
@@ -1,9 +1,11 @@
1
1
  import { PrismaService } from '@hed-hog/api-prisma';
2
2
  import {
3
+ BadRequestException,
3
4
  ConflictException,
4
5
  Injectable,
5
6
  NotFoundException,
6
7
  } from '@nestjs/common';
8
+ import { CreateCurrentBitcodeWalletTransactionDto } from './dto/create-current-bitcode-wallet-transaction.dto';
7
9
  import { CreateBitcodeWalletTransactionDto } from './dto/create-bitcode-wallet-transaction.dto';
8
10
  import { CreateBitcodeWalletDto } from './dto/create-bitcode-wallet.dto';
9
11
  import { UpdateBitcodeWalletDto } from './dto/update-bitcode-wallet.dto';
@@ -220,6 +222,48 @@ export class BitcodeWalletService {
220
222
  return this.getById(created.id);
221
223
  }
222
224
 
225
+ async getCurrentUserWallet(userId: number) {
226
+ const personId = await this.resolvePersonIdFromUser(userId);
227
+ const existingWallet = await this.findWalletByPersonId(personId);
228
+
229
+ return existingWallet ? this.getById(existingWallet.id) : null;
230
+ }
231
+
232
+ async creditCurrentUserWallet(
233
+ userId: number,
234
+ dto: CreateCurrentBitcodeWalletTransactionDto
235
+ ) {
236
+ return this.createCurrentUserTransaction(userId, {
237
+ ...dto,
238
+ type: 'credit',
239
+ });
240
+ }
241
+
242
+ async createCurrentUserTransaction(
243
+ userId: number,
244
+ dto: CreateCurrentBitcodeWalletTransactionDto
245
+ ) {
246
+ const amount = Math.trunc(Number(dto.amount));
247
+ const type = dto.type ?? 'credit';
248
+
249
+ if (!Number.isFinite(amount) || amount < 1) {
250
+ throw new BadRequestException('BitCode transaction amount must be positive');
251
+ }
252
+
253
+ const personId = await this.resolvePersonIdFromUser(userId);
254
+ const wallet = await this.getOrCreateWalletByPersonId(personId);
255
+
256
+ if (type === 'debit' && Number(wallet.currentBalance ?? 0) < amount) {
257
+ throw new BadRequestException('Insufficient BitCode balance');
258
+ }
259
+
260
+ return this.createTransaction(wallet.id, {
261
+ type,
262
+ amount,
263
+ description: this.buildCurrentTransactionDescription(dto, type),
264
+ });
265
+ }
266
+
223
267
  async update(id: number, dto: UpdateBitcodeWalletDto) {
224
268
  await this.ensureWalletExists(id);
225
269
 
@@ -287,6 +331,55 @@ export class BitcodeWalletService {
287
331
  }
288
332
  }
289
333
 
334
+ private async resolvePersonIdFromUser(userId: number) {
335
+ const row = await this.querySingle<{ personId: number }>(
336
+ `SELECT person_id AS "personId" FROM person_user WHERE user_id = $1 LIMIT 1`,
337
+ [userId]
338
+ );
339
+
340
+ if (!row) {
341
+ throw new NotFoundException('No person profile found for this user');
342
+ }
343
+
344
+ return Number(row.personId);
345
+ }
346
+
347
+ private async findWalletByPersonId(personId: number) {
348
+ return this.querySingle<{ id: number }>(
349
+ `SELECT id FROM bitcode_wallet WHERE person_id = $1`,
350
+ [personId]
351
+ );
352
+ }
353
+
354
+ private async getOrCreateWalletByPersonId(personId: number) {
355
+ await this.ensurePersonExists(personId);
356
+
357
+ const created = await this.querySingle<{ id: number }>(
358
+ `INSERT INTO bitcode_wallet (
359
+ person_id,
360
+ current_balance,
361
+ created_at,
362
+ updated_at
363
+ ) VALUES (
364
+ $1,
365
+ 0,
366
+ NOW(),
367
+ NOW()
368
+ )
369
+ ON CONFLICT (person_id) DO NOTHING
370
+ RETURNING id`,
371
+ [personId]
372
+ );
373
+
374
+ const wallet = created ?? (await this.findWalletByPersonId(personId));
375
+
376
+ if (!wallet) {
377
+ throw new NotFoundException('BitCode wallet not found');
378
+ }
379
+
380
+ return this.getById(wallet.id);
381
+ }
382
+
290
383
  private async ensureWalletExists(id: number) {
291
384
  const row = await this.querySingle<{ id: number }>(
292
385
  `SELECT id FROM bitcode_wallet WHERE id = $1`,
@@ -345,6 +438,26 @@ export class BitcodeWalletService {
345
438
  return normalized ? normalized : null;
346
439
  }
347
440
 
441
+ private buildCurrentTransactionDescription(
442
+ dto: CreateCurrentBitcodeWalletTransactionDto,
443
+ type: 'credit' | 'debit'
444
+ ) {
445
+ const description = this.normalizeOptionalText(dto.description);
446
+ const source = this.normalizeOptionalText(dto.source);
447
+ const fallback = type === 'debit' ? 'Class debit' : 'Class reward';
448
+
449
+ if (description && source) {
450
+ return description.toLowerCase().includes(source.toLowerCase())
451
+ ? description
452
+ : `${description} - ${source}`;
453
+ }
454
+
455
+ if (description) return description;
456
+ if (source) return `${fallback}: ${source}`;
457
+
458
+ return fallback;
459
+ }
460
+
348
461
  private param(values: unknown[], value: unknown) {
349
462
  values.push(value);
350
463
  return `$${values.length}`;
@@ -0,0 +1,32 @@
1
+ import {
2
+ IsEnum,
3
+ IsInt,
4
+ IsOptional,
5
+ IsString,
6
+ MaxLength,
7
+ Min,
8
+ } from 'class-validator';
9
+ import {
10
+ BITCODE_TRANSACTION_TYPE_VALUES,
11
+ type BitcodeTransactionType,
12
+ } from './create-bitcode-wallet-transaction.dto';
13
+
14
+ export class CreateCurrentBitcodeWalletTransactionDto {
15
+ @IsOptional()
16
+ @IsEnum(BITCODE_TRANSACTION_TYPE_VALUES)
17
+ type?: BitcodeTransactionType;
18
+
19
+ @IsInt()
20
+ @Min(1)
21
+ amount: number;
22
+
23
+ @IsOptional()
24
+ @IsString()
25
+ @MaxLength(2000)
26
+ description?: string | null;
27
+
28
+ @IsOptional()
29
+ @IsString()
30
+ @MaxLength(200)
31
+ source?: string | null;
32
+ }
@@ -1,6 +1,6 @@
1
1
  import { PrismaService } from '@hed-hog/api-prisma';
2
2
  import { buildAiConfigFromIntegration, FileService, NotificationService, SettingService } from '@hed-hog/core';
3
- import { IJobHandler, QueueHandlerRegistry } from '@hed-hog/queue';
3
+ import { DatabaseQueueProvider, IJobHandler, NonRetryableError, QueueHandlerRegistry } from '@hed-hog/queue';
4
4
  import {
5
5
  Inject,
6
6
  Injectable,
@@ -102,6 +102,8 @@ export class CourseAudioTranscriptionService implements OnModuleInit, IJobHandle
102
102
  private readonly notificationService: NotificationService,
103
103
  @Inject(forwardRef(() => QueueHandlerRegistry))
104
104
  private readonly registry: QueueHandlerRegistry,
105
+ @Inject(forwardRef(() => DatabaseQueueProvider))
106
+ private readonly dbQueue: DatabaseQueueProvider,
105
107
  ) {}
106
108
 
107
109
  onModuleInit() {
@@ -159,18 +161,11 @@ export class CourseAudioTranscriptionService implements OnModuleInit, IJobHandle
159
161
  const transcriptionEnabled = settings['lms-audio-transcription-enabled'] !== false;
160
162
 
161
163
  if (!transcriptionEnabled) {
162
- this.logger.warn(
163
- `Transcription skipped for lesson ${lessonId}: disabled by lms-audio-transcription-enabled setting`,
164
- );
164
+ const msg = `Transcrição desabilitada nas configurações do LMS (lms-audio-transcription-enabled=false).`;
165
165
  if (notificationContext) {
166
- await this.updateAsyncNotification(
167
- notificationContext,
168
- 100,
169
- 'Transcrição desabilitada nas configurações do LMS.',
170
- false,
171
- );
166
+ await this.updateAsyncNotification(notificationContext, 100, msg, false);
172
167
  }
173
- return;
168
+ throw new NonRetryableError(msg);
174
169
  }
175
170
 
176
171
  const profileId = Number(settings['ai-openai-profile-id']);
@@ -190,18 +185,14 @@ export class CourseAudioTranscriptionService implements OnModuleInit, IJobHandle
190
185
  }
191
186
 
192
187
  if (!apiKey) {
193
- this.logger.warn(
194
- `Transcription skipped for lesson ${lessonId}: OpenAI profile not configured`,
195
- );
188
+ const profileIdValue = settings['ai-openai-profile-id'];
189
+ const msg = profileIdValue
190
+ ? `Perfil de IA (id=${profileIdValue}) não encontrado ou não possui chave de API OpenAI configurada. Verifique em Settings → Integrações → Profiles.`
191
+ : `Transcrição de áudio requer um perfil OpenAI configurado.\n\nComo configurar:\n1. Acesse Settings → Integrações → Profiles\n2. Crie um perfil do tipo OpenAI com sua API Key\n3. Copie o ID do perfil criado\n4. Acesse Settings → LMS e defina o campo \'ai-openai-profile-id\' com esse ID`;
196
192
  if (notificationContext) {
197
- await this.updateAsyncNotification(
198
- notificationContext,
199
- 100,
200
- 'Transcrição não iniciada: perfil de IA não configurado em Settings → AI.',
201
- false,
202
- );
193
+ await this.updateAsyncNotification(notificationContext, 100, msg, false);
203
194
  }
204
- return;
195
+ throw new NonRetryableError(msg);
205
196
  }
206
197
 
207
198
  const course = await (this.prismaService as any).course.findUnique({
@@ -369,6 +360,52 @@ export class CourseAudioTranscriptionService implements OnModuleInit, IJobHandle
369
360
  this.logger.log(
370
361
  `Transcription saved for lesson ${lessonId}: ${allSegments.length} segments`,
371
362
  );
363
+
364
+ // Automatically trigger XP calculation after transcription completes.
365
+ try {
366
+ const existingMap = await (this.prismaService as any).lesson_xp_map.findUnique({
367
+ where: { course_lesson_id: lessonId },
368
+ select: { id: true },
369
+ });
370
+
371
+ let mapId: number;
372
+ if (existingMap) {
373
+ mapId = existingMap.id;
374
+ await this.prismaService.$executeRawUnsafe(
375
+ `UPDATE lesson_xp_map
376
+ SET status = 'processing'::lesson_xp_map_status_d4e5f6a7b8_enum,
377
+ processing_error = NULL,
378
+ updated_at = NOW()
379
+ WHERE id = $1`,
380
+ mapId,
381
+ );
382
+ } else {
383
+ const rows = await this.prismaService.$queryRawUnsafe<{ id: number }[]>(
384
+ `INSERT INTO lesson_xp_map (course_lesson_id, version, total_xp, status, created_at, updated_at)
385
+ VALUES ($1, 1, 0, 'processing'::lesson_xp_map_status_d4e5f6a7b8_enum, NOW(), NOW())
386
+ RETURNING id`,
387
+ lessonId,
388
+ );
389
+ mapId = rows[0].id;
390
+ }
391
+
392
+ await this.dbQueue.enqueue({
393
+ type: 'lms.lesson.xp.calculate',
394
+ queueName: 'lms.lesson.xp.calculate',
395
+ payload: { lessonId, mapId, userId: notificationUserId ?? 0 },
396
+ maxAttempts: 3,
397
+ sourceModule: 'lms',
398
+ sourceEntity: 'course_lesson',
399
+ sourceEntityId: String(lessonId),
400
+ });
401
+
402
+ this.logger.log(`XP calculation job enqueued for lesson ${lessonId} (map ${mapId})`);
403
+ } catch (xpErr) {
404
+ this.logger.warn(
405
+ `Failed to enqueue XP calculation for lesson ${lessonId}: ${xpErr instanceof Error ? xpErr.message : String(xpErr)}`,
406
+ );
407
+ }
408
+
372
409
  await emitProgress(
373
410
  `Transcrição concluída com ${allSegments.length} segmento(s).`,
374
411
  {
@@ -1,5 +1,5 @@
1
1
  import { Role } from '@hed-hog/api';
2
- import { Body, Controller, Get, Param, ParseIntPipe, Put } from '@nestjs/common';
2
+ import { Body, Controller, Get, Param, ParseIntPipe, Post, Put } from '@nestjs/common';
3
3
  import { CourseStructureService } from './course-structure.service';
4
4
  import { UpdateTranscriptionSegmentsDTO } from './dto/update-transcription-segments.dto';
5
5
 
@@ -25,4 +25,9 @@ export class CourseLessonController {
25
25
  getAudioFiles(@Param('id', ParseIntPipe) id: number) {
26
26
  return this.courseStructureService.getAudioFiles(id);
27
27
  }
28
+
29
+ @Post(':id/transcription/start')
30
+ startTranscription(@Param('id', ParseIntPipe) id: number) {
31
+ return this.courseStructureService.startTranscription(id);
32
+ }
28
33
  }
@@ -11,6 +11,7 @@ import {
11
11
  } from '@nestjs/common';
12
12
  import { CourseStructureService } from './course-structure.service';
13
13
  import { CourseVideoConversionService } from './course-video-conversion.service';
14
+ import { CreateCourseBulkJobDto } from './dto/create-course-bulk-job.dto';
14
15
  import { CreateCourseLessonFrameDto } from './dto/create-course-lesson-frame.dto';
15
16
  import {
16
17
  CreateCourseStructureLessonDto,
@@ -227,4 +228,13 @@ export class CourseStructureController {
227
228
  ) {
228
229
  return this.courseStructureService.duplicateLesson(courseId, sessionId, lessonId);
229
230
  }
231
+
232
+ @Post('bulk-jobs')
233
+ createBulkJobs(
234
+ @User() user: any,
235
+ @Param('id', ParseIntPipe) courseId: number,
236
+ @Body() dto: CreateCourseBulkJobDto,
237
+ ) {
238
+ return this.courseStructureService.bulkEnqueueJobs(courseId, dto.jobType, user?.id ?? 0);
239
+ }
230
240
  }