@hed-hog/lms 0.0.361 → 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 (329) 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 +2 -0
  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 +116 -0
  67. package/dist/course/lms-bulk-upload.controller.d.ts.map +1 -1
  68. package/dist/course/lms-bulk-upload.controller.js +71 -2
  69. package/dist/course/lms-bulk-upload.controller.js.map +1 -1
  70. package/dist/course/lms-bulk-upload.service.d.ts +142 -3
  71. package/dist/course/lms-bulk-upload.service.d.ts.map +1 -1
  72. package/dist/course/lms-bulk-upload.service.js +606 -21
  73. package/dist/course/lms-bulk-upload.service.js.map +1 -1
  74. package/dist/course/lms-setting.controller.d.ts +4 -1
  75. package/dist/course/lms-setting.controller.d.ts.map +1 -1
  76. package/dist/course/lms-setting.controller.js +21 -6
  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 +88 -1
  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/route.yaml +512 -0
  215. package/hedhog/data/setting_group.yaml +1 -1
  216. package/hedhog/data/xp_area.yaml +164 -0
  217. package/hedhog/data/xp_learning_type.yaml +131 -0
  218. package/hedhog/data/xp_skill.yaml +1834 -0
  219. package/hedhog/frontend/app/achievements/page.tsx.ejs +108 -118
  220. package/hedhog/frontend/app/bitcodes/page.tsx.ejs +22 -34
  221. package/hedhog/frontend/app/bulk-upload-sessions/page.tsx.ejs +1453 -0
  222. package/hedhog/frontend/app/certificates/models/page.tsx.ejs +21 -45
  223. package/hedhog/frontend/app/classes/[id]/page.tsx.ejs +40 -74
  224. package/hedhog/frontend/app/classes/page.tsx.ejs +56 -85
  225. package/hedhog/frontend/app/courses/[id]/_components/CourseDangerZoneCard.tsx.ejs +3 -2
  226. package/hedhog/frontend/app/courses/[id]/_components/CourseMediaCard.tsx.ejs +48 -5
  227. package/hedhog/frontend/app/courses/[id]/page.tsx.ejs +4 -4
  228. package/hedhog/frontend/app/courses/[id]/structure/_components/course-operations-tab.tsx.ejs +19 -2
  229. package/hedhog/frontend/app/courses/[id]/structure/_components/course-overview-tab.tsx.ejs +1170 -0
  230. package/hedhog/frontend/app/courses/[id]/structure/_components/course-tree-dnd.tsx.ejs +16 -0
  231. package/hedhog/frontend/app/courses/[id]/structure/_components/course-tree.tsx.ejs +2 -0
  232. package/hedhog/frontend/app/courses/[id]/structure/_components/course-xp-overview-tab.tsx.ejs +623 -0
  233. package/hedhog/frontend/app/courses/[id]/structure/_components/detail-lesson-xp-tab.tsx.ejs +1458 -0
  234. package/hedhog/frontend/app/courses/[id]/structure/_components/detail-lesson.tsx.ejs +55 -2
  235. package/hedhog/frontend/app/courses/[id]/structure/_components/editor-course.tsx.ejs +442 -104
  236. package/hedhog/frontend/app/courses/[id]/structure/_components/editor-lesson.tsx.ejs +296 -49
  237. package/hedhog/frontend/app/courses/[id]/structure/_components/sortable-tree-row.tsx.ejs +3 -0
  238. package/hedhog/frontend/app/courses/[id]/structure/_components/store.ts.ejs +1 -0
  239. package/hedhog/frontend/app/courses/[id]/structure/_components/tree-display-settings-popover.tsx.ejs +101 -85
  240. package/hedhog/frontend/app/courses/[id]/structure/_components/tree-row-lesson.tsx.ejs +21 -1
  241. package/hedhog/frontend/app/courses/[id]/structure/_components/tree-row.tsx.ejs +3 -0
  242. package/hedhog/frontend/app/courses/[id]/structure/_components/use-tree-display-settings.ts.ejs +7 -1
  243. package/hedhog/frontend/app/courses/[id]/structure/_components/xp-premium-pills.tsx.ejs +44 -0
  244. package/hedhog/frontend/app/courses/[id]/structure/_data/use-course-content-overview.ts.ejs +54 -0
  245. package/hedhog/frontend/app/courses/[id]/structure/_data/use-course-structure-mutations.ts.ejs +52 -0
  246. package/hedhog/frontend/app/courses/[id]/structure/_data/use-course-xp-overview.ts.ejs +76 -0
  247. package/hedhog/frontend/app/courses/[id]/structure/_data/use-lesson-xp-map.ts.ejs +128 -0
  248. package/hedhog/frontend/app/courses/[id]/structure/_data/use-transcription-segments.ts.ejs +30 -0
  249. package/hedhog/frontend/app/courses/[id]/structure/_utils/xp-color-config.ts.ejs +115 -0
  250. package/hedhog/frontend/app/courses/_components/CourseDeleteDialog.tsx.ejs +223 -0
  251. package/hedhog/frontend/app/courses/_components/CourseRowActions.tsx.ejs +89 -0
  252. package/hedhog/frontend/app/courses/page.tsx.ejs +400 -230
  253. package/hedhog/frontend/app/enterprise/page.tsx.ejs +39 -63
  254. package/hedhog/frontend/app/exams/[id]/questions/page.tsx.ejs +53 -77
  255. package/hedhog/frontend/app/exams/page.tsx.ejs +54 -90
  256. package/hedhog/frontend/app/instructor-skills/page.tsx.ejs +23 -36
  257. package/hedhog/frontend/app/instructors/page.tsx.ejs +72 -81
  258. package/hedhog/frontend/app/paths/page.tsx.ejs +40 -68
  259. package/hedhog/frontend/app/training/page.tsx.ejs +40 -68
  260. package/hedhog/frontend/app/xp/areas/page.tsx.ejs +782 -0
  261. package/hedhog/frontend/app/xp/learning-types/page.tsx.ejs +690 -0
  262. package/hedhog/frontend/app/xp/skills/page.tsx.ejs +811 -0
  263. package/hedhog/frontend/messages/en.json +386 -3
  264. package/hedhog/frontend/messages/pt.json +386 -3
  265. package/hedhog/table/lesson_xp_map.yaml +50 -0
  266. package/hedhog/table/lesson_xp_segment.yaml +40 -0
  267. package/hedhog/table/lesson_xp_segment_area.yaml +24 -0
  268. package/hedhog/table/lesson_xp_segment_learning_type.yaml +24 -0
  269. package/hedhog/table/lesson_xp_segment_skill.yaml +24 -0
  270. package/hedhog/table/lms_bulk_upload_item.yaml +44 -0
  271. package/hedhog/table/lms_bulk_upload_session.yaml +42 -0
  272. package/hedhog/table/student_area_xp.yaml +30 -0
  273. package/hedhog/table/student_learning_type_xp.yaml +30 -0
  274. package/hedhog/table/student_skill_xp.yaml +30 -0
  275. package/hedhog/table/student_xp_event.yaml +34 -0
  276. package/hedhog/table/xp_area.yaml +39 -0
  277. package/hedhog/table/xp_learning_type.yaml +34 -0
  278. package/hedhog/table/xp_skill.yaml +39 -0
  279. package/package.json +8 -7
  280. package/src/bitcode-wallet/bitcode-wallet.service.ts +113 -0
  281. package/src/bitcode-wallet/dto/create-current-bitcode-wallet-transaction.dto.ts +32 -0
  282. package/src/course/course-audio-transcription.service.ts +58 -21
  283. package/src/course/course-lesson.controller.ts +6 -1
  284. package/src/course/course-structure.controller.ts +10 -0
  285. package/src/course/course-structure.service.ts +174 -1
  286. package/src/course/course-video-conversion.service.ts +113 -75
  287. package/src/course/course.controller.ts +22 -3
  288. package/src/course/course.module.ts +2 -0
  289. package/src/course/course.service.ts +847 -30
  290. package/src/course/dto/cleanup-course-storage.dto.ts +22 -0
  291. package/src/course/dto/cleanup-upload-history.dto.ts +26 -0
  292. package/src/course/dto/create-course-bulk-job.dto.ts +6 -0
  293. package/src/course/lms-bulk-upload-automation.service.ts +560 -0
  294. package/src/course/lms-bulk-upload-infra.service.ts +327 -0
  295. package/src/course/lms-bulk-upload.constants.ts +5 -0
  296. package/src/course/lms-bulk-upload.controller.ts +79 -3
  297. package/src/course/lms-bulk-upload.service.ts +1029 -204
  298. package/src/course/lms-setting.controller.ts +22 -6
  299. package/src/lesson-xp-map/dto/create-lesson-xp-map.dto.ts +17 -0
  300. package/src/lesson-xp-map/dto/create-lesson-xp-segment.dto.ts +102 -0
  301. package/src/lesson-xp-map/dto/review-lesson-xp-map.dto.ts +7 -0
  302. package/src/lesson-xp-map/dto/update-lesson-xp-map.dto.ts +36 -0
  303. package/src/lesson-xp-map/dto/update-lesson-xp-segment.dto.ts +78 -0
  304. package/src/lesson-xp-map/lesson-xp-ai-calculation.service.ts +396 -0
  305. package/src/lesson-xp-map/lesson-xp-map.controller.ts +116 -0
  306. package/src/lesson-xp-map/lesson-xp-map.module.ts +21 -0
  307. package/src/lesson-xp-map/lesson-xp-map.service.ts +442 -0
  308. package/src/lesson-xp-map/lesson-xp-segment.controller.ts +36 -0
  309. package/src/lesson-xp-map/lesson-xp-segment.service.ts +229 -0
  310. package/src/lms.module.ts +17 -2
  311. package/src/platforma/dto/update-profile.dto.ts +59 -0
  312. package/src/platforma/platforma.controller.ts +57 -2
  313. package/src/platforma/platforma.service.ts +268 -0
  314. package/src/student-xp/student-xp.controller.ts +76 -0
  315. package/src/student-xp/student-xp.module.ts +12 -0
  316. package/src/student-xp/student-xp.service.ts +236 -0
  317. package/src/xp-catalog/dto/create-xp-area.dto.ts +40 -0
  318. package/src/xp-catalog/dto/create-xp-learning-type.dto.ts +35 -0
  319. package/src/xp-catalog/dto/create-xp-skill.dto.ts +35 -0
  320. package/src/xp-catalog/dto/update-xp-area.dto.ts +43 -0
  321. package/src/xp-catalog/dto/update-xp-learning-type.dto.ts +38 -0
  322. package/src/xp-catalog/dto/update-xp-skill.dto.ts +38 -0
  323. package/src/xp-catalog/xp-area.controller.ts +64 -0
  324. package/src/xp-catalog/xp-area.service.ts +196 -0
  325. package/src/xp-catalog/xp-catalog.module.ts +16 -0
  326. package/src/xp-catalog/xp-learning-type.controller.ts +59 -0
  327. package/src/xp-catalog/xp-learning-type.service.ts +170 -0
  328. package/src/xp-catalog/xp-skill.controller.ts +71 -0
  329. package/src/xp-catalog/xp-skill.service.ts +205 -0
