@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,500 @@
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.PlatformaPerformanceService = void 0;
13
+ const api_prisma_1 = require("@hed-hog/api-prisma");
14
+ const common_1 = require("@nestjs/common");
15
+ const CATEGORY_COLORS = [
16
+ '#8B5CF6',
17
+ '#22C55E',
18
+ '#3B82F6',
19
+ '#F59E0B',
20
+ '#EC4899',
21
+ '#14B8A6',
22
+ ];
23
+ const TRAIL_COLORS = [
24
+ '#8B5CF6',
25
+ '#34D399',
26
+ '#F59E0B',
27
+ '#60A5FA',
28
+ '#FB7185',
29
+ '#A78BFA',
30
+ ];
31
+ const PT_MONTHS = {
32
+ Jan: 'Jan',
33
+ Feb: 'Fev',
34
+ Mar: 'Mar',
35
+ Apr: 'Abr',
36
+ May: 'Mai',
37
+ Jun: 'Jun',
38
+ Jul: 'Jul',
39
+ Aug: 'Ago',
40
+ Sep: 'Set',
41
+ Oct: 'Out',
42
+ Nov: 'Nov',
43
+ Dec: 'Dez',
44
+ };
45
+ function slugToTitle(slug) {
46
+ return slug
47
+ .split('-')
48
+ .map((w) => w.charAt(0).toUpperCase() + w.slice(1))
49
+ .join(' ');
50
+ }
51
+ function toPtMonth(enAbbr) {
52
+ var _a;
53
+ return (_a = PT_MONTHS[enAbbr]) !== null && _a !== void 0 ? _a : enAbbr;
54
+ }
55
+ function parsePeriod(period) {
56
+ const now = new Date();
57
+ const start = new Date(now);
58
+ if (period === '3m') {
59
+ start.setMonth(start.getMonth() - 3);
60
+ }
61
+ else if (period === 'year') {
62
+ start.setMonth(0, 1);
63
+ start.setHours(0, 0, 0, 0);
64
+ }
65
+ else {
66
+ // default: 30d
67
+ start.setDate(start.getDate() - 30);
68
+ }
69
+ const periodMs = now.getTime() - start.getTime();
70
+ const previousEnd = new Date(start);
71
+ const previousStart = new Date(start.getTime() - periodMs);
72
+ return { start, previousStart, previousEnd };
73
+ }
74
+ function formatHms(totalSeconds) {
75
+ const h = Math.floor(totalSeconds / 3600);
76
+ const m = Math.floor((totalSeconds % 3600) / 60);
77
+ if (h > 0)
78
+ return `${h}h ${m}m`;
79
+ return `${m}m`;
80
+ }
81
+ function calcChange(current, previous) {
82
+ if (previous === 0)
83
+ return current > 0 ? 100 : 0;
84
+ return Math.round(((current - previous) / previous) * 100);
85
+ }
86
+ let PlatformaPerformanceService = class PlatformaPerformanceService {
87
+ constructor(prisma) {
88
+ this.prisma = prisma;
89
+ }
90
+ async getSummary(userId, period) {
91
+ const { start, previousStart, previousEnd } = parsePeriod(period);
92
+ const personId = await this.getPersonId(userId);
93
+ const [kpis, studyHours, areaPerformance, accuracy, lessonsByCategory, avgLessonTime, trailProgress, ranking] = await Promise.all([
94
+ this.getKpis(userId, personId, start, previousStart, previousEnd),
95
+ this.getStudyHoursChart(personId),
96
+ this.getAreaPerformance(personId),
97
+ this.getAccuracyDistribution(personId, start),
98
+ this.getLessonsByCategory(personId, start),
99
+ this.getAvgLessonTime(personId),
100
+ this.getTrailProgress(personId),
101
+ this.getRanking(),
102
+ ]);
103
+ return {
104
+ kpis,
105
+ studyHours,
106
+ areaPerformance,
107
+ accuracyDistribution: accuracy,
108
+ lessonsByCategory,
109
+ avgLessonTime,
110
+ trailProgress,
111
+ ranking,
112
+ };
113
+ }
114
+ // ---------------------------------------------------------------------------
115
+ // KPI cards
116
+ // ---------------------------------------------------------------------------
117
+ async getKpis(userId, personId, start, previousStart, previousEnd) {
118
+ const [studyTimeCurrent, studyTimePrev, lessonsCurrent, lessonsPrev, exercisesCurrent, exercisesPrev, accuracyCurrent, accuracyPrev, bitcodes, bitcodesEarnedCurrent, bitcodesEarnedPrev, studySparkline, lessonsSparkline, exercisesSparkline, bitcodesSparkline,] = await Promise.all([
119
+ this.countStudySeconds(userId, start, new Date()),
120
+ this.countStudySeconds(userId, previousStart, previousEnd),
121
+ this.countCompletedLessons(personId, start, new Date()),
122
+ this.countCompletedLessons(personId, previousStart, previousEnd),
123
+ this.countResolvedExercises(personId, start, new Date()),
124
+ this.countResolvedExercises(personId, previousStart, previousEnd),
125
+ this.getAccuracyRate(personId, start, new Date()),
126
+ this.getAccuracyRate(personId, previousStart, previousEnd),
127
+ this.getBitcodesBalance(personId),
128
+ this.getBitcodesEarned(personId, start, new Date()),
129
+ this.getBitcodesEarned(personId, previousStart, previousEnd),
130
+ this.getWeeklySparkline((w) => this.countStudySeconds(userId, w.start, w.end), 10),
131
+ this.getWeeklySparkline((w) => this.countCompletedLessons(personId, w.start, w.end), 10),
132
+ this.getWeeklySparkline((w) => this.countResolvedExercises(personId, w.start, w.end), 10),
133
+ this.getWeeklySparkline((w) => this.getBitcodesEarned(personId, w.start, w.end), 10),
134
+ ]);
135
+ const accuracyChange = calcChange(accuracyCurrent, accuracyPrev);
136
+ return [
137
+ {
138
+ id: 'study-time',
139
+ title: 'Tempo de estudo',
140
+ value: formatHms(studyTimeCurrent),
141
+ subtitle: 'Horas totais',
142
+ change: this.fmtChange(calcChange(studyTimeCurrent, studyTimePrev)),
143
+ icon: 'clock',
144
+ color: '#8B5CF6',
145
+ sparkline: studySparkline,
146
+ },
147
+ {
148
+ id: 'completed-lessons',
149
+ title: 'Aulas concluídas',
150
+ value: String(lessonsCurrent),
151
+ subtitle: 'Total de aulas',
152
+ change: this.fmtChange(calcChange(lessonsCurrent, lessonsPrev)),
153
+ icon: 'bookOpen',
154
+ color: '#22C55E',
155
+ sparkline: lessonsSparkline,
156
+ },
157
+ {
158
+ id: 'resolved-exercises',
159
+ title: 'Exercícios resolvidos',
160
+ value: String(exercisesCurrent),
161
+ subtitle: 'Total de exercícios',
162
+ change: this.fmtChange(calcChange(exercisesCurrent, exercisesPrev)),
163
+ icon: 'pencil',
164
+ color: '#FB923C',
165
+ sparkline: exercisesSparkline,
166
+ },
167
+ {
168
+ id: 'accuracy-rate',
169
+ title: 'Taxa de acerto',
170
+ value: `${accuracyCurrent}%`,
171
+ subtitle: 'Média de acertos',
172
+ change: this.fmtChange(accuracyChange),
173
+ icon: 'target',
174
+ color: '#3B82F6',
175
+ sparkline: await this.getWeeklySparkline((w) => this.getAccuracyRate(personId, w.start, w.end), 10),
176
+ },
177
+ {
178
+ id: 'bitcodes',
179
+ title: 'Bitcodes',
180
+ value: bitcodes.toLocaleString('pt-BR'),
181
+ subtitle: 'Saldo atual',
182
+ change: this.fmtBitcodesChange(bitcodesEarnedCurrent, bitcodesEarnedPrev),
183
+ icon: 'coins',
184
+ color: '#F59E0B',
185
+ sparkline: bitcodesSparkline,
186
+ },
187
+ ];
188
+ }
189
+ fmtChange(pct) {
190
+ const sign = pct >= 0 ? '+' : '';
191
+ return `${sign}${pct}% vs. mês passado`;
192
+ }
193
+ fmtBitcodesChange(current, previous) {
194
+ const diff = current - previous;
195
+ const sign = diff >= 0 ? '+' : '';
196
+ return `${sign}${diff.toLocaleString('pt-BR')} vs. mês passado`;
197
+ }
198
+ async countStudySeconds(userId, start, end) {
199
+ var _a, _b;
200
+ const rows = await this.prisma.$queryRaw `
201
+ SELECT COUNT(*) * 15 AS total
202
+ FROM lesson_view_event
203
+ WHERE user_id = ${userId}
204
+ AND created_at >= ${start}
205
+ AND created_at < ${end}
206
+ `;
207
+ return Number((_b = (_a = rows[0]) === null || _a === void 0 ? void 0 : _a.total) !== null && _b !== void 0 ? _b : 0);
208
+ }
209
+ async countCompletedLessons(personId, start, end) {
210
+ var _a, _b;
211
+ if (!personId)
212
+ return 0;
213
+ const rows = await this.prisma.$queryRaw `
214
+ SELECT COUNT(*) AS total
215
+ FROM course_lesson_progress clp
216
+ JOIN course_enrollment ce ON ce.id = clp.course_enrollment_id
217
+ WHERE ce.person_id = ${personId}
218
+ AND clp.status = 'completed'
219
+ AND clp.completed_at >= ${start}
220
+ AND clp.completed_at < ${end}
221
+ `;
222
+ return Number((_b = (_a = rows[0]) === null || _a === void 0 ? void 0 : _a.total) !== null && _b !== void 0 ? _b : 0);
223
+ }
224
+ async countResolvedExercises(personId, start, end) {
225
+ var _a, _b;
226
+ if (!personId)
227
+ return 0;
228
+ const rows = await this.prisma.$queryRaw `
229
+ SELECT COUNT(ea.id) AS total
230
+ FROM exam_answer ea
231
+ JOIN exam_attempt att ON att.id = ea.exam_attempt_id
232
+ WHERE att.student_id = ${personId}
233
+ AND att.started_at >= ${start}
234
+ AND att.started_at < ${end}
235
+ `;
236
+ return Number((_b = (_a = rows[0]) === null || _a === void 0 ? void 0 : _a.total) !== null && _b !== void 0 ? _b : 0);
237
+ }
238
+ async getAccuracyRate(personId, start, end) {
239
+ var _a;
240
+ if (!personId)
241
+ return 0;
242
+ const rows = await this.prisma.$queryRaw `
243
+ SELECT
244
+ COUNT(CASE WHEN ea.is_correct = true THEN 1 END) AS correct,
245
+ COUNT(*) AS total
246
+ FROM exam_answer ea
247
+ JOIN exam_attempt att ON att.id = ea.exam_attempt_id
248
+ WHERE att.student_id = ${personId}
249
+ AND ea.is_correct IS NOT NULL
250
+ AND att.started_at >= ${start}
251
+ AND att.started_at < ${end}
252
+ `;
253
+ const { correct, total } = (_a = rows[0]) !== null && _a !== void 0 ? _a : { correct: BigInt(0), total: BigInt(0) };
254
+ const t = Number(total);
255
+ return t === 0 ? 0 : Math.round((Number(correct) / t) * 100);
256
+ }
257
+ async getBitcodesBalance(personId) {
258
+ var _a;
259
+ if (!personId)
260
+ return 0;
261
+ const row = await this.prisma.bitcode_wallet.findFirst({
262
+ where: { person_id: personId },
263
+ select: { current_balance: true },
264
+ });
265
+ return Number((_a = row === null || row === void 0 ? void 0 : row.current_balance) !== null && _a !== void 0 ? _a : 0);
266
+ }
267
+ async getBitcodesEarned(personId, start, end) {
268
+ var _a, _b;
269
+ if (!personId)
270
+ return 0;
271
+ const rows = await this.prisma.$queryRaw `
272
+ SELECT COALESCE(SUM(bwt.amount), 0) AS total
273
+ FROM bitcode_wallet_transaction bwt
274
+ JOIN bitcode_wallet bw ON bw.id = bwt.wallet_id
275
+ WHERE bw.person_id = ${personId}
276
+ AND bwt.type = 'credit'
277
+ AND bwt.created_at >= ${start}
278
+ AND bwt.created_at < ${end}
279
+ `;
280
+ return Number((_b = (_a = rows[0]) === null || _a === void 0 ? void 0 : _a.total) !== null && _b !== void 0 ? _b : 0);
281
+ }
282
+ async getWeeklySparkline(fetcher, weeks) {
283
+ const now = new Date();
284
+ const results = [];
285
+ for (let i = weeks - 1; i >= 0; i--) {
286
+ const end = new Date(now.getTime() - i * 7 * 24 * 3600 * 1000);
287
+ const start = new Date(end.getTime() - 7 * 24 * 3600 * 1000);
288
+ const value = await fetcher({ start, end });
289
+ results.push({ index: weeks - i, value });
290
+ }
291
+ return results;
292
+ }
293
+ // ---------------------------------------------------------------------------
294
+ // Study hours chart
295
+ // ---------------------------------------------------------------------------
296
+ async getStudyHoursChart(personId) {
297
+ if (!personId)
298
+ return [];
299
+ const tenMonthsAgo = new Date();
300
+ tenMonthsAgo.setMonth(tenMonthsAgo.getMonth() - 10);
301
+ const rows = await this.prisma.$queryRaw `
302
+ SELECT
303
+ TO_CHAR(DATE_TRUNC('month', clp.completed_at), 'Mon') AS month_label,
304
+ ROUND(SUM(cl.duration_seconds) / 3600.0, 1) AS hours
305
+ FROM course_lesson_progress clp
306
+ JOIN course_enrollment ce ON ce.id = clp.course_enrollment_id
307
+ JOIN course_lesson cl ON cl.id = clp.course_lesson_id
308
+ WHERE ce.person_id = ${personId}
309
+ AND clp.status = 'completed'
310
+ AND clp.completed_at IS NOT NULL
311
+ AND clp.completed_at >= ${tenMonthsAgo}
312
+ GROUP BY DATE_TRUNC('month', clp.completed_at)
313
+ ORDER BY DATE_TRUNC('month', clp.completed_at)
314
+ `;
315
+ return rows.map((r) => ({
316
+ month: toPtMonth(r.month_label),
317
+ hours: Number(r.hours),
318
+ }));
319
+ }
320
+ // ---------------------------------------------------------------------------
321
+ // Area radar chart
322
+ // ---------------------------------------------------------------------------
323
+ async getAreaPerformance(personId) {
324
+ if (!personId)
325
+ return [];
326
+ const rows = await this.prisma.$queryRaw `
327
+ SELECT
328
+ cat.slug AS slug,
329
+ ROUND(AVG(ce.progress_percent)) AS score
330
+ FROM course_enrollment ce
331
+ JOIN course_category cc ON cc.course_id = ce.course_id
332
+ JOIN category cat ON cat.id = cc.category_id
333
+ WHERE ce.person_id = ${personId}
334
+ GROUP BY cat.id, cat.slug
335
+ ORDER BY score DESC
336
+ LIMIT 6
337
+ `;
338
+ return rows.map((r) => ({
339
+ area: slugToTitle(r.slug),
340
+ score: Number(r.score),
341
+ }));
342
+ }
343
+ // ---------------------------------------------------------------------------
344
+ // Accuracy donut chart
345
+ // ---------------------------------------------------------------------------
346
+ async getAccuracyDistribution(personId, start) {
347
+ var _a;
348
+ if (!personId) {
349
+ return [
350
+ { label: 'Acertos', value: 0, fill: '#4ADE80' },
351
+ { label: 'Erros', value: 0, fill: '#FB7185' },
352
+ { label: 'Não respondidas', value: 0, fill: '#D1D5DB' },
353
+ ];
354
+ }
355
+ const rows = await this.prisma.$queryRaw `
356
+ SELECT
357
+ COUNT(CASE WHEN ea.is_correct = true THEN 1 END) AS correct,
358
+ COUNT(CASE WHEN ea.is_correct = false THEN 1 END) AS incorrect,
359
+ COUNT(CASE WHEN ea.is_correct IS NULL THEN 1 END) AS unanswered
360
+ FROM exam_answer ea
361
+ JOIN exam_attempt att ON att.id = ea.exam_attempt_id
362
+ WHERE att.student_id = ${personId}
363
+ AND att.started_at >= ${start}
364
+ `;
365
+ const { correct, incorrect, unanswered } = (_a = rows[0]) !== null && _a !== void 0 ? _a : {
366
+ correct: BigInt(0),
367
+ incorrect: BigInt(0),
368
+ unanswered: BigInt(0),
369
+ };
370
+ const total = Number(correct) + Number(incorrect) + Number(unanswered);
371
+ const pct = (n) => total === 0 ? 0 : Math.round((Number(n) / total) * 100);
372
+ return [
373
+ { label: 'Acertos', value: pct(correct), fill: '#4ADE80' },
374
+ { label: 'Erros', value: pct(incorrect), fill: '#FB7185' },
375
+ { label: 'Não respondidas', value: pct(unanswered), fill: '#D1D5DB' },
376
+ ];
377
+ }
378
+ // ---------------------------------------------------------------------------
379
+ // Lessons by category chart
380
+ // ---------------------------------------------------------------------------
381
+ async getLessonsByCategory(personId, start) {
382
+ if (!personId)
383
+ return [];
384
+ const rows = await this.prisma.$queryRaw `
385
+ SELECT
386
+ cat.slug AS slug,
387
+ COUNT(clp.id) AS value
388
+ FROM course_lesson_progress clp
389
+ JOIN course_enrollment ce ON ce.id = clp.course_enrollment_id
390
+ JOIN course_lesson cl ON cl.id = clp.course_lesson_id
391
+ JOIN course_module cm ON cm.id = cl.course_module_id
392
+ JOIN course_category cc ON cc.course_id = cm.course_id
393
+ JOIN category cat ON cat.id = cc.category_id
394
+ WHERE ce.person_id = ${personId}
395
+ AND clp.status = 'completed'
396
+ AND clp.completed_at >= ${start}
397
+ GROUP BY cat.id, cat.slug
398
+ ORDER BY value DESC
399
+ LIMIT 6
400
+ `;
401
+ return rows.map((r, i) => ({
402
+ label: slugToTitle(r.slug),
403
+ value: Number(r.value),
404
+ fill: CATEGORY_COLORS[i % CATEGORY_COLORS.length],
405
+ }));
406
+ }
407
+ // ---------------------------------------------------------------------------
408
+ // Average lesson time chart
409
+ // ---------------------------------------------------------------------------
410
+ async getAvgLessonTime(personId) {
411
+ if (!personId)
412
+ return [];
413
+ const tenMonthsAgo = new Date();
414
+ tenMonthsAgo.setMonth(tenMonthsAgo.getMonth() - 10);
415
+ const rows = await this.prisma.$queryRaw `
416
+ SELECT
417
+ TO_CHAR(DATE_TRUNC('month', clp.completed_at), 'Mon') AS month_label,
418
+ ROUND(AVG(cl.duration_seconds) / 60.0) AS minutes
419
+ FROM course_lesson_progress clp
420
+ JOIN course_enrollment ce ON ce.id = clp.course_enrollment_id
421
+ JOIN course_lesson cl ON cl.id = clp.course_lesson_id
422
+ WHERE ce.person_id = ${personId}
423
+ AND clp.status = 'completed'
424
+ AND clp.completed_at IS NOT NULL
425
+ AND clp.completed_at >= ${tenMonthsAgo}
426
+ GROUP BY DATE_TRUNC('month', clp.completed_at)
427
+ ORDER BY DATE_TRUNC('month', clp.completed_at)
428
+ `;
429
+ return rows.map((r) => ({
430
+ month: toPtMonth(r.month_label),
431
+ minutes: Number(r.minutes),
432
+ }));
433
+ }
434
+ // ---------------------------------------------------------------------------
435
+ // Trail progress card
436
+ // ---------------------------------------------------------------------------
437
+ async getTrailProgress(personId) {
438
+ if (!personId)
439
+ return [];
440
+ const rows = await this.prisma.$queryRaw `
441
+ SELECT
442
+ c.title AS title,
443
+ ce.progress_percent AS progress
444
+ FROM course_enrollment ce
445
+ JOIN course c ON c.id = ce.course_id
446
+ WHERE ce.person_id = ${personId}
447
+ AND ce.status IN ('active', 'completed')
448
+ AND ce.progress_percent > 0
449
+ ORDER BY ce.progress_percent DESC
450
+ LIMIT 5
451
+ `;
452
+ return rows.map((r, i) => ({
453
+ trail: r.title,
454
+ progress: Number(r.progress),
455
+ color: TRAIL_COLORS[i % TRAIL_COLORS.length],
456
+ }));
457
+ }
458
+ // ---------------------------------------------------------------------------
459
+ // Weekly ranking
460
+ // ---------------------------------------------------------------------------
461
+ async getRanking() {
462
+ const rows = await this.prisma.$queryRaw `
463
+ SELECT
464
+ bw.person_id,
465
+ p.name,
466
+ bw.current_balance
467
+ FROM bitcode_wallet bw
468
+ JOIN person p ON p.id = bw.person_id
469
+ ORDER BY bw.current_balance DESC
470
+ LIMIT 5
471
+ `;
472
+ return rows.map((r, i) => {
473
+ var _a;
474
+ return ({
475
+ id: String(r.person_id),
476
+ position: i + 1,
477
+ name: (_a = r.name) !== null && _a !== void 0 ? _a : 'Aluno',
478
+ score: `${Number(r.current_balance).toLocaleString('pt-BR')} BITCODES`,
479
+ avatar: null,
480
+ });
481
+ });
482
+ }
483
+ // ---------------------------------------------------------------------------
484
+ // Helpers
485
+ // ---------------------------------------------------------------------------
486
+ async getPersonId(userId) {
487
+ var _a;
488
+ const row = await this.prisma.person_user.findFirst({
489
+ where: { user_id: userId },
490
+ select: { person_id: true },
491
+ });
492
+ return (_a = row === null || row === void 0 ? void 0 : row.person_id) !== null && _a !== void 0 ? _a : null;
493
+ }
494
+ };
495
+ exports.PlatformaPerformanceService = PlatformaPerformanceService;
496
+ exports.PlatformaPerformanceService = PlatformaPerformanceService = __decorate([
497
+ (0, common_1.Injectable)(),
498
+ __metadata("design:paramtypes", [api_prisma_1.PrismaService])
499
+ ], PlatformaPerformanceService);
500
+ //# sourceMappingURL=platforma-performance.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platforma-performance.service.js","sourceRoot":"","sources":["../../src/platforma/platforma-performance.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { ClassGroupService } from '../class-group/class-group.service';
2
+ import { TrainingStudentService } from '../enterprise/training/training-student.service';
3
+ import { ExamService } from '../exam/exam.service';
4
+ import { InstructorService } from '../instructor/instructor.service';
5
+ import { TrainingService } from '../training/training.service';
6
+ export declare class PlatformaSearchService {
7
+ private readonly trainingStudentService;
8
+ private readonly trainingService;
9
+ private readonly examService;
10
+ private readonly classGroupService;
11
+ private readonly instructorService;
12
+ constructor(trainingStudentService: TrainingStudentService, trainingService: TrainingService, examService: ExamService, classGroupService: ClassGroupService, instructorService: InstructorService);
13
+ search(q: string, types: string[], pageSize?: number): Promise<{
14
+ courses: any;
15
+ tracks: any;
16
+ exams: any;
17
+ classrooms: any;
18
+ instructors: any;
19
+ }>;
20
+ }
21
+ //# sourceMappingURL=platforma-search.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platforma-search.service.d.ts","sourceRoot":"","sources":["../../src/platforma/platforma-search.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AACvE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iDAAiD,CAAC;AACzF,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAE/D,qBACa,sBAAsB;IAE/B,OAAO,CAAC,QAAQ,CAAC,sBAAsB;IACvC,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,iBAAiB;gBAJjB,sBAAsB,EAAE,sBAAsB,EAC9C,eAAe,EAAE,eAAe,EAChC,WAAW,EAAE,WAAW,EACxB,iBAAiB,EAAE,iBAAiB,EACpC,iBAAiB,EAAE,iBAAiB;IAGjD,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,QAAQ,SAAI;;;;;;;CA8BtD"}
@@ -0,0 +1,64 @@
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.PlatformaSearchService = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const class_group_service_1 = require("../class-group/class-group.service");
15
+ const training_student_service_1 = require("../enterprise/training/training-student.service");
16
+ const exam_service_1 = require("../exam/exam.service");
17
+ const instructor_service_1 = require("../instructor/instructor.service");
18
+ const training_service_1 = require("../training/training.service");
19
+ let PlatformaSearchService = class PlatformaSearchService {
20
+ constructor(trainingStudentService, trainingService, examService, classGroupService, instructorService) {
21
+ this.trainingStudentService = trainingStudentService;
22
+ this.trainingService = trainingService;
23
+ this.examService = examService;
24
+ this.classGroupService = classGroupService;
25
+ this.instructorService = instructorService;
26
+ }
27
+ async search(q, types, pageSize = 5) {
28
+ const all = types.length === 0;
29
+ const [courses, tracks, exams, classrooms, instructors] = await Promise.allSettled([
30
+ all || types.includes('course')
31
+ ? this.trainingStudentService.getPublishedCourses({ search: q, pageSize })
32
+ : Promise.resolve(null),
33
+ all || types.includes('track')
34
+ ? this.trainingService.list({ search: q, status: 'ativa', pageSize })
35
+ : Promise.resolve(null),
36
+ all || types.includes('exam')
37
+ ? this.examService.list({ search: q, status: 'published', pageSize })
38
+ : Promise.resolve(null),
39
+ all || types.includes('classroom')
40
+ ? this.classGroupService.list({ search: q, pageSize })
41
+ : Promise.resolve(null),
42
+ all || types.includes('instructor')
43
+ ? this.instructorService.list({ search: q, status: 'active', pageSize })
44
+ : Promise.resolve(null),
45
+ ]);
46
+ return {
47
+ courses: courses.status === 'fulfilled' ? courses.value : null,
48
+ tracks: tracks.status === 'fulfilled' ? tracks.value : null,
49
+ exams: exams.status === 'fulfilled' ? exams.value : null,
50
+ classrooms: classrooms.status === 'fulfilled' ? classrooms.value : null,
51
+ instructors: instructors.status === 'fulfilled' ? instructors.value : null,
52
+ };
53
+ }
54
+ };
55
+ exports.PlatformaSearchService = PlatformaSearchService;
56
+ exports.PlatformaSearchService = PlatformaSearchService = __decorate([
57
+ (0, common_1.Injectable)(),
58
+ __metadata("design:paramtypes", [training_student_service_1.TrainingStudentService,
59
+ training_service_1.TrainingService,
60
+ exam_service_1.ExamService,
61
+ class_group_service_1.ClassGroupService,
62
+ instructor_service_1.InstructorService])
63
+ ], PlatformaSearchService);
64
+ //# sourceMappingURL=platforma-search.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platforma-search.service.js","sourceRoot":"","sources":["../../src/platforma/platforma-search.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import { FileService } from '@hed-hog/core';
2
+ import { PrismaService } from '@hed-hog/api-prisma';
3
+ import { JwtService } from '@nestjs/jwt';
4
+ import type { Request, Response } from 'express';
5
+ export declare class PlatformaVideoService {
6
+ private readonly prisma;
7
+ private readonly fileService;
8
+ private readonly jwtService;
9
+ private readonly logger;
10
+ constructor(prisma: PrismaService, fileService: FileService, jwtService: JwtService);
11
+ getVideoOptions(lessonId: number): Promise<{
12
+ type: string;
13
+ label: string;
14
+ fileId: number;
15
+ }[]>;
16
+ generateVideoToken(lessonId: number, quality?: string): Promise<{
17
+ token: string;
18
+ label: string;
19
+ type: string;
20
+ expiresIn: number;
21
+ }>;
22
+ streamVideo(token: string, req: Request, res: Response): Promise<void>;
23
+ generateHlsToken(lessonId: number): Promise<{
24
+ token: string;
25
+ expiresIn: number;
26
+ }>;
27
+ private verifyHlsToken;
28
+ serveHlsMasterManifest(token: string, req: Request, res: Response): Promise<void>;
29
+ serveHlsVariantPlaylist(token: string, variant: string, req: Request, res: Response): Promise<void>;
30
+ serveHlsSegment(token: string, variant: string, segment: string, res: Response): Promise<void>;
31
+ generateSubtitlesToken(lessonId: number): Promise<{
32
+ token: string;
33
+ expiresIn: number;
34
+ }>;
35
+ serveSubtitles(token: string, res: Response): Promise<void>;
36
+ private secondsToVttTime;
37
+ private buildVtt;
38
+ }
39
+ //# sourceMappingURL=platforma-video.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platforma-video.service.d.ts","sourceRoot":"","sources":["../../src/platforma/platforma-video.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AASpD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEjD,qBACa,qBAAqB;IAI9B,OAAO,CAAC,QAAQ,CAAC,MAAM;IAEvB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAE5B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAP7B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA0C;gBAG9C,MAAM,EAAE,aAAa,EAErB,WAAW,EAAE,WAAW,EAExB,UAAU,EAAE,UAAU;IAGnC,eAAe,CAAC,QAAQ,EAAE,MAAM;;;;;IA0ChC,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;;;;;;IAgBrD,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ;IAmDtD,gBAAgB,CAAC,QAAQ,EAAE,MAAM;;;;IAuBvC,OAAO,CAAC,cAAc;IAUhB,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ;IAuCjE,uBAAuB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ;IAuCnF,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ;IAgC9E,sBAAsB,CAAC,QAAQ,EAAE,MAAM;;;;IAsBvC,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ;IA4BjD,OAAO,CAAC,gBAAgB;IASxB,OAAO,CAAC,QAAQ;CASjB"}