@hed-hog/lms 0.0.364 → 0.0.366

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 (290) hide show
  1. package/dist/bitcode-wallet/bitcode-wallet.service.d.ts +1 -0
  2. package/dist/bitcode-wallet/bitcode-wallet.service.d.ts.map +1 -1
  3. package/dist/bitcode-wallet/bitcode-wallet.service.js +22 -3
  4. package/dist/bitcode-wallet/bitcode-wallet.service.js.map +1 -1
  5. package/dist/class-group/class-group.controller.d.ts +1 -0
  6. package/dist/class-group/class-group.controller.d.ts.map +1 -1
  7. package/dist/class-group/class-group.service.d.ts +1 -0
  8. package/dist/class-group/class-group.service.d.ts.map +1 -1
  9. package/dist/course/course-export-scorm12-worker.service.d.ts +21 -0
  10. package/dist/course/course-export-scorm12-worker.service.d.ts.map +1 -0
  11. package/dist/course/course-export-scorm12-worker.service.js +109 -0
  12. package/dist/course/course-export-scorm12-worker.service.js.map +1 -0
  13. package/dist/course/course-export-scorm12.service.d.ts +42 -0
  14. package/dist/course/course-export-scorm12.service.d.ts.map +1 -0
  15. package/dist/course/course-export-scorm12.service.js +628 -0
  16. package/dist/course/course-export-scorm12.service.js.map +1 -0
  17. package/dist/course/course-export.service.d.ts +84 -0
  18. package/dist/course/course-export.service.d.ts.map +1 -0
  19. package/dist/course/course-export.service.js +237 -0
  20. package/dist/course/course-export.service.js.map +1 -0
  21. package/dist/course/course-structure.controller.d.ts +20 -10
  22. package/dist/course/course-structure.controller.d.ts.map +1 -1
  23. package/dist/course/course-structure.controller.js +20 -4
  24. package/dist/course/course-structure.controller.js.map +1 -1
  25. package/dist/course/course-structure.service.d.ts +12 -4
  26. package/dist/course/course-structure.service.d.ts.map +1 -1
  27. package/dist/course/course-structure.service.js +98 -23
  28. package/dist/course/course-structure.service.js.map +1 -1
  29. package/dist/course/course-video-agent-pipeline.service.d.ts +70 -0
  30. package/dist/course/course-video-agent-pipeline.service.d.ts.map +1 -0
  31. package/dist/course/course-video-agent-pipeline.service.js +398 -0
  32. package/dist/course/course-video-agent-pipeline.service.js.map +1 -0
  33. package/dist/course/course-video-hls.service.d.ts +71 -0
  34. package/dist/course/course-video-hls.service.d.ts.map +1 -0
  35. package/dist/course/course-video-hls.service.js +784 -0
  36. package/dist/course/course-video-hls.service.js.map +1 -0
  37. package/dist/course/course.controller.d.ts +47 -13
  38. package/dist/course/course.controller.d.ts.map +1 -1
  39. package/dist/course/course.controller.js +40 -26
  40. package/dist/course/course.controller.js.map +1 -1
  41. package/dist/course/course.mcp-tools.js +1 -1
  42. package/dist/course/course.mcp-tools.js.map +1 -1
  43. package/dist/course/course.module.d.ts.map +1 -1
  44. package/dist/course/course.module.js +16 -0
  45. package/dist/course/course.module.js.map +1 -1
  46. package/dist/course/course.service.d.ts +8 -9
  47. package/dist/course/course.service.d.ts.map +1 -1
  48. package/dist/course/course.service.js +93 -50
  49. package/dist/course/course.service.js.map +1 -1
  50. package/dist/course/dto/cleanup-course-storage.dto.d.ts +1 -1
  51. package/dist/course/dto/cleanup-course-storage.dto.d.ts.map +1 -1
  52. package/dist/course/dto/cleanup-course-storage.dto.js +1 -0
  53. package/dist/course/dto/cleanup-course-storage.dto.js.map +1 -1
  54. package/dist/course/dto/cleanup-upload-history.dto.d.ts +1 -1
  55. package/dist/course/dto/cleanup-upload-history.dto.d.ts.map +1 -1
  56. package/dist/course/dto/cleanup-upload-history.dto.js +1 -1
  57. package/dist/course/dto/cleanup-upload-history.dto.js.map +1 -1
  58. package/dist/course/dto/create-course-bulk-job.dto.d.ts +2 -1
  59. package/dist/course/dto/create-course-bulk-job.dto.d.ts.map +1 -1
  60. package/dist/course/dto/create-course-bulk-job.dto.js +6 -1
  61. package/dist/course/dto/create-course-bulk-job.dto.js.map +1 -1
  62. package/dist/course/dto/create-course-export.dto.d.ts +14 -0
  63. package/dist/course/dto/create-course-export.dto.d.ts.map +1 -0
  64. package/dist/course/dto/create-course-export.dto.js +71 -0
  65. package/dist/course/dto/create-course-export.dto.js.map +1 -0
  66. package/dist/course/dto/create-course-structure-lesson.dto.d.ts +2 -2
  67. package/dist/course/dto/create-course-structure-lesson.dto.d.ts.map +1 -1
  68. package/dist/course/dto/create-course-structure-lesson.dto.js +3 -2
  69. package/dist/course/dto/create-course-structure-lesson.dto.js.map +1 -1
  70. package/dist/course/ffmpeg.util.d.ts +10 -0
  71. package/dist/course/ffmpeg.util.d.ts.map +1 -0
  72. package/dist/course/ffmpeg.util.js +79 -0
  73. package/dist/course/ffmpeg.util.js.map +1 -0
  74. package/dist/course/lms-bulk-upload-automation.service.d.ts +18 -1
  75. package/dist/course/lms-bulk-upload-automation.service.d.ts.map +1 -1
  76. package/dist/course/lms-bulk-upload-automation.service.js +106 -8
  77. package/dist/course/lms-bulk-upload-automation.service.js.map +1 -1
  78. package/dist/course/lms-bulk-upload-infra.service.d.ts +1 -0
  79. package/dist/course/lms-bulk-upload-infra.service.d.ts.map +1 -1
  80. package/dist/course/lms-bulk-upload-infra.service.js +32 -8
  81. package/dist/course/lms-bulk-upload-infra.service.js.map +1 -1
  82. package/dist/course/lms-bulk-upload.controller.d.ts +30 -3
  83. package/dist/course/lms-bulk-upload.controller.d.ts.map +1 -1
  84. package/dist/course/lms-bulk-upload.controller.js +43 -2
  85. package/dist/course/lms-bulk-upload.controller.js.map +1 -1
  86. package/dist/course/lms-bulk-upload.service.d.ts +11 -0
  87. package/dist/course/lms-bulk-upload.service.d.ts.map +1 -1
  88. package/dist/course/lms-bulk-upload.service.js +59 -6
  89. package/dist/course/lms-bulk-upload.service.js.map +1 -1
  90. package/dist/course/lms-setting.controller.d.ts +2 -1
  91. package/dist/course/lms-setting.controller.d.ts.map +1 -1
  92. package/dist/course/lms-setting.controller.js +4 -2
  93. package/dist/course/lms-setting.controller.js.map +1 -1
  94. package/dist/course/scorm12-schemas.d.ts +4 -0
  95. package/dist/course/scorm12-schemas.d.ts.map +1 -0
  96. package/dist/course/scorm12-schemas.js +9 -0
  97. package/dist/course/scorm12-schemas.js.map +1 -0
  98. package/dist/enterprise/training/training-admin.controller.d.ts +2 -0
  99. package/dist/enterprise/training/training-admin.controller.d.ts.map +1 -1
  100. package/dist/enterprise/training/training-admin.service.d.ts +2 -0
  101. package/dist/enterprise/training/training-admin.service.d.ts.map +1 -1
  102. package/dist/enterprise/training/training-student.service.d.ts +51 -0
  103. package/dist/enterprise/training/training-student.service.d.ts.map +1 -1
  104. package/dist/enterprise/training/training-student.service.js +217 -4
  105. package/dist/enterprise/training/training-student.service.js.map +1 -1
  106. package/dist/evaluation/evaluation.service.d.ts +18 -0
  107. package/dist/evaluation/evaluation.service.d.ts.map +1 -1
  108. package/dist/evaluation/evaluation.service.js +125 -0
  109. package/dist/evaluation/evaluation.service.js.map +1 -1
  110. package/dist/exam/dto/create-standalone-question.dto.d.ts +12 -0
  111. package/dist/exam/dto/create-standalone-question.dto.d.ts.map +1 -0
  112. package/dist/exam/dto/create-standalone-question.dto.js +70 -0
  113. package/dist/exam/dto/create-standalone-question.dto.js.map +1 -0
  114. package/dist/exam/exam.module.d.ts.map +1 -1
  115. package/dist/exam/exam.module.js +2 -1
  116. package/dist/exam/exam.module.js.map +1 -1
  117. package/dist/exam/exam.service.d.ts +21 -0
  118. package/dist/exam/exam.service.d.ts.map +1 -1
  119. package/dist/exam/exam.service.js +80 -0
  120. package/dist/exam/exam.service.js.map +1 -1
  121. package/dist/exam/question.controller.d.ts +27 -0
  122. package/dist/exam/question.controller.d.ts.map +1 -0
  123. package/dist/exam/question.controller.js +53 -0
  124. package/dist/exam/question.controller.js.map +1 -0
  125. package/dist/lesson-xp-map/lesson-xp-ai-calculation.service.d.ts +4 -0
  126. package/dist/lesson-xp-map/lesson-xp-ai-calculation.service.d.ts.map +1 -1
  127. package/dist/lesson-xp-map/lesson-xp-ai-calculation.service.js +161 -25
  128. package/dist/lesson-xp-map/lesson-xp-ai-calculation.service.js.map +1 -1
  129. package/dist/libraries/lms/tsconfig.tsbuildinfo +1 -1
  130. package/dist/lms-commerce-access.subscriber.d.ts +11 -0
  131. package/dist/lms-commerce-access.subscriber.d.ts.map +1 -0
  132. package/dist/lms-commerce-access.subscriber.js +74 -0
  133. package/dist/lms-commerce-access.subscriber.js.map +1 -0
  134. package/dist/lms.module.d.ts.map +1 -1
  135. package/dist/lms.module.js +16 -5
  136. package/dist/lms.module.js.map +1 -1
  137. package/dist/platforma/dto/heartbeat.dto.d.ts +9 -0
  138. package/dist/platforma/dto/heartbeat.dto.d.ts.map +1 -0
  139. package/dist/platforma/dto/heartbeat.dto.js +50 -0
  140. package/dist/platforma/dto/heartbeat.dto.js.map +1 -0
  141. package/dist/platforma/handlers/emit-certificate.handler.d.ts +27 -0
  142. package/dist/platforma/handlers/emit-certificate.handler.d.ts.map +1 -0
  143. package/dist/platforma/handlers/emit-certificate.handler.js +117 -0
  144. package/dist/platforma/handlers/emit-certificate.handler.js.map +1 -0
  145. package/dist/platforma/handlers/lesson-heartbeat.handler.d.ts +31 -0
  146. package/dist/platforma/handlers/lesson-heartbeat.handler.d.ts.map +1 -0
  147. package/dist/platforma/handlers/lesson-heartbeat.handler.js +281 -0
  148. package/dist/platforma/handlers/lesson-heartbeat.handler.js.map +1 -0
  149. package/dist/platforma/platforma-heartbeat.service.d.ts +10 -0
  150. package/dist/platforma/platforma-heartbeat.service.d.ts.map +1 -0
  151. package/dist/platforma/platforma-heartbeat.service.js +50 -0
  152. package/dist/platforma/platforma-heartbeat.service.js.map +1 -0
  153. package/dist/platforma/platforma-performance.service.d.ts +121 -0
  154. package/dist/platforma/platforma-performance.service.d.ts.map +1 -0
  155. package/dist/platforma/platforma-performance.service.js +500 -0
  156. package/dist/platforma/platforma-performance.service.js.map +1 -0
  157. package/dist/platforma/platforma-search.service.d.ts +21 -0
  158. package/dist/platforma/platforma-search.service.d.ts.map +1 -0
  159. package/dist/platforma/platforma-search.service.js +64 -0
  160. package/dist/platforma/platforma-search.service.js.map +1 -0
  161. package/dist/platforma/platforma-video.service.d.ts +39 -0
  162. package/dist/platforma/platforma-video.service.d.ts.map +1 -0
  163. package/dist/platforma/platforma-video.service.js +301 -0
  164. package/dist/platforma/platforma-video.service.js.map +1 -0
  165. package/dist/platforma/platforma.controller.d.ts +209 -1
  166. package/dist/platforma/platforma.controller.d.ts.map +1 -1
  167. package/dist/platforma/platforma.controller.js +208 -2
  168. package/dist/platforma/platforma.controller.js.map +1 -1
  169. package/dist/realtime/lms-realtime.controller.d.ts +2 -0
  170. package/dist/realtime/lms-realtime.controller.d.ts.map +1 -1
  171. package/dist/realtime/lms-realtime.controller.js +31 -0
  172. package/dist/realtime/lms-realtime.controller.js.map +1 -1
  173. package/dist/realtime/lms-realtime.service.d.ts +1 -1
  174. package/dist/realtime/lms-realtime.service.d.ts.map +1 -1
  175. package/dist/realtime/lms-realtime.service.js.map +1 -1
  176. package/dist/student-xp/dto/grant-skill-card-xp.dto.d.ts +5 -0
  177. package/dist/student-xp/dto/grant-skill-card-xp.dto.d.ts.map +1 -0
  178. package/dist/student-xp/dto/grant-skill-card-xp.dto.js +26 -0
  179. package/dist/student-xp/dto/grant-skill-card-xp.dto.js.map +1 -0
  180. package/dist/student-xp/student-xp.controller.d.ts +15 -0
  181. package/dist/student-xp/student-xp.controller.d.ts.map +1 -1
  182. package/dist/student-xp/student-xp.controller.js +24 -0
  183. package/dist/student-xp/student-xp.controller.js.map +1 -1
  184. package/dist/student-xp/student-xp.service.d.ts +16 -0
  185. package/dist/student-xp/student-xp.service.d.ts.map +1 -1
  186. package/dist/student-xp/student-xp.service.js +51 -1
  187. package/dist/student-xp/student-xp.service.js.map +1 -1
  188. package/hedhog/data/evaluation_topic.yaml +17 -0
  189. package/hedhog/data/menu.yaml +0 -17
  190. package/hedhog/data/queue_definition.yaml +48 -0
  191. package/hedhog/data/route.yaml +94 -124
  192. package/hedhog/data/setting_group.yaml +19 -19
  193. package/hedhog/frontend/app/bulk-upload-sessions/page.tsx.ejs +337 -41
  194. package/hedhog/frontend/app/certificates/models/page.tsx.ejs +182 -29
  195. package/hedhog/frontend/app/classes/_components/classes-calendar-view.tsx.ejs +277 -0
  196. package/hedhog/frontend/app/classes/page.tsx.ejs +127 -20
  197. package/hedhog/frontend/app/courses/[id]/page.tsx.ejs +69 -4
  198. package/hedhog/frontend/app/courses/[id]/structure/_components/course-export-sheet.tsx.ejs +420 -0
  199. package/hedhog/frontend/app/courses/[id]/structure/_components/course-exports-tab.tsx.ejs +308 -0
  200. package/hedhog/frontend/app/courses/[id]/structure/_components/course-overview-tab.tsx.ejs +158 -45
  201. package/hedhog/frontend/app/courses/[id]/structure/_components/course-xp-overview-tab.tsx.ejs +13 -13
  202. package/hedhog/frontend/app/courses/[id]/structure/_components/detail-lesson-xp-tab.tsx.ejs +11 -23
  203. package/hedhog/frontend/app/courses/[id]/structure/_components/detail-lesson.tsx.ejs +51 -63
  204. package/hedhog/frontend/app/courses/[id]/structure/_components/detail-panel.tsx.ejs +8 -3
  205. package/hedhog/frontend/app/courses/[id]/structure/_components/detail-session.tsx.ejs +31 -8
  206. package/hedhog/frontend/app/courses/[id]/structure/_components/drag-overlay.tsx.ejs +16 -9
  207. package/hedhog/frontend/app/courses/[id]/structure/_components/editor-course.tsx.ejs +201 -401
  208. package/hedhog/frontend/app/courses/[id]/structure/_components/editor-lesson.tsx.ejs +378 -690
  209. package/hedhog/frontend/app/courses/[id]/structure/_components/mock-data.ts.ejs +1 -2
  210. package/hedhog/frontend/app/courses/[id]/structure/_components/tree-row-lesson.tsx.ejs +3 -9
  211. package/hedhog/frontend/app/courses/[id]/structure/_components/types.ts.ejs +1 -1
  212. package/hedhog/frontend/app/courses/[id]/structure/_components/xp-premium-pills.tsx.ejs +1 -8
  213. package/hedhog/frontend/app/courses/[id]/structure/_data/adapters/course-structure.adapter.ts.ejs +6 -10
  214. package/hedhog/frontend/app/courses/[id]/structure/_data/services/course-structure.service.ts.ejs +49 -0
  215. package/hedhog/frontend/app/courses/[id]/structure/_data/types/api-course.types.ts.ejs +4 -3
  216. package/hedhog/frontend/app/courses/[id]/structure/_data/use-course-content-overview.ts.ejs +2 -1
  217. package/hedhog/frontend/app/courses/[id]/structure/_data/use-course-exports.ts.ejs +106 -0
  218. package/hedhog/frontend/app/courses/[id]/structure/_data/use-course-structure-mutations.ts.ejs +28 -1
  219. package/hedhog/frontend/app/courses/[id]/structure/_data/use-lms-settings-query.ts.ejs +0 -2
  220. package/hedhog/frontend/app/courses/page.tsx.ejs +85 -9
  221. package/hedhog/frontend/app/enterprise/[id]/page.tsx.ejs +6 -0
  222. package/hedhog/frontend/app/enterprise/_components/enterprise-classes-calendar-tab.tsx.ejs +264 -0
  223. package/hedhog/frontend/app/enterprise/page.tsx.ejs +104 -47
  224. package/hedhog/frontend/app/exams/page.tsx.ejs +38 -4
  225. package/hedhog/frontend/app/instructors/page.tsx.ejs +87 -46
  226. package/hedhog/frontend/app/paths/page.tsx.ejs +38 -4
  227. package/hedhog/frontend/app/training/page.tsx.ejs +38 -4
  228. package/hedhog/frontend/messages/en.json +44 -28
  229. package/hedhog/frontend/messages/pt.json +47 -29
  230. package/hedhog/table/course_enrollment.yaml +3 -0
  231. package/hedhog/table/course_export.yaml +62 -0
  232. package/hedhog/table/lesson_view_event.yaml +66 -0
  233. package/package.json +14 -9
  234. package/src/bitcode-wallet/bitcode-wallet.service.ts +43 -4
  235. package/src/course/course-export-scorm12-worker.service.ts +124 -0
  236. package/src/course/course-export-scorm12.service.ts +668 -0
  237. package/src/course/course-export.service.ts +280 -0
  238. package/src/course/course-structure.controller.ts +16 -2
  239. package/src/course/course-structure.service.ts +100 -7
  240. package/src/course/course-video-agent-pipeline.service.ts +471 -0
  241. package/src/course/course-video-hls.service.ts +966 -0
  242. package/src/course/course.controller.ts +33 -19
  243. package/src/course/course.mcp-tools.ts +1 -1
  244. package/src/course/course.module.ts +16 -0
  245. package/src/course/course.service.ts +119 -61
  246. package/src/course/dto/cleanup-course-storage.dto.ts +1 -0
  247. package/src/course/dto/cleanup-upload-history.dto.ts +1 -1
  248. package/src/course/dto/create-course-bulk-job.dto.ts +7 -3
  249. package/src/course/dto/create-course-export.dto.ts +56 -0
  250. package/src/course/dto/create-course-structure-lesson.dto.ts +4 -3
  251. package/src/course/ffmpeg.util.ts +65 -0
  252. package/src/course/lms-bulk-upload-automation.service.ts +156 -6
  253. package/src/course/lms-bulk-upload-infra.service.ts +39 -6
  254. package/src/course/lms-bulk-upload.controller.ts +32 -2
  255. package/src/course/lms-bulk-upload.service.ts +70 -7
  256. package/src/course/lms-setting.controller.ts +4 -2
  257. package/src/course/scorm12-schemas.ts +9 -0
  258. package/src/enterprise/training/training-student.service.ts +221 -2
  259. package/src/evaluation/evaluation.service.ts +123 -0
  260. package/src/exam/dto/create-standalone-question.dto.ts +66 -0
  261. package/src/exam/exam.module.ts +2 -1
  262. package/src/exam/exam.service.ts +86 -0
  263. package/src/exam/question.controller.ts +28 -0
  264. package/src/lesson-xp-map/lesson-xp-ai-calculation.service.ts +205 -31
  265. package/src/lms-commerce-access.subscriber.ts +88 -0
  266. package/src/lms.module.ts +16 -5
  267. package/src/platforma/dto/heartbeat.dto.ts +30 -0
  268. package/src/platforma/handlers/emit-certificate.handler.ts +117 -0
  269. package/src/platforma/handlers/lesson-heartbeat.handler.ts +343 -0
  270. package/src/platforma/platforma-heartbeat.service.ts +33 -0
  271. package/src/platforma/platforma-performance.service.ts +606 -0
  272. package/src/platforma/platforma-search.service.ts +48 -0
  273. package/src/platforma/platforma-video.service.ts +346 -0
  274. package/src/platforma/platforma.controller.ts +137 -1
  275. package/src/platforma/platforma.service.ts +268 -268
  276. package/src/realtime/lms-realtime.controller.ts +27 -1
  277. package/src/realtime/lms-realtime.service.ts +2 -1
  278. package/src/student-xp/dto/grant-skill-card-xp.dto.ts +10 -0
  279. package/src/student-xp/student-xp.controller.ts +18 -2
  280. package/src/student-xp/student-xp.service.ts +84 -2
  281. package/hedhog/data/video_resolution_profile.yaml +0 -7
  282. package/hedhog/frontend/app/video-resolution-profiles/page.tsx.ejs +0 -607
  283. package/hedhog/table/course_video_resolution_profile.yaml +0 -22
  284. package/hedhog/table/video_resolution_profile.yaml +0 -18
  285. package/src/video-resolution-profile/dto/create-video-resolution-profile.dto.ts +0 -16
  286. package/src/video-resolution-profile/dto/update-video-resolution-profile.dto.ts +0 -16
  287. package/src/video-resolution-profile/video-resolution-profile.controller.ts +0 -62
  288. package/src/video-resolution-profile/video-resolution-profile.mcp-tools.ts +0 -128
  289. package/src/video-resolution-profile/video-resolution-profile.module.ts +0 -13
  290. package/src/video-resolution-profile/video-resolution-profile.service.ts +0 -117