@@ -0,0 +1,196 @@
1
+ import { PrismaService } from '@hed-hog/api-prisma';
2
+ import { Injectable, NotFoundException } from '@nestjs/common';
3
+ import { CreateXpAreaDto } from './dto/create-xp-area.dto';
4
+ import { UpdateXpAreaDto } from './dto/update-xp-area.dto';
5
+
6
+ @Injectable()
7
+ export class XpAreaService {
8
+ constructor(private readonly prisma: PrismaService) {}
9
+
10
+ async list(params: {
11
+ page?: number;
12
+ pageSize?: number;
13
+ search?: string;
14
+ status?: string;
15
+ }) {
16
+ const page = Math.max(Number(params.page) || 1, 1);
17
+ const pageSize = Math.max(Number(params.pageSize) || 20, 1);
18
+ const offset = (page - 1) * pageSize;
19
+
20
+ const values: unknown[] = [];
21
+ const where: string[] = ['1 = 1'];
22
+
23
+ if (params.search?.trim()) {
24
+ const p = this.param(values, `%${params.search.trim()}%`);
25
+ where.push(`(a.slug ILIKE ${p} OR COALESCE(l.name, '') ILIKE ${p})`);
26
+ }
27
+ if (params.status?.trim()) {
28
+ where.push(`a.status::text = ${this.param(values, params.status.trim())}`);
29
+ }
30
+
31
+ const whereClause = where.join(' AND ');
32
+ const ptLocaleSubquery = `(SELECT id FROM locale WHERE code = 'pt' LIMIT 1)`;
33
+
34
+ const totalRow = await this.querySingle<{ total: string }>(
35
+ `SELECT COUNT(*)::text AS total
36
+ FROM xp_area a
37
+ LEFT JOIN xp_area_locale l ON l.xp_area_id = a.id AND l.locale_id = ${ptLocaleSubquery}
38
+ WHERE ${whereClause}`,
39
+ values,
40
+ );
41
+
42
+ const q = [...values];
43
+ const rows = await this.queryRows<any>(
44
+ `SELECT
45
+ a.id,
46
+ a.slug,
47
+ a.icon_slug AS "iconSlug",
48
+ a.color,
49
+ a.sort_order AS "sortOrder",
50
+ a.status::text AS status,
51
+ COALESCE(l.name, a.slug) AS name,
52
+ l.description,
53
+ a.created_at::text AS "createdAt",
54
+ a.updated_at::text AS "updatedAt"
55
+ FROM xp_area a
56
+ LEFT JOIN xp_area_locale l ON l.xp_area_id = a.id AND l.locale_id = ${ptLocaleSubquery}
57
+ WHERE ${whereClause}
58
+ ORDER BY a.sort_order ASC, a.slug ASC
59
+ LIMIT ${this.param(q, pageSize)} OFFSET ${this.param(q, offset)}`,
60
+ q,
61
+ );
62
+
63
+ const total = Number(totalRow?.total ?? 0);
64
+ return { data: rows, total, page, pageSize, lastPage: Math.ceil(total / pageSize) };
65
+ }
66
+
67
+ async stats() {
68
+ const [total, active, inactive] = await Promise.all([
69
+ this.querySingle<{ count: string }>(`SELECT COUNT(*)::text AS count FROM xp_area`, []),
70
+ this.querySingle<{ count: string }>(`SELECT COUNT(*)::text AS count FROM xp_area WHERE status = 'active'`, []),
71
+ this.querySingle<{ count: string }>(`SELECT COUNT(*)::text AS count FROM xp_area WHERE status = 'inactive'`, []),
72
+ ]);
73
+ return {
74
+ total: Number(total?.count ?? 0),
75
+ active: Number(active?.count ?? 0),
76
+ inactive: Number(inactive?.count ?? 0),
77
+ };
78
+ }
79
+
80
+ async getAll() {
81
+ return this.queryRows<any>(
82
+ `SELECT
83
+ a.id, a.slug, a.icon_slug AS "iconSlug", a.color, a.sort_order AS "sortOrder",
84
+ COALESCE(lpt.name, len.name, a.slug) AS name
85
+ FROM xp_area a
86
+ LEFT JOIN xp_area_locale lpt ON lpt.xp_area_id = a.id
87
+ AND lpt.locale_id = (SELECT id FROM locale WHERE code = 'pt' LIMIT 1)
88
+ LEFT JOIN xp_area_locale len ON len.xp_area_id = a.id
89
+ AND len.locale_id = (SELECT id FROM locale WHERE code = 'en' LIMIT 1)
90
+ WHERE a.status = 'active'
91
+ ORDER BY a.sort_order ASC, a.slug ASC`,
92
+ );
93
+ }
94
+
95
+ async getById(id: number) {
96
+ const row = await this.querySingle<any>(
97
+ `SELECT id, slug, icon_slug AS "iconSlug", color, sort_order AS "sortOrder",
98
+ status::text AS status, created_at::text AS "createdAt", updated_at::text AS "updatedAt"
99
+ FROM xp_area WHERE id = $1`,
100
+ [id],
101
+ );
102
+ if (!row) throw new NotFoundException('XP area not found');
103
+
104
+ const locales = await this.queryRows<any>(
105
+ `SELECT l.code, al.name, al.description
106
+ FROM xp_area_locale al JOIN locale l ON l.id = al.locale_id
107
+ WHERE al.xp_area_id = $1`,
108
+ [id],
109
+ );
110
+
111
+ const translations: Record<string, { name: string; description: string | null }> = {};
112
+ for (const loc of locales) translations[loc.code] = { name: loc.name, description: loc.description };
113
+
114
+ return { ...row, translations };
115
+ }
116
+
117
+ async create(dto: CreateXpAreaDto) {
118
+ const created = await this.querySingle<{ id: number }>(
119
+ `INSERT INTO xp_area (slug, icon_slug, color, sort_order, status, created_at, updated_at)
120
+ VALUES ($1, $2, $3, $4, $5::xp_area_status_a1b2c3d4e5_enum, NOW(), NOW())
121
+ RETURNING id`,
122
+ [dto.slug.trim(), dto.iconSlug ?? null, dto.color ?? null, dto.sortOrder ?? 0, dto.status ?? 'active'],
123
+ );
124
+ await this.upsertLocales(created!.id, dto);
125
+ return this.getById(created!.id);
126
+ }
127
+
128
+ async update(id: number, dto: UpdateXpAreaDto) {
129
+ await this.ensureExists(id);
130
+
131
+ const updates: string[] = [];
132
+ const values: unknown[] = [];
133
+
134
+ if (dto.slug !== undefined) updates.push(`slug = ${this.param(values, dto.slug.trim())}`);
135
+ if (dto.iconSlug !== undefined) updates.push(`icon_slug = ${this.param(values, dto.iconSlug)}`);
136
+ if (dto.color !== undefined) updates.push(`color = ${this.param(values, dto.color)}`);
137
+ if (dto.sortOrder !== undefined) updates.push(`sort_order = ${this.param(values, dto.sortOrder)}`);
138
+ if (dto.status !== undefined) updates.push(`status = ${this.param(values, dto.status)}::xp_area_status_a1b2c3d4e5_enum`);
139
+
140
+ if (updates.length > 0) {
141
+ values.push(id);
142
+ await this.prisma.$executeRawUnsafe(
143
+ `UPDATE xp_area SET ${updates.join(', ')}, updated_at = NOW() WHERE id = $${values.length}`,
144
+ ...values,
145
+ );
146
+ }
147
+
148
+ await this.upsertLocales(id, dto);
149
+ return this.getById(id);
150
+ }
151
+
152
+ async delete(id: number) {
153
+ await this.ensureExists(id);
154
+ await this.prisma.$executeRawUnsafe(`DELETE FROM xp_area WHERE id = $1`, id);
155
+ }
156
+
157
+ private async upsertLocales(
158
+ id: number,
159
+ dto: { namePt?: string; nameEn?: string; descriptionPt?: string | null; descriptionEn?: string | null },
160
+ ) {
161
+ const pairs = [
162
+ { code: 'pt', name: dto.namePt, description: dto.descriptionPt },
163
+ { code: 'en', name: dto.nameEn, description: dto.descriptionEn },
164
+ ];
165
+ for (const { code, name, description } of pairs) {
166
+ if (name !== undefined) {
167
+ await this.prisma.$executeRawUnsafe(
168
+ `INSERT INTO xp_area_locale (xp_area_id, locale_id, name, description, created_at, updated_at)
169
+ SELECT $1, l.id, $2, $3, NOW(), NOW() FROM locale l WHERE l.code = $4
170
+ ON CONFLICT (xp_area_id, locale_id) DO UPDATE
171
+ SET name = EXCLUDED.name, description = EXCLUDED.description, updated_at = NOW()`,
172
+ id, name, description ?? null, code,
173
+ );
174
+ }
175
+ }
176
+ }
177
+
178
+ private async ensureExists(id: number) {
179
+ const row = await this.querySingle<{ id: number }>(`SELECT id FROM xp_area WHERE id = $1`, [id]);
180
+ if (!row) throw new NotFoundException('XP area not found');
181
+ }
182
+
183
+ private param(values: unknown[], value: unknown) {
184
+ values.push(value);
185
+ return `$${values.length}`;
186
+ }
187
+
188
+ private async queryRows<T>(query: string, values: unknown[] = []) {
189
+ return this.prisma.$queryRawUnsafe<T[]>(query, ...values);
190
+ }
191
+
192
+ private async querySingle<T>(query: string, values: unknown[] = []) {
193
+ const rows = await this.prisma.$queryRawUnsafe<T[]>(query, ...values);
194
+ return rows[0] ?? null;
195
+ }
196
+ }
@@ -0,0 +1,16 @@
1
+ import { PrismaModule } from '@hed-hog/api-prisma';
2
+ import { forwardRef, Module } from '@nestjs/common';
3
+ import { XpAreaController } from './xp-area.controller';
4
+ import { XpAreaService } from './xp-area.service';
5
+ import { XpLearningTypeController } from './xp-learning-type.controller';
6
+ import { XpLearningTypeService } from './xp-learning-type.service';
7
+ import { XpSkillController } from './xp-skill.controller';
8
+ import { XpSkillService } from './xp-skill.service';
9
+
10
+ @Module({
11
+ imports: [forwardRef(() => PrismaModule)],
12
+ controllers: [XpAreaController, XpSkillController, XpLearningTypeController],
13
+ providers: [XpAreaService, XpSkillService, XpLearningTypeService],
14
+ exports: [XpAreaService, XpSkillService, XpLearningTypeService],
15
+ })
16
+ export class XpCatalogModule {}
@@ -0,0 +1,59 @@
1
+ import { Role } from '@hed-hog/api';
2
+ import {
3
+ Body,
4
+ Controller,
5
+ Delete,
6
+ Get,
7
+ HttpCode,
8
+ HttpStatus,
9
+ Param,
10
+ ParseIntPipe,
11
+ Patch,
12
+ Post,
13
+ Query,
14
+ } from '@nestjs/common';
15
+ import { CreateXpLearningTypeDto } from './dto/create-xp-learning-type.dto';
16
+ import { UpdateXpLearningTypeDto } from './dto/update-xp-learning-type.dto';
17
+ import { XpLearningTypeService } from './xp-learning-type.service';
18
+
19
+ @Role()
20
+ @Controller('lms/xp/learning-types')
21
+ export class XpLearningTypeController {
22
+ constructor(private readonly xpLearningTypeService: XpLearningTypeService) {}
23
+
24
+ @Get()
25
+ list(
26
+ @Query('page') page?: string,
27
+ @Query('pageSize') pageSize?: string,
28
+ @Query('search') search?: string,
29
+ @Query('status') status?: string,
30
+ ) {
31
+ return this.xpLearningTypeService.list({ page: Number(page) || 1, pageSize: Number(pageSize) || 20, search, status });
32
+ }
33
+
34
+ @Get('all')
35
+ getAll() {
36
+ return this.xpLearningTypeService.getAll();
37
+ }
38
+
39
+ @Get(':id')
40
+ getById(@Param('id', ParseIntPipe) id: number) {
41
+ return this.xpLearningTypeService.getById(id);
42
+ }
43
+
44
+ @Post()
45
+ create(@Body() dto: CreateXpLearningTypeDto) {
46
+ return this.xpLearningTypeService.create(dto);
47
+ }
48
+
49
+ @Patch(':id')
50
+ update(@Param('id', ParseIntPipe) id: number, @Body() dto: UpdateXpLearningTypeDto) {
51
+ return this.xpLearningTypeService.update(id, dto);
52
+ }
53
+
54
+ @Delete(':id')
55
+ @HttpCode(HttpStatus.NO_CONTENT)
56
+ remove(@Param('id', ParseIntPipe) id: number) {
57
+ return this.xpLearningTypeService.delete(id);
58
+ }
59
+ }
@@ -0,0 +1,170 @@
1
+ import { PrismaService } from '@hed-hog/api-prisma';
2
+ import { Injectable, NotFoundException } from '@nestjs/common';
3
+ import { CreateXpLearningTypeDto } from './dto/create-xp-learning-type.dto';
4
+ import { UpdateXpLearningTypeDto } from './dto/update-xp-learning-type.dto';
5
+
6
+ @Injectable()
7
+ export class XpLearningTypeService {
8
+ constructor(private readonly prisma: PrismaService) {}
9
+
10
+ async list(params: { page?: number; pageSize?: number; search?: string; status?: string }) {
11
+ const page = Math.max(Number(params.page) || 1, 1);
12
+ const pageSize = Math.max(Number(params.pageSize) || 20, 1);
13
+ const offset = (page - 1) * pageSize;
14
+
15
+ const values: unknown[] = [];
16
+ const where: string[] = ['1 = 1'];
17
+
18
+ if (params.search?.trim()) {
19
+ const p = this.param(values, `%${params.search.trim()}%`);
20
+ where.push(`(t.slug ILIKE ${p} OR COALESCE(l.name, '') ILIKE ${p})`);
21
+ }
22
+ if (params.status?.trim()) {
23
+ where.push(`t.status::text = ${this.param(values, params.status.trim())}`);
24
+ }
25
+
26
+ const whereClause = where.join(' AND ');
27
+ const ptLocaleSubquery = `(SELECT id FROM locale WHERE code = 'pt' LIMIT 1)`;
28
+
29
+ const totalRow = await this.querySingle<{ total: string }>(
30
+ `SELECT COUNT(*)::text AS total
31
+ FROM xp_learning_type t
32
+ LEFT JOIN xp_learning_type_locale l ON l.xp_learning_type_id = t.id AND l.locale_id = ${ptLocaleSubquery}
33
+ WHERE ${whereClause}`,
34
+ values,
35
+ );
36
+
37
+ const q = [...values];
38
+ const rows = await this.queryRows<any>(
39
+ `SELECT
40
+ t.id, t.slug, t.multiplier::float AS multiplier, t.sort_order AS "sortOrder", t.status::text AS status,
41
+ COALESCE(l.name, t.slug) AS name, l.description,
42
+ t.created_at::text AS "createdAt", t.updated_at::text AS "updatedAt"
43
+ FROM xp_learning_type t
44
+ LEFT JOIN xp_learning_type_locale l ON l.xp_learning_type_id = t.id AND l.locale_id = ${ptLocaleSubquery}
45
+ WHERE ${whereClause}
46
+ ORDER BY t.sort_order ASC, t.slug ASC
47
+ LIMIT ${this.param(q, pageSize)} OFFSET ${this.param(q, offset)}`,
48
+ q,
49
+ );
50
+
51
+ const total = Number(totalRow?.total ?? 0);
52
+ return { data: rows, total, page, pageSize, lastPage: Math.ceil(total / pageSize) };
53
+ }
54
+
55
+ async getAll() {
56
+ return this.queryRows<any>(
57
+ `SELECT
58
+ t.id, t.slug, t.multiplier::float AS multiplier, t.sort_order AS "sortOrder",
59
+ COALESCE(lpt.name, len.name, t.slug) AS name
60
+ FROM xp_learning_type t
61
+ LEFT JOIN xp_learning_type_locale lpt ON lpt.xp_learning_type_id = t.id
62
+ AND lpt.locale_id = (SELECT id FROM locale WHERE code = 'pt' LIMIT 1)
63
+ LEFT JOIN xp_learning_type_locale len ON len.xp_learning_type_id = t.id
64
+ AND len.locale_id = (SELECT id FROM locale WHERE code = 'en' LIMIT 1)
65
+ WHERE t.status = 'active'
66
+ ORDER BY t.sort_order ASC, t.slug ASC`,
67
+ );
68
+ }
69
+
70
+ async getById(id: number) {
71
+ const row = await this.querySingle<any>(
72
+ `SELECT id, slug, multiplier::float AS multiplier, sort_order AS "sortOrder", status::text AS status,
73
+ created_at::text AS "createdAt", updated_at::text AS "updatedAt"
74
+ FROM xp_learning_type WHERE id = $1`,
75
+ [id],
76
+ );
77
+ if (!row) throw new NotFoundException('XP learning type not found');
78
+
79
+ const locales = await this.queryRows<any>(
80
+ `SELECT l.code, tl.name, tl.description
81
+ FROM xp_learning_type_locale tl JOIN locale l ON l.id = tl.locale_id
82
+ WHERE tl.xp_learning_type_id = $1`,
83
+ [id],
84
+ );
85
+
86
+ const translations: Record<string, { name: string; description: string | null }> = {};
87
+ for (const loc of locales) translations[loc.code] = { name: loc.name, description: loc.description };
88
+
89
+ return { ...row, translations };
90
+ }
91
+
92
+ async create(dto: CreateXpLearningTypeDto) {
93
+ const created = await this.querySingle<{ id: number }>(
94
+ `INSERT INTO xp_learning_type (slug, multiplier, sort_order, status, created_at, updated_at)
95
+ VALUES ($1, $2, $3, $4::xp_learning_type_status_c3d4e5f6a7_enum, NOW(), NOW())
96
+ RETURNING id`,
97
+ [dto.slug.trim(), dto.multiplier ?? 1, dto.sortOrder ?? 0, dto.status ?? 'active'],
98
+ );
99
+ await this.upsertLocales(created!.id, dto);
100
+ return this.getById(created!.id);
101
+ }
102
+
103
+ async update(id: number, dto: UpdateXpLearningTypeDto) {
104
+ await this.ensureExists(id);
105
+
106
+ const updates: string[] = [];
107
+ const values: unknown[] = [];
108
+
109
+ if (dto.slug !== undefined) updates.push(`slug = ${this.param(values, dto.slug.trim())}`);
110
+ if (dto.multiplier !== undefined) updates.push(`multiplier = ${this.param(values, dto.multiplier)}`);
111
+ if (dto.sortOrder !== undefined) updates.push(`sort_order = ${this.param(values, dto.sortOrder)}`);
112
+ if (dto.status !== undefined) updates.push(`status = ${this.param(values, dto.status)}::xp_learning_type_status_c3d4e5f6a7_enum`);
113
+
114
+ if (updates.length > 0) {
115
+ values.push(id);
116
+ await this.prisma.$executeRawUnsafe(
117
+ `UPDATE xp_learning_type SET ${updates.join(', ')}, updated_at = NOW() WHERE id = $${values.length}`,
118
+ ...values,
119
+ );
120
+ }
121
+
122
+ await this.upsertLocales(id, dto);
123
+ return this.getById(id);
124
+ }
125
+
126
+ async delete(id: number) {
127
+ await this.ensureExists(id);
128
+ await this.prisma.$executeRawUnsafe(`DELETE FROM xp_learning_type WHERE id = $1`, id);
129
+ }
130
+
131
+ private async upsertLocales(
132
+ id: number,
133
+ dto: { namePt?: string; nameEn?: string; descriptionPt?: string | null; descriptionEn?: string | null },
134
+ ) {
135
+ const pairs = [
136
+ { code: 'pt', name: dto.namePt, description: dto.descriptionPt },
137
+ { code: 'en', name: dto.nameEn, description: dto.descriptionEn },
138
+ ];
139
+ for (const { code, name, description } of pairs) {
140
+ if (name !== undefined) {
141
+ await this.prisma.$executeRawUnsafe(
142
+ `INSERT INTO xp_learning_type_locale (xp_learning_type_id, locale_id, name, description, created_at, updated_at)
143
+ SELECT $1, l.id, $2, $3, NOW(), NOW() FROM locale l WHERE l.code = $4
144
+ ON CONFLICT (xp_learning_type_id, locale_id) DO UPDATE
145
+ SET name = EXCLUDED.name, description = EXCLUDED.description, updated_at = NOW()`,
146
+ id, name, description ?? null, code,
147
+ );
148
+ }
149
+ }
150
+ }
151
+
152
+ private async ensureExists(id: number) {
153
+ const row = await this.querySingle<{ id: number }>(`SELECT id FROM xp_learning_type WHERE id = $1`, [id]);
154
+ if (!row) throw new NotFoundException('XP learning type not found');
155
+ }
156
+
157
+ private param(values: unknown[], value: unknown) {
158
+ values.push(value);
159
+ return `$${values.length}`;
160
+ }
161
+
162
+ private async queryRows<T>(query: string, values: unknown[] = []) {
163
+ return this.prisma.$queryRawUnsafe<T[]>(query, ...values);
164
+ }
165
+
166
+ private async querySingle<T>(query: string, values: unknown[] = []) {
167
+ const rows = await this.prisma.$queryRawUnsafe<T[]>(query, ...values);
168
+ return rows[0] ?? null;
169
+ }
170
+ }
@@ -0,0 +1,71 @@
1
+ import { Role } from '@hed-hog/api';
2
+ import {
3
+ Body,
4
+ Controller,
5
+ Delete,
6
+ Get,
7
+ HttpCode,
8
+ HttpStatus,
9
+ Param,
10
+ ParseIntPipe,
11
+ Patch,
12
+ Post,
13
+ Query,
14
+ } from '@nestjs/common';
15
+ import { CreateXpSkillDto } from './dto/create-xp-skill.dto';
16
+ import { UpdateXpSkillDto } from './dto/update-xp-skill.dto';
17
+ import { XpSkillService } from './xp-skill.service';
18
+
19
+ @Role()
20
+ @Controller('lms/xp/skills')
21
+ export class XpSkillController {
22
+ constructor(private readonly xpSkillService: XpSkillService) {}
23
+
24
+ @Get()
25
+ list(
26
+ @Query('page') page?: string,
27
+ @Query('pageSize') pageSize?: string,
28
+ @Query('search') search?: string,
29
+ @Query('status') status?: string,
30
+ @Query('areaId') areaId?: string,
31
+ ) {
32
+ return this.xpSkillService.list({
33
+ page: Number(page) || 1,
34
+ pageSize: Number(pageSize) || 20,
35
+ search,
36
+ status,
37
+ areaId: areaId ? Number(areaId) : undefined,
38
+ });
39
+ }
40
+
41
+ @Get('all')
42
+ getAll(@Query('areaId') areaId?: string) {
43
+ return this.xpSkillService.getAll(areaId ? Number(areaId) : undefined);
44
+ }
45
+
46
+ @Get('stats')
47
+ stats() {
48
+ return this.xpSkillService.stats();
49
+ }
50
+
51
+ @Get(':id')
52
+ getById(@Param('id', ParseIntPipe) id: number) {
53
+ return this.xpSkillService.getById(id);
54
+ }
55
+
56
+ @Post()
57
+ create(@Body() dto: CreateXpSkillDto) {
58
+ return this.xpSkillService.create(dto);
59
+ }
60
+
61
+ @Patch(':id')
62
+ update(@Param('id', ParseIntPipe) id: number, @Body() dto: UpdateXpSkillDto) {
63
+ return this.xpSkillService.update(id, dto);
64
+ }
65
+
66
+ @Delete(':id')
67
+ @HttpCode(HttpStatus.NO_CONTENT)
68
+ remove(@Param('id', ParseIntPipe) id: number) {
69
+ return this.xpSkillService.delete(id);
70
+ }
71
+ }