@@ -0,0 +1,62 @@
1
+ columns:
2
+ - type: pk
3
+ - name: course_id
4
+ type: fk
5
+ references:
6
+ table: course
7
+ column: id
8
+ onDelete: CASCADE
9
+ - name: user_id
10
+ type: fk
11
+ references:
12
+ table: user
13
+ column: id
14
+ onDelete: CASCADE
15
+ - name: format
16
+ type: varchar
17
+ length: 32
18
+ - name: status
19
+ type: enum
20
+ values: [pending, processing, completed, failed]
21
+ default: pending
22
+ - name: queue_job_id
23
+ type: fk
24
+ isNullable: true
25
+ references:
26
+ table: queue_job
27
+ column: id
28
+ onDelete: SET NULL
29
+ - name: file_id
30
+ type: fk
31
+ isNullable: true
32
+ references:
33
+ table: file
34
+ column: id
35
+ onDelete: SET NULL
36
+ - name: settings
37
+ type: jsonb
38
+ isNullable: true
39
+ - name: duration_seconds
40
+ type: int
41
+ isNullable: true
42
+ - name: error_message
43
+ type: text
44
+ isNullable: true
45
+ - name: notification_id
46
+ type: int
47
+ isNullable: true
48
+ - name: started_at
49
+ type: datetime
50
+ isNullable: true
51
+ - name: finished_at
52
+ type: datetime
53
+ isNullable: true
54
+ - type: created_at
55
+ - type: updated_at
56
+
57
+ indices:
58
+ - columns: [course_id]
59
+ - columns: [user_id]
60
+ - columns: [course_id, status]
61
+ - columns: [queue_job_id]
62
+ - columns: [file_id]
@@ -0,0 +1,66 @@
1
+ columns:
2
+ - type: pk
3
+ - name: user_id
4
+ type: int
5
+ isNullable: true
6
+ - name: course_lesson_id
7
+ type: fk
8
+ isNullable: true
9
+ references:
10
+ table: course_lesson
11
+ column: id
12
+ onDelete: SET NULL
13
+ - name: course_enrollment_id
14
+ type: fk
15
+ isNullable: true
16
+ references:
17
+ table: course_enrollment
18
+ column: id
19
+ onDelete: SET NULL
20
+ - name: session_id
21
+ type: varchar
22
+ length: 36
23
+ isNullable: true
24
+ - name: video_position_seconds
25
+ type: int
26
+ default: 0
27
+ - name: ip
28
+ type: varchar
29
+ length: 45
30
+ isNullable: true
31
+ - name: country
32
+ type: varchar
33
+ length: 2
34
+ isNullable: true
35
+ - name: city
36
+ type: varchar
37
+ length: 100
38
+ isNullable: true
39
+ - name: browser
40
+ type: varchar
41
+ length: 50
42
+ isNullable: true
43
+ - name: os
44
+ type: varchar
45
+ length: 50
46
+ isNullable: true
47
+ - name: device_type
48
+ type: varchar
49
+ length: 20
50
+ isNullable: true
51
+ - name: screen_width
52
+ type: int
53
+ isNullable: true
54
+ - name: screen_height
55
+ type: int
56
+ isNullable: true
57
+ - name: is_touch
58
+ type: boolean
59
+ default: false
60
+ - type: created_at
61
+
62
+ indices:
63
+ - columns: [user_id, created_at]
64
+ - columns: [course_lesson_id, created_at]
65
+ - columns: [created_at]
66
+ - columns: [course_enrollment_id]
package/package.json CHANGED
@@ -1,25 +1,30 @@
1
1
  {
2
2
  "name": "@hed-hog/lms",
3
- "version": "0.0.364",
3
+ "version": "0.0.366",
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
+ "@aws-sdk/client-s3": "3.1014.0",
8
+ "archiver": "^5.3.2",
9
+ "@types/archiver": "^5.3.4",
10
+ "@aws-sdk/s3-request-presigner": "3.1014.0",
8
11
  "@nestjs/common": "*",
9
12
  "@nestjs/config": "^4.0.2",
10
13
  "@nestjs/core": "^11",
11
14
  "@nestjs/jwt": "^11",
12
15
  "@nestjs/mapped-types": "*",
13
- "@hed-hog/api-types": "0.0.1",
14
16
  "@hed-hog/api-prisma": "0.0.6",
15
17
  "@hed-hog/api-locale": "0.0.14",
16
- "@hed-hog/api": "0.0.8",
17
18
  "@hed-hog/api-pagination": "0.0.7",
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"
19
+ "@hed-hog/api": "0.0.8",
20
+ "@hed-hog/category": "0.0.366",
21
+ "@hed-hog/api-types": "0.0.1",
22
+ "@hed-hog/crm": "0.0.366",
23
+ "@hed-hog/finance": "0.0.366",
24
+ "@hed-hog/core": "0.0.366",
25
+ "@hed-hog/queue": "0.0.366",
26
+ "@hed-hog/commerce": "0.0.366",
27
+ "@hed-hog/agent": "0.0.366"
23
28
  },
24
29
  "exports": {
25
30
  ".": {
@@ -223,10 +223,8 @@ export class BitcodeWalletService {
223
223
  }
224
224
 
225
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;
226
+ const personId = await this.resolveOrCreatePersonForUser(userId);
227
+ return this.getOrCreateWalletByPersonId(personId);
230
228
  }
231
229
 
232
230
  async creditCurrentUserWallet(
@@ -344,6 +342,47 @@ export class BitcodeWalletService {
344
342
  return Number(row.personId);
345
343
  }
346
344
 
345
+ private async resolveOrCreatePersonForUser(userId: number): Promise<number> {
346
+ const existing = await this.querySingle<{ personId: number }>(
347
+ `SELECT person_id AS "personId" FROM person_user WHERE user_id = $1 LIMIT 1`,
348
+ [userId]
349
+ );
350
+ if (existing) return Number(existing.personId);
351
+
352
+ // Gather name: prefer commerce_customer (richer), fall back to user record
353
+ const customerRow = await this.querySingle<{ name: string }>(
354
+ `SELECT name FROM commerce_customer
355
+ WHERE user_id = $1 AND deleted_at IS NULL
356
+ ORDER BY id DESC LIMIT 1`,
357
+ [userId]
358
+ );
359
+
360
+ const userRow = await this.querySingle<{ name: string }>(
361
+ `SELECT name FROM "user" WHERE id = $1`,
362
+ [userId]
363
+ );
364
+
365
+ const personName = customerRow?.name || userRow?.name || `Usuário #${userId}`;
366
+
367
+ const person = await this.querySingle<{ id: number }>(
368
+ `INSERT INTO person (name, type, status, created_at, updated_at)
369
+ VALUES ($1, 'individual'::person_type_6dfa750c4d_enum, 'active'::person_status_7efb97d61c_enum, NOW(), NOW())
370
+ RETURNING id`,
371
+ [personName]
372
+ );
373
+
374
+ if (!person) throw new Error('Failed to create person profile');
375
+
376
+ await this.querySingle(
377
+ `INSERT INTO person_user (person_id, user_id, created_at, updated_at)
378
+ VALUES ($1, $2, NOW(), NOW())
379
+ ON CONFLICT DO NOTHING`,
380
+ [person.id, userId]
381
+ );
382
+
383
+ return person.id;
384
+ }
385
+
347
386
  private async findWalletByPersonId(personId: number) {
348
387
  return this.querySingle<{ id: number }>(
349
388
  `SELECT id FROM bitcode_wallet WHERE person_id = $1`,
@@ -0,0 +1,124 @@
1
+ import { FileService, NotificationService } from '@hed-hog/core';
2
+ import { IJobHandler, QueueHandlerRegistry } from '@hed-hog/queue';
3
+ import {
4
+ Inject,
5
+ Injectable,
6
+ Logger,
7
+ OnModuleInit,
8
+ forwardRef,
9
+ } from '@nestjs/common';
10
+ import { promises as fs } from 'fs';
11
+ import { tmpdir } from 'os';
12
+ import { join } from 'path';
13
+ import { CourseExportScorm12Service } from './course-export-scorm12.service';
14
+ import { CourseExportService, LMS_COURSE_EXPORT_SCORM12_JOB } from './course-export.service';
15
+
16
+ @Injectable()
17
+ export class CourseExportScorm12WorkerService implements OnModuleInit, IJobHandler {
18
+ private readonly logger = new Logger(CourseExportScorm12WorkerService.name);
19
+
20
+ constructor(
21
+ @Inject(forwardRef(() => FileService))
22
+ private readonly fileService: FileService,
23
+ @Inject(forwardRef(() => NotificationService))
24
+ private readonly notificationService: NotificationService,
25
+ @Inject(forwardRef(() => QueueHandlerRegistry))
26
+ private readonly registry: QueueHandlerRegistry,
27
+ private readonly courseExportService: CourseExportService,
28
+ private readonly scorm12Builder: CourseExportScorm12Service,
29
+ ) {}
30
+
31
+ onModuleInit() {
32
+ this.registry.register(LMS_COURSE_EXPORT_SCORM12_JOB, this);
33
+ this.logger.log(`Registered handler for job type: ${LMS_COURSE_EXPORT_SCORM12_JOB}`);
34
+ }
35
+
36
+ async handle(job: {
37
+ id: number;
38
+ type: string;
39
+ payload: Record<string, any>;
40
+ }): Promise<void> {
41
+ const { exportId, courseId, userId, notificationId, settings } =
42
+ job.payload as {
43
+ exportId: number;
44
+ courseId: number;
45
+ userId: number;
46
+ notificationId: number;
47
+ settings: Record<string, any>;
48
+ };
49
+
50
+ const startedAt = Date.now();
51
+ const workDir = await fs.mkdtemp(join(tmpdir(), `scorm-${job.id}-`));
52
+
53
+ try {
54
+ this.logger.log(`Starting SCORM 1.2 export ${exportId} for course ${courseId}`);
55
+ await this.courseExportService.markStarted(exportId);
56
+ await this.notificationService.updateProgress(userId, notificationId, {
57
+ progress: 5,
58
+ body: 'Iniciando exportação SCORM 1.2...',
59
+ });
60
+
61
+ const { zipPath, filename } = await this.scorm12Builder.buildPackage({
62
+ courseId,
63
+ settings,
64
+ workDir,
65
+ onProgress: async (pct, msg) => {
66
+ await this.notificationService.updateProgress(userId, notificationId, {
67
+ progress: pct,
68
+ body: msg,
69
+ });
70
+ },
71
+ });
72
+
73
+ await this.notificationService.updateProgress(userId, notificationId, {
74
+ progress: 90,
75
+ body: 'Fazendo upload do pacote SCORM...',
76
+ });
77
+
78
+ const stat = await fs.stat(zipPath);
79
+ const uploadedFile = await this.fileService.uploadFromPath(
80
+ 'course-exports',
81
+ zipPath,
82
+ {
83
+ originalname: filename,
84
+ mimetype: 'application/zip',
85
+ size: stat.size,
86
+ },
87
+ );
88
+
89
+ const durationSeconds = Math.round((Date.now() - startedAt) / 1000);
90
+ await this.courseExportService.markCompleted(
91
+ exportId,
92
+ uploadedFile.id,
93
+ durationSeconds,
94
+ );
95
+
96
+ await this.notificationService.updateProgress(userId, notificationId, {
97
+ progress: 100,
98
+ body: `Exportação SCORM 1.2 concluída em ${durationSeconds}s!`,
99
+ success: true,
100
+ });
101
+
102
+ this.logger.log(
103
+ `SCORM 1.2 export ${exportId} completed in ${durationSeconds}s, file id=${uploadedFile.id}`,
104
+ );
105
+ } catch (err) {
106
+ const msg =
107
+ err instanceof Error ? err.message : 'Erro desconhecido na exportação.';
108
+ this.logger.error(`SCORM 1.2 export ${exportId} failed: ${msg}`, err instanceof Error ? err.stack : undefined);
109
+
110
+ await this.courseExportService.markFailed(exportId, msg).catch(() => undefined);
111
+ await this.notificationService
112
+ .updateProgress(userId, notificationId, {
113
+ progress: 100,
114
+ body: `Falha na exportação: ${msg}`,
115
+ success: false,
116
+ })
117
+ .catch(() => undefined);
118
+
119
+ throw err;
120
+ } finally {
121
+ await fs.rm(workDir, { recursive: true, force: true }).catch(() => undefined);
122
+ }
123
+ }
124
+ }