@hed-hog/lms 0.0.349 → 0.0.350

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 (409) hide show
  1. package/dist/achievement/achievement.controller.d.ts +62 -0
  2. package/dist/achievement/achievement.controller.d.ts.map +1 -0
  3. package/dist/achievement/achievement.controller.js +90 -0
  4. package/dist/achievement/achievement.controller.js.map +1 -0
  5. package/dist/achievement/achievement.mcp-tools.d.ts +19 -0
  6. package/dist/achievement/achievement.mcp-tools.d.ts.map +1 -0
  7. package/dist/achievement/achievement.mcp-tools.js +157 -0
  8. package/dist/achievement/achievement.mcp-tools.js.map +1 -0
  9. package/dist/achievement/achievement.module.d.ts +3 -0
  10. package/dist/achievement/achievement.module.d.ts.map +1 -0
  11. package/dist/achievement/achievement.module.js +26 -0
  12. package/dist/achievement/achievement.module.js.map +1 -0
  13. package/dist/achievement/achievement.service.d.ts +72 -0
  14. package/dist/achievement/achievement.service.d.ts.map +1 -0
  15. package/dist/achievement/achievement.service.js +200 -0
  16. package/dist/achievement/achievement.service.js.map +1 -0
  17. package/dist/achievement/dto/create-achievement.dto.d.ts +12 -0
  18. package/dist/achievement/dto/create-achievement.dto.d.ts.map +1 -0
  19. package/dist/achievement/dto/create-achievement.dto.js +60 -0
  20. package/dist/achievement/dto/create-achievement.dto.js.map +1 -0
  21. package/dist/achievement/dto/update-achievement.dto.d.ts +11 -0
  22. package/dist/achievement/dto/update-achievement.dto.d.ts.map +1 -0
  23. package/dist/achievement/dto/update-achievement.dto.js +57 -0
  24. package/dist/achievement/dto/update-achievement.dto.js.map +1 -0
  25. package/dist/bitcode-wallet/bitcode-wallet.controller.d.ts +114 -0
  26. package/dist/bitcode-wallet/bitcode-wallet.controller.d.ts.map +1 -0
  27. package/dist/bitcode-wallet/bitcode-wallet.controller.js +102 -0
  28. package/dist/bitcode-wallet/bitcode-wallet.controller.js.map +1 -0
  29. package/dist/bitcode-wallet/bitcode-wallet.mcp-tools.d.ts +25 -0
  30. package/dist/bitcode-wallet/bitcode-wallet.mcp-tools.d.ts.map +1 -0
  31. package/dist/bitcode-wallet/bitcode-wallet.mcp-tools.js +160 -0
  32. package/dist/bitcode-wallet/bitcode-wallet.mcp-tools.js.map +1 -0
  33. package/dist/bitcode-wallet/bitcode-wallet.module.d.ts +3 -0
  34. package/dist/bitcode-wallet/bitcode-wallet.module.d.ts.map +1 -0
  35. package/dist/bitcode-wallet/bitcode-wallet.module.js +26 -0
  36. package/dist/bitcode-wallet/bitcode-wallet.module.js.map +1 -0
  37. package/dist/bitcode-wallet/bitcode-wallet.service.d.ts +127 -0
  38. package/dist/bitcode-wallet/bitcode-wallet.service.d.ts.map +1 -0
  39. package/dist/bitcode-wallet/bitcode-wallet.service.js +264 -0
  40. package/dist/bitcode-wallet/bitcode-wallet.service.js.map +1 -0
  41. package/dist/bitcode-wallet/dto/create-bitcode-wallet-transaction.dto.d.ts +8 -0
  42. package/dist/bitcode-wallet/dto/create-bitcode-wallet-transaction.dto.d.ts.map +1 -0
  43. package/dist/bitcode-wallet/dto/create-bitcode-wallet-transaction.dto.js +33 -0
  44. package/dist/bitcode-wallet/dto/create-bitcode-wallet-transaction.dto.js.map +1 -0
  45. package/dist/bitcode-wallet/dto/create-bitcode-wallet.dto.d.ts +4 -0
  46. package/dist/bitcode-wallet/dto/create-bitcode-wallet.dto.d.ts.map +1 -0
  47. package/dist/bitcode-wallet/dto/create-bitcode-wallet.dto.js +22 -0
  48. package/dist/bitcode-wallet/dto/create-bitcode-wallet.dto.js.map +1 -0
  49. package/dist/bitcode-wallet/dto/update-bitcode-wallet-transaction.dto.d.ts +7 -0
  50. package/dist/bitcode-wallet/dto/update-bitcode-wallet-transaction.dto.d.ts.map +1 -0
  51. package/dist/bitcode-wallet/dto/update-bitcode-wallet-transaction.dto.js +35 -0
  52. package/dist/bitcode-wallet/dto/update-bitcode-wallet-transaction.dto.js.map +1 -0
  53. package/dist/bitcode-wallet/dto/update-bitcode-wallet.dto.d.ts +4 -0
  54. package/dist/bitcode-wallet/dto/update-bitcode-wallet.dto.d.ts.map +1 -0
  55. package/dist/bitcode-wallet/dto/update-bitcode-wallet.dto.js +23 -0
  56. package/dist/bitcode-wallet/dto/update-bitcode-wallet.dto.js.map +1 -0
  57. package/dist/certificate/certificate.controller.d.ts +22 -0
  58. package/dist/certificate/certificate.controller.d.ts.map +1 -1
  59. package/dist/certificate/certificate.controller.js +12 -0
  60. package/dist/certificate/certificate.controller.js.map +1 -1
  61. package/dist/certificate/certificate.mcp-tools.d.ts +24 -0
  62. package/dist/certificate/certificate.mcp-tools.d.ts.map +1 -0
  63. package/dist/certificate/certificate.mcp-tools.js +188 -0
  64. package/dist/certificate/certificate.mcp-tools.js.map +1 -0
  65. package/dist/certificate/certificate.module.d.ts.map +1 -1
  66. package/dist/certificate/certificate.module.js +2 -1
  67. package/dist/certificate/certificate.module.js.map +1 -1
  68. package/dist/certificate/certificate.service.d.ts +25 -2
  69. package/dist/certificate/certificate.service.d.ts.map +1 -1
  70. package/dist/certificate/certificate.service.js +87 -2
  71. package/dist/certificate/certificate.service.js.map +1 -1
  72. package/dist/certificate/dto/update-certificate-public-access.dto.d.ts +4 -0
  73. package/dist/certificate/dto/update-certificate-public-access.dto.d.ts.map +1 -0
  74. package/dist/certificate/dto/update-certificate-public-access.dto.js +21 -0
  75. package/dist/certificate/dto/update-certificate-public-access.dto.js.map +1 -0
  76. package/dist/class-group/class-group.mcp-tools.d.ts +87 -0
  77. package/dist/class-group/class-group.mcp-tools.d.ts.map +1 -0
  78. package/dist/class-group/class-group.mcp-tools.js +553 -0
  79. package/dist/class-group/class-group.mcp-tools.js.map +1 -0
  80. package/dist/class-group/class-group.module.d.ts.map +1 -1
  81. package/dist/class-group/class-group.module.js +2 -1
  82. package/dist/class-group/class-group.module.js.map +1 -1
  83. package/dist/class-group/class-group.service.d.ts +3 -1
  84. package/dist/class-group/class-group.service.d.ts.map +1 -1
  85. package/dist/class-group/class-group.service.js +45 -2
  86. package/dist/class-group/class-group.service.js.map +1 -1
  87. package/dist/course/course-operations-integration.service.d.ts +40 -0
  88. package/dist/course/course-operations-integration.service.d.ts.map +1 -0
  89. package/dist/course/course-operations-integration.service.js +372 -0
  90. package/dist/course/course-operations-integration.service.js.map +1 -0
  91. package/dist/course/course-structure.controller.d.ts +43 -4
  92. package/dist/course/course-structure.controller.d.ts.map +1 -1
  93. package/dist/course/course-structure.controller.js +22 -0
  94. package/dist/course/course-structure.controller.js.map +1 -1
  95. package/dist/course/course-structure.service.d.ts +42 -1
  96. package/dist/course/course-structure.service.d.ts.map +1 -1
  97. package/dist/course/course-structure.service.js +199 -32
  98. package/dist/course/course-structure.service.js.map +1 -1
  99. package/dist/course/course.controller.d.ts +12 -0
  100. package/dist/course/course.controller.d.ts.map +1 -1
  101. package/dist/course/course.mcp-tools.d.ts +90 -0
  102. package/dist/course/course.mcp-tools.d.ts.map +1 -0
  103. package/dist/course/course.mcp-tools.js +520 -0
  104. package/dist/course/course.mcp-tools.js.map +1 -0
  105. package/dist/course/course.module.d.ts.map +1 -1
  106. package/dist/course/course.module.js +8 -1
  107. package/dist/course/course.module.js.map +1 -1
  108. package/dist/course/course.service.d.ts +15 -1
  109. package/dist/course/course.service.d.ts.map +1 -1
  110. package/dist/course/course.service.js +70 -35
  111. package/dist/course/course.service.js.map +1 -1
  112. package/dist/course/dto/create-course.dto.d.ts +1 -0
  113. package/dist/course/dto/create-course.dto.d.ts.map +1 -1
  114. package/dist/course/dto/create-course.dto.js +7 -0
  115. package/dist/course/dto/create-course.dto.js.map +1 -1
  116. package/dist/course/dto/update-course-resources.dto.d.ts +11 -0
  117. package/dist/course/dto/update-course-resources.dto.d.ts.map +1 -0
  118. package/dist/course/dto/update-course-resources.dto.js +51 -0
  119. package/dist/course/dto/update-course-resources.dto.js.map +1 -0
  120. package/dist/course-lesson-discussion/course-lesson-discussion.controller.d.ts +23 -0
  121. package/dist/course-lesson-discussion/course-lesson-discussion.controller.d.ts.map +1 -0
  122. package/dist/course-lesson-discussion/course-lesson-discussion.controller.js +78 -0
  123. package/dist/course-lesson-discussion/course-lesson-discussion.controller.js.map +1 -0
  124. package/dist/course-lesson-discussion/course-lesson-discussion.mcp-tools.d.ts +22 -0
  125. package/dist/course-lesson-discussion/course-lesson-discussion.mcp-tools.d.ts.map +1 -0
  126. package/dist/course-lesson-discussion/course-lesson-discussion.mcp-tools.js +120 -0
  127. package/dist/course-lesson-discussion/course-lesson-discussion.mcp-tools.js.map +1 -0
  128. package/dist/course-lesson-discussion/course-lesson-discussion.module.d.ts +3 -0
  129. package/dist/course-lesson-discussion/course-lesson-discussion.module.d.ts.map +1 -0
  130. package/dist/course-lesson-discussion/course-lesson-discussion.module.js +26 -0
  131. package/dist/course-lesson-discussion/course-lesson-discussion.module.js.map +1 -0
  132. package/dist/course-lesson-discussion/course-lesson-discussion.service.d.ts +49 -0
  133. package/dist/course-lesson-discussion/course-lesson-discussion.service.d.ts.map +1 -0
  134. package/dist/course-lesson-discussion/course-lesson-discussion.service.js +272 -0
  135. package/dist/course-lesson-discussion/course-lesson-discussion.service.js.map +1 -0
  136. package/dist/course-lesson-discussion/dto/create-course-lesson-discussion-topic.dto.d.ts +6 -0
  137. package/dist/course-lesson-discussion/dto/create-course-lesson-discussion-topic.dto.d.ts.map +1 -0
  138. package/dist/course-lesson-discussion/dto/create-course-lesson-discussion-topic.dto.js +33 -0
  139. package/dist/course-lesson-discussion/dto/create-course-lesson-discussion-topic.dto.js.map +1 -0
  140. package/dist/course-lesson-note/course-lesson-note.controller.d.ts +53 -0
  141. package/dist/course-lesson-note/course-lesson-note.controller.d.ts.map +1 -0
  142. package/dist/course-lesson-note/course-lesson-note.controller.js +93 -0
  143. package/dist/course-lesson-note/course-lesson-note.controller.js.map +1 -0
  144. package/dist/course-lesson-note/course-lesson-note.mcp-tools.d.ts +27 -0
  145. package/dist/course-lesson-note/course-lesson-note.mcp-tools.d.ts.map +1 -0
  146. package/dist/course-lesson-note/course-lesson-note.mcp-tools.js +145 -0
  147. package/dist/course-lesson-note/course-lesson-note.mcp-tools.js.map +1 -0
  148. package/dist/course-lesson-note/course-lesson-note.module.d.ts +3 -0
  149. package/dist/course-lesson-note/course-lesson-note.module.d.ts.map +1 -0
  150. package/dist/course-lesson-note/course-lesson-note.module.js +26 -0
  151. package/dist/course-lesson-note/course-lesson-note.module.js.map +1 -0
  152. package/dist/course-lesson-note/course-lesson-note.service.d.ts +59 -0
  153. package/dist/course-lesson-note/course-lesson-note.service.d.ts.map +1 -0
  154. package/dist/course-lesson-note/course-lesson-note.service.js +195 -0
  155. package/dist/course-lesson-note/course-lesson-note.service.js.map +1 -0
  156. package/dist/course-lesson-note/dto/create-course-lesson-note.dto.d.ts +6 -0
  157. package/dist/course-lesson-note/dto/create-course-lesson-note.dto.d.ts.map +1 -0
  158. package/dist/course-lesson-note/dto/create-course-lesson-note.dto.js +33 -0
  159. package/dist/course-lesson-note/dto/create-course-lesson-note.dto.js.map +1 -0
  160. package/dist/course-lesson-note/dto/update-course-lesson-note.dto.d.ts +6 -0
  161. package/dist/course-lesson-note/dto/update-course-lesson-note.dto.d.ts.map +1 -0
  162. package/dist/course-lesson-note/dto/update-course-lesson-note.dto.js +35 -0
  163. package/dist/course-lesson-note/dto/update-course-lesson-note.dto.js.map +1 -0
  164. package/dist/dashboard/dashboard.mcp-tools.d.ts +10 -0
  165. package/dist/dashboard/dashboard.mcp-tools.d.ts.map +1 -0
  166. package/dist/dashboard/dashboard.mcp-tools.js +46 -0
  167. package/dist/dashboard/dashboard.mcp-tools.js.map +1 -0
  168. package/dist/dashboard/dashboard.module.d.ts.map +1 -1
  169. package/dist/dashboard/dashboard.module.js +2 -1
  170. package/dist/dashboard/dashboard.module.js.map +1 -1
  171. package/dist/enterprise/enterprise.mcp-tools.d.ts +82 -0
  172. package/dist/enterprise/enterprise.mcp-tools.d.ts.map +1 -0
  173. package/dist/enterprise/enterprise.mcp-tools.js +516 -0
  174. package/dist/enterprise/enterprise.mcp-tools.js.map +1 -0
  175. package/dist/enterprise/enterprise.module.d.ts.map +1 -1
  176. package/dist/enterprise/enterprise.module.js +2 -1
  177. package/dist/enterprise/enterprise.module.js.map +1 -1
  178. package/dist/enterprise/training/enterprise-training.module.d.ts.map +1 -1
  179. package/dist/enterprise/training/enterprise-training.module.js +11 -1
  180. package/dist/enterprise/training/enterprise-training.module.js.map +1 -1
  181. package/dist/enterprise/training/training-admin.mcp-tools.d.ts +79 -0
  182. package/dist/enterprise/training/training-admin.mcp-tools.d.ts.map +1 -0
  183. package/dist/enterprise/training/training-admin.mcp-tools.js +620 -0
  184. package/dist/enterprise/training/training-admin.mcp-tools.js.map +1 -0
  185. package/dist/enterprise/training/training-instructor.mcp-tools.d.ts +47 -0
  186. package/dist/enterprise/training/training-instructor.mcp-tools.d.ts.map +1 -0
  187. package/dist/enterprise/training/training-instructor.mcp-tools.js +275 -0
  188. package/dist/enterprise/training/training-instructor.mcp-tools.js.map +1 -0
  189. package/dist/enterprise/training/training-student.controller.d.ts +24 -0
  190. package/dist/enterprise/training/training-student.controller.d.ts.map +1 -1
  191. package/dist/enterprise/training/training-student.controller.js +22 -0
  192. package/dist/enterprise/training/training-student.controller.js.map +1 -1
  193. package/dist/enterprise/training/training-student.mcp-tools.d.ts +27 -0
  194. package/dist/enterprise/training/training-student.mcp-tools.d.ts.map +1 -0
  195. package/dist/enterprise/training/training-student.mcp-tools.js +186 -0
  196. package/dist/enterprise/training/training-student.mcp-tools.js.map +1 -0
  197. package/dist/enterprise/training/training-student.service.d.ts +32 -0
  198. package/dist/enterprise/training/training-student.service.d.ts.map +1 -1
  199. package/dist/enterprise/training/training-student.service.js +138 -0
  200. package/dist/enterprise/training/training-student.service.js.map +1 -1
  201. package/dist/evaluation/evaluation.mcp-tools.d.ts +25 -0
  202. package/dist/evaluation/evaluation.mcp-tools.d.ts.map +1 -0
  203. package/dist/evaluation/evaluation.mcp-tools.js +220 -0
  204. package/dist/evaluation/evaluation.mcp-tools.js.map +1 -0
  205. package/dist/evaluation/evaluation.module.d.ts.map +1 -1
  206. package/dist/evaluation/evaluation.module.js +2 -1
  207. package/dist/evaluation/evaluation.module.js.map +1 -1
  208. package/dist/exam/dto/create-exam-question.dto.d.ts +2 -0
  209. package/dist/exam/dto/create-exam-question.dto.d.ts.map +1 -1
  210. package/dist/exam/dto/create-exam-question.dto.js +10 -0
  211. package/dist/exam/dto/create-exam-question.dto.js.map +1 -1
  212. package/dist/exam/dto/create-exam.dto.d.ts +2 -0
  213. package/dist/exam/dto/create-exam.dto.d.ts.map +1 -1
  214. package/dist/exam/dto/create-exam.dto.js +10 -0
  215. package/dist/exam/dto/create-exam.dto.js.map +1 -1
  216. package/dist/exam/dto/create-question-subject.dto.d.ts +5 -0
  217. package/dist/exam/dto/create-question-subject.dto.d.ts.map +1 -0
  218. package/dist/exam/dto/create-question-subject.dto.js +28 -0
  219. package/dist/exam/dto/create-question-subject.dto.js.map +1 -0
  220. package/dist/exam/exam-attempt.controller.d.ts +4 -0
  221. package/dist/exam/exam-attempt.controller.d.ts.map +1 -1
  222. package/dist/exam/exam-attempt.service.d.ts +7 -1
  223. package/dist/exam/exam-attempt.service.d.ts.map +1 -1
  224. package/dist/exam/exam-attempt.service.js +47 -17
  225. package/dist/exam/exam-attempt.service.js.map +1 -1
  226. package/dist/exam/exam.controller.d.ts +34 -0
  227. package/dist/exam/exam.controller.d.ts.map +1 -1
  228. package/dist/exam/exam.controller.js +27 -0
  229. package/dist/exam/exam.controller.js.map +1 -1
  230. package/dist/exam/exam.mcp-tools.d.ts +62 -0
  231. package/dist/exam/exam.mcp-tools.d.ts.map +1 -0
  232. package/dist/exam/exam.mcp-tools.js +430 -0
  233. package/dist/exam/exam.mcp-tools.js.map +1 -0
  234. package/dist/exam/exam.module.d.ts.map +1 -1
  235. package/dist/exam/exam.module.js +2 -1
  236. package/dist/exam/exam.module.js.map +1 -1
  237. package/dist/exam/exam.service.d.ts +38 -0
  238. package/dist/exam/exam.service.d.ts.map +1 -1
  239. package/dist/exam/exam.service.js +114 -17
  240. package/dist/exam/exam.service.js.map +1 -1
  241. package/dist/index.d.ts +9 -0
  242. package/dist/index.d.ts.map +1 -1
  243. package/dist/index.js +9 -0
  244. package/dist/index.js.map +1 -1
  245. package/dist/instructor/instructor.mcp-tools.d.ts +41 -0
  246. package/dist/instructor/instructor.mcp-tools.d.ts.map +1 -0
  247. package/dist/instructor/instructor.mcp-tools.js +326 -0
  248. package/dist/instructor/instructor.mcp-tools.js.map +1 -0
  249. package/dist/instructor/instructor.module.d.ts.map +1 -1
  250. package/dist/instructor/instructor.module.js +2 -1
  251. package/dist/instructor/instructor.module.js.map +1 -1
  252. package/dist/lms.module.d.ts.map +1 -1
  253. package/dist/lms.module.js +15 -0
  254. package/dist/lms.module.js.map +1 -1
  255. package/dist/realtime/lms-realtime.controller.d.ts +7 -0
  256. package/dist/realtime/lms-realtime.controller.d.ts.map +1 -0
  257. package/dist/realtime/lms-realtime.controller.js +34 -0
  258. package/dist/realtime/lms-realtime.controller.js.map +1 -0
  259. package/dist/realtime/lms-realtime.module.d.ts +3 -0
  260. package/dist/realtime/lms-realtime.module.d.ts.map +1 -0
  261. package/dist/realtime/lms-realtime.module.js +25 -0
  262. package/dist/realtime/lms-realtime.module.js.map +1 -0
  263. package/dist/realtime/lms-realtime.service.d.ts +36 -0
  264. package/dist/realtime/lms-realtime.service.d.ts.map +1 -0
  265. package/dist/realtime/lms-realtime.service.js +59 -0
  266. package/dist/realtime/lms-realtime.service.js.map +1 -0
  267. package/dist/realtime/lms-realtime.subscriber.d.ts +10 -0
  268. package/dist/realtime/lms-realtime.subscriber.d.ts.map +1 -0
  269. package/dist/realtime/lms-realtime.subscriber.js +70 -0
  270. package/dist/realtime/lms-realtime.subscriber.js.map +1 -0
  271. package/dist/reports/reports.mcp-tools.d.ts +10 -0
  272. package/dist/reports/reports.mcp-tools.d.ts.map +1 -0
  273. package/dist/reports/reports.mcp-tools.js +50 -0
  274. package/dist/reports/reports.mcp-tools.js.map +1 -0
  275. package/dist/reports/reports.module.d.ts.map +1 -1
  276. package/dist/reports/reports.module.js +2 -1
  277. package/dist/reports/reports.module.js.map +1 -1
  278. package/dist/training/training.mcp-tools.d.ts +20 -0
  279. package/dist/training/training.mcp-tools.d.ts.map +1 -0
  280. package/dist/training/training.mcp-tools.js +181 -0
  281. package/dist/training/training.mcp-tools.js.map +1 -0
  282. package/dist/training/training.module.d.ts.map +1 -1
  283. package/dist/training/training.module.js +2 -1
  284. package/dist/training/training.module.js.map +1 -1
  285. package/hedhog/data/integration_event_catalog.yaml +69 -0
  286. package/hedhog/data/menu.yaml +34 -0
  287. package/hedhog/data/route.yaml +2351 -0
  288. package/hedhog/frontend/app/_components/class-form-sheet.tsx.ejs +168 -103
  289. package/hedhog/frontend/app/_components/course-form-sheet.tsx.ejs +80 -1
  290. package/hedhog/frontend/app/_components/course-picker.tsx.ejs +228 -0
  291. package/hedhog/frontend/app/_lib/hooks/use-lms-realtime-refresh.ts.ejs +58 -0
  292. package/hedhog/frontend/app/achievements/page.tsx.ejs +844 -0
  293. package/hedhog/frontend/app/bitcodes/page.tsx.ejs +1010 -0
  294. package/hedhog/frontend/app/certificates/issued/page.tsx.ejs +61 -2
  295. package/hedhog/frontend/app/classes/[id]/page.tsx.ejs +7 -0
  296. package/hedhog/frontend/app/classes/page.tsx.ejs +55 -2060
  297. package/hedhog/frontend/app/courses/[id]/_components/CourseRelationsCard.tsx.ejs +28 -0
  298. package/hedhog/frontend/app/courses/[id]/_components/course-edit-types.ts.ejs +1 -0
  299. package/hedhog/frontend/app/courses/[id]/page.tsx.ejs +0 -9
  300. package/hedhog/frontend/app/courses/[id]/structure/_components/course-tree-dnd.tsx.ejs +80 -66
  301. package/hedhog/frontend/app/courses/[id]/structure/_components/editor-course.tsx.ejs +583 -8
  302. package/hedhog/frontend/app/courses/[id]/structure/_components/editor-lesson.tsx.ejs +527 -57
  303. package/hedhog/frontend/app/courses/[id]/structure/_components/mock-data.ts.ejs +1 -1
  304. package/hedhog/frontend/app/courses/[id]/structure/_components/tree-context-menu.tsx.ejs +106 -4
  305. package/hedhog/frontend/app/courses/[id]/structure/_components/types.ts.ejs +2 -1
  306. package/hedhog/frontend/app/courses/[id]/structure/_data/adapters/course-structure.adapter.ts.ejs +11 -1
  307. package/hedhog/frontend/app/courses/[id]/structure/_data/services/course-structure.service.ts.ejs +53 -6
  308. package/hedhog/frontend/app/courses/[id]/structure/_data/types/api-course.types.ts.ejs +13 -2
  309. package/hedhog/frontend/app/courses/page.tsx.ejs +175 -29
  310. package/hedhog/frontend/app/enterprise/_components/enterprise-course-create-sheet.tsx.ejs +3 -0
  311. package/hedhog/frontend/app/enterprise/_components/enterprise-course-edit-sheet.tsx.ejs +7 -0
  312. package/hedhog/frontend/app/exams/[id]/questions/page.tsx.ejs +169 -2
  313. package/hedhog/frontend/app/exams/page.tsx.ejs +77 -22
  314. package/hedhog/frontend/app/instructor-skills/page.tsx.ejs +1 -0
  315. package/hedhog/frontend/app/instructors/page.tsx.ejs +1 -0
  316. package/hedhog/frontend/app/paths/page.tsx.ejs +6 -24
  317. package/hedhog/frontend/app/training/page.tsx.ejs +6 -24
  318. package/hedhog/frontend/messages/en.json +314 -12
  319. package/hedhog/frontend/messages/pt.json +314 -12
  320. package/hedhog/query/triggers.sql +53 -0
  321. package/hedhog/table/achievement.yaml +46 -0
  322. package/hedhog/table/bitcode_wallet.yaml +18 -0
  323. package/hedhog/table/bitcode_wallet_transaction.yaml +22 -0
  324. package/hedhog/table/certificate.yaml +3 -0
  325. package/hedhog/table/course.yaml +4 -0
  326. package/hedhog/table/course_file.yaml +23 -0
  327. package/hedhog/table/course_lesson.yaml +5 -0
  328. package/hedhog/table/course_lesson_discussion_like.yaml +21 -0
  329. package/hedhog/table/course_lesson_discussion_topic.yaml +35 -0
  330. package/hedhog/table/course_lesson_note.yaml +34 -0
  331. package/hedhog/table/exam.yaml +5 -0
  332. package/hedhog/table/learning_path_enrollment.yaml +6 -0
  333. package/hedhog/table/question.yaml +10 -0
  334. package/hedhog/table/question_subject.yaml +17 -0
  335. package/hedhog/table/student_activity_streak.yaml +25 -0
  336. package/package.json +6 -6
  337. package/src/achievement/achievement.controller.ts +60 -0
  338. package/src/achievement/achievement.mcp-tools.ts +108 -0
  339. package/src/achievement/achievement.module.ts +13 -0
  340. package/src/achievement/achievement.service.ts +252 -0
  341. package/src/achievement/dto/create-achievement.dto.ts +50 -0
  342. package/src/achievement/dto/update-achievement.dto.ts +47 -0
  343. package/src/bitcode-wallet/bitcode-wallet.controller.ts +69 -0
  344. package/src/bitcode-wallet/bitcode-wallet.mcp-tools.ts +107 -0
  345. package/src/bitcode-wallet/bitcode-wallet.module.ts +13 -0
  346. package/src/bitcode-wallet/bitcode-wallet.service.ts +361 -0
  347. package/src/bitcode-wallet/dto/create-bitcode-wallet-transaction.dto.ts +27 -0
  348. package/src/bitcode-wallet/dto/create-bitcode-wallet.dto.ts +7 -0
  349. package/src/bitcode-wallet/dto/update-bitcode-wallet-transaction.dto.ts +28 -0
  350. package/src/bitcode-wallet/dto/update-bitcode-wallet.dto.ts +8 -0
  351. package/src/certificate/certificate.controller.ts +20 -11
  352. package/src/certificate/certificate.mcp-tools.ts +131 -0
  353. package/src/certificate/certificate.module.ts +2 -1
  354. package/src/certificate/certificate.service.ts +95 -4
  355. package/src/certificate/dto/update-certificate-public-access.dto.ts +6 -0
  356. package/src/class-group/class-group.mcp-tools.ts +435 -0
  357. package/src/class-group/class-group.module.ts +2 -1
  358. package/src/class-group/class-group.service.ts +51 -1
  359. package/src/course/course-operations-integration.service.ts +520 -0
  360. package/src/course/course-structure.controller.ts +22 -8
  361. package/src/course/course-structure.service.ts +215 -23
  362. package/src/course/course.mcp-tools.ts +409 -0
  363. package/src/course/course.module.ts +8 -1
  364. package/src/course/course.service.ts +106 -27
  365. package/src/course/dto/create-course.dto.ts +8 -0
  366. package/src/course/dto/update-course-resources.dto.ts +39 -0
  367. package/src/course-lesson-discussion/course-lesson-discussion.controller.ts +55 -0
  368. package/src/course-lesson-discussion/course-lesson-discussion.mcp-tools.ts +75 -0
  369. package/src/course-lesson-discussion/course-lesson-discussion.module.ts +13 -0
  370. package/src/course-lesson-discussion/course-lesson-discussion.service.ts +354 -0
  371. package/src/course-lesson-discussion/dto/create-course-lesson-discussion-topic.dto.ts +16 -0
  372. package/src/course-lesson-note/course-lesson-note.controller.ts +68 -0
  373. package/src/course-lesson-note/course-lesson-note.mcp-tools.ts +96 -0
  374. package/src/course-lesson-note/course-lesson-note.module.ts +13 -0
  375. package/src/course-lesson-note/course-lesson-note.service.ts +248 -0
  376. package/src/course-lesson-note/dto/create-course-lesson-note.dto.ts +16 -0
  377. package/src/course-lesson-note/dto/update-course-lesson-note.dto.ts +18 -0
  378. package/src/dashboard/dashboard.mcp-tools.ts +23 -0
  379. package/src/dashboard/dashboard.module.ts +2 -1
  380. package/src/enterprise/enterprise.mcp-tools.ts +403 -0
  381. package/src/enterprise/enterprise.module.ts +2 -1
  382. package/src/enterprise/training/enterprise-training.module.ts +11 -1
  383. package/src/enterprise/training/training-admin.mcp-tools.ts +479 -0
  384. package/src/enterprise/training/training-instructor.mcp-tools.ts +210 -0
  385. package/src/enterprise/training/training-student.controller.ts +17 -1
  386. package/src/enterprise/training/training-student.mcp-tools.ts +136 -0
  387. package/src/enterprise/training/training-student.service.ts +167 -1
  388. package/src/evaluation/evaluation.mcp-tools.ts +155 -0
  389. package/src/evaluation/evaluation.module.ts +2 -1
  390. package/src/exam/dto/create-exam-question.dto.ts +8 -0
  391. package/src/exam/dto/create-exam.dto.ts +8 -0
  392. package/src/exam/dto/create-question-subject.dto.ts +12 -0
  393. package/src/exam/exam-attempt.service.ts +46 -14
  394. package/src/exam/exam.controller.ts +19 -0
  395. package/src/exam/exam.mcp-tools.ts +337 -0
  396. package/src/exam/exam.module.ts +2 -1
  397. package/src/exam/exam.service.ts +121 -0
  398. package/src/index.ts +9 -0
  399. package/src/instructor/instructor.mcp-tools.ts +243 -0
  400. package/src/instructor/instructor.module.ts +2 -1
  401. package/src/lms.module.ts +15 -1
  402. package/src/realtime/lms-realtime.controller.ts +12 -0
  403. package/src/realtime/lms-realtime.module.ts +12 -0
  404. package/src/realtime/lms-realtime.service.ts +98 -0
  405. package/src/realtime/lms-realtime.subscriber.ts +61 -0
  406. package/src/reports/reports.mcp-tools.ts +27 -0
  407. package/src/reports/reports.module.ts +2 -1
  408. package/src/training/training.mcp-tools.ts +128 -0
  409. package/src/training/training.module.ts +2 -1
@@ -0,0 +1,435 @@
1
+ import { McpContext, McpTool } from '@hed-hog/core';
2
+ import { Injectable } from '@nestjs/common';
3
+ import { ClassGroupService } from './class-group.service';
4
+
5
+ @Injectable()
6
+ export class LmsClassGroupMcpTools {
7
+ constructor(private readonly classGroupService: ClassGroupService) {}
8
+
9
+ @McpTool({
10
+ name: 'lms.classes.list',
11
+ description: 'Lists class groups with optional pagination and filters.',
12
+ inputSchema: {
13
+ type: 'object',
14
+ properties: {
15
+ page: { type: 'number', description: 'Page number (default: 1)' },
16
+ pageSize: { type: 'number', description: 'Items per page (default: 20)' },
17
+ search: { type: 'string', description: 'Search term' },
18
+ status: { type: 'string', description: 'Filter by status (open|ongoing|completed|cancelled)' },
19
+ deliveryMode: { type: 'string', description: 'Filter by delivery mode (presential|online|hybrid)' },
20
+ courseId: { type: 'number', description: 'Filter by course ID' },
21
+ },
22
+ },
23
+ readOnly: true,
24
+ })
25
+ async listClasses(args: Record<string, any>, _context: McpContext): Promise<any> {
26
+ return this.classGroupService.list(args);
27
+ }
28
+
29
+ @McpTool({
30
+ name: 'lms.classes.stats',
31
+ description: 'Returns summary statistics for class groups.',
32
+ inputSchema: { type: 'object', properties: {} },
33
+ readOnly: true,
34
+ })
35
+ async getStats(_args: Record<string, any>, _context: McpContext): Promise<any> {
36
+ return this.classGroupService.stats();
37
+ }
38
+
39
+ @McpTool({
40
+ name: 'lms.classes.get',
41
+ description: 'Returns a single class group by ID with full details.',
42
+ inputSchema: {
43
+ type: 'object',
44
+ properties: {
45
+ id: { type: 'number', description: 'Class group ID' },
46
+ },
47
+ required: ['id'],
48
+ },
49
+ readOnly: true,
50
+ })
51
+ async getClass(args: { id: number }, _context: McpContext): Promise<any> {
52
+ return this.classGroupService.getById(args.id);
53
+ }
54
+
55
+ @McpTool({
56
+ name: 'lms.classes.create',
57
+ description: 'Creates a new class group.',
58
+ inputSchema: {
59
+ type: 'object',
60
+ properties: {
61
+ code: { type: 'string', description: 'Class code (required, max 50 chars)' },
62
+ courseId: { type: 'number', description: 'Course ID (required)' },
63
+ instructorId: { type: 'number', description: 'Instructor ID' },
64
+ title: { type: 'string', description: 'Class title (required, max 255 chars)' },
65
+ description: { type: 'string', description: 'Description' },
66
+ deliveryMode: { type: 'string', description: 'Delivery mode (required): presential|online|hybrid' },
67
+ status: { type: 'string', description: 'Status (open|ongoing|completed|cancelled)' },
68
+ startDate: { type: 'string', description: 'Start date (ISO8601)' },
69
+ endDate: { type: 'string', description: 'End date (ISO8601)' },
70
+ startTime: { type: 'string', description: 'Start time (HH:MM)' },
71
+ endTime: { type: 'string', description: 'End time (HH:MM)' },
72
+ weekDays: { type: 'string', description: 'Week days string' },
73
+ capacity: { type: 'number', description: 'Maximum capacity' },
74
+ location: { type: 'string', description: 'Physical location' },
75
+ virtualRoomUrl: { type: 'string', description: 'Virtual room URL (max 500 chars)' },
76
+ },
77
+ required: ['code', 'courseId', 'title', 'deliveryMode', 'startDate'],
78
+ },
79
+ })
80
+ async createClass(args: Record<string, any>, _context: McpContext): Promise<any> {
81
+ return this.classGroupService.create(args as any);
82
+ }
83
+
84
+ @McpTool({
85
+ name: 'lms.classes.update',
86
+ description: 'Updates an existing class group.',
87
+ inputSchema: {
88
+ type: 'object',
89
+ properties: {
90
+ id: { type: 'number', description: 'Class group ID' },
91
+ title: { type: 'string', description: 'Class title' },
92
+ description: { type: 'string', description: 'Description' },
93
+ instructorId: { type: 'number', description: 'Instructor ID' },
94
+ status: { type: 'string', description: 'Status (open|ongoing|completed|cancelled)' },
95
+ startDate: { type: 'string', description: 'Start date (ISO8601)' },
96
+ endDate: { type: 'string', description: 'End date (ISO8601)' },
97
+ startTime: { type: 'string', description: 'Start time (HH:MM)' },
98
+ endTime: { type: 'string', description: 'End time (HH:MM)' },
99
+ capacity: { type: 'number', description: 'Maximum capacity' },
100
+ location: { type: 'string', description: 'Physical location' },
101
+ virtualRoomUrl: { type: 'string', description: 'Virtual room URL' },
102
+ },
103
+ required: ['id'],
104
+ },
105
+ })
106
+ async updateClass(args: { id: number; [key: string]: any }, _context: McpContext): Promise<any> {
107
+ const { id, ...dto } = args;
108
+ return this.classGroupService.update(id, dto as any);
109
+ }
110
+
111
+ @McpTool({
112
+ name: 'lms.classes.delete',
113
+ description: 'Removes a class group by ID.',
114
+ inputSchema: {
115
+ type: 'object',
116
+ properties: {
117
+ id: { type: 'number', description: 'Class group ID' },
118
+ },
119
+ required: ['id'],
120
+ },
121
+ })
122
+ async deleteClass(args: { id: number }, _context: McpContext): Promise<any> {
123
+ return this.classGroupService.remove(args.id);
124
+ }
125
+
126
+ @McpTool({
127
+ name: 'lms.classes.people-search',
128
+ description: 'Searches for people that can be added to a class group as students.',
129
+ inputSchema: {
130
+ type: 'object',
131
+ properties: {
132
+ id: { type: 'number', description: 'Class group ID' },
133
+ q: { type: 'string', description: 'Search query (name, email)' },
134
+ },
135
+ required: ['id'],
136
+ },
137
+ readOnly: true,
138
+ })
139
+ async searchPeople(args: { id: number; q?: string }, _context: McpContext): Promise<any> {
140
+ return this.classGroupService.searchPeople(args.q ?? '', args.id);
141
+ }
142
+
143
+ @McpTool({
144
+ name: 'lms.classes.students.list',
145
+ description: 'Lists students enrolled in a class group.',
146
+ inputSchema: {
147
+ type: 'object',
148
+ properties: {
149
+ id: { type: 'number', description: 'Class group ID' },
150
+ search: { type: 'string', description: 'Search term (name, email)' },
151
+ },
152
+ required: ['id'],
153
+ },
154
+ readOnly: true,
155
+ })
156
+ async listStudents(args: { id: number; search?: string }, _context: McpContext): Promise<any> {
157
+ return this.classGroupService.listStudents(args.id, args.search);
158
+ }
159
+
160
+ @McpTool({
161
+ name: 'lms.classes.students.enroll',
162
+ description: 'Enrolls an existing person as a student in a class group.',
163
+ inputSchema: {
164
+ type: 'object',
165
+ properties: {
166
+ id: { type: 'number', description: 'Class group ID' },
167
+ personId: { type: 'number', description: 'Person ID to enroll' },
168
+ },
169
+ required: ['id', 'personId'],
170
+ },
171
+ })
172
+ async enrollStudent(args: { id: number; personId: number }, _context: McpContext): Promise<any> {
173
+ return this.classGroupService.enrollStudent(args.id, args.personId);
174
+ }
175
+
176
+ @McpTool({
177
+ name: 'lms.classes.students.enroll-new',
178
+ description: 'Creates a new person and immediately enrolls them in a class group.',
179
+ inputSchema: {
180
+ type: 'object',
181
+ properties: {
182
+ id: { type: 'number', description: 'Class group ID' },
183
+ name: { type: 'string', description: 'Student name (required)' },
184
+ email: { type: 'string', description: 'Student email' },
185
+ phone: { type: 'string', description: 'Student phone' },
186
+ department: { type: 'string', description: 'Student department' },
187
+ },
188
+ required: ['id', 'name'],
189
+ },
190
+ })
191
+ async enrollNewStudent(args: { id: number; [key: string]: any }, _context: McpContext): Promise<any> {
192
+ const { id, ...dto } = args;
193
+ return this.classGroupService.createAndEnrollStudent(id, dto as any);
194
+ }
195
+
196
+ @McpTool({
197
+ name: 'lms.classes.students.get',
198
+ description: 'Returns the profile and progress of a specific student in a class group.',
199
+ inputSchema: {
200
+ type: 'object',
201
+ properties: {
202
+ id: { type: 'number', description: 'Class group ID' },
203
+ personId: { type: 'number', description: 'Person ID' },
204
+ },
205
+ required: ['id', 'personId'],
206
+ },
207
+ readOnly: true,
208
+ })
209
+ async getStudentProfile(args: { id: number; personId: number }, _context: McpContext): Promise<any> {
210
+ return this.classGroupService.getStudentProfile(args.id, args.personId);
211
+ }
212
+
213
+ @McpTool({
214
+ name: 'lms.classes.students.update',
215
+ description: "Updates a student's profile data within a class group.",
216
+ inputSchema: {
217
+ type: 'object',
218
+ properties: {
219
+ id: { type: 'number', description: 'Class group ID' },
220
+ personId: { type: 'number', description: 'Person ID' },
221
+ name: { type: 'string', description: 'Student name' },
222
+ email: { type: 'string', description: 'Student email' },
223
+ phone: { type: 'string', description: 'Student phone' },
224
+ department: { type: 'string', description: 'Department' },
225
+ },
226
+ required: ['id', 'personId'],
227
+ },
228
+ })
229
+ async updateStudentProfile(args: { id: number; personId: number; [key: string]: any }, _context: McpContext): Promise<any> {
230
+ const { id, personId, ...dto } = args;
231
+ return this.classGroupService.updateStudentProfile(id, personId, dto as any);
232
+ }
233
+
234
+ @McpTool({
235
+ name: 'lms.classes.students.remove',
236
+ description: 'Removes a student from a class group.',
237
+ inputSchema: {
238
+ type: 'object',
239
+ properties: {
240
+ id: { type: 'number', description: 'Class group ID' },
241
+ personId: { type: 'number', description: 'Person ID to remove' },
242
+ },
243
+ required: ['id', 'personId'],
244
+ },
245
+ })
246
+ async removeStudent(args: { id: number; personId: number }, _context: McpContext): Promise<any> {
247
+ return this.classGroupService.removeStudent(args.id, args.personId);
248
+ }
249
+
250
+ @McpTool({
251
+ name: 'lms.classes.sessions.list',
252
+ description: 'Lists all sessions (classes) scheduled for a class group.',
253
+ inputSchema: {
254
+ type: 'object',
255
+ properties: {
256
+ id: { type: 'number', description: 'Class group ID' },
257
+ },
258
+ required: ['id'],
259
+ },
260
+ readOnly: true,
261
+ })
262
+ async listSessions(args: { id: number }, _context: McpContext): Promise<any> {
263
+ return this.classGroupService.listSessions(args.id);
264
+ }
265
+
266
+ @McpTool({
267
+ name: 'lms.classes.sessions.create',
268
+ description: 'Creates a new session for a class group. Supports optional recurrence.',
269
+ inputSchema: {
270
+ type: 'object',
271
+ properties: {
272
+ id: { type: 'number', description: 'Class group ID' },
273
+ title: { type: 'string', description: 'Session title (required)' },
274
+ description: { type: 'string', description: 'Session description' },
275
+ sessionDate: { type: 'string', description: 'Session date (ISO8601, required)' },
276
+ startTime: { type: 'string', description: 'Start time HH:MM (required)' },
277
+ endTime: { type: 'string', description: 'End time HH:MM (required)' },
278
+ location: { type: 'string', description: 'Physical location' },
279
+ meetingUrl: { type: 'string', description: 'Virtual meeting URL' },
280
+ color: { type: 'string', description: 'Session color hex code' },
281
+ status: { type: 'string', description: 'Status (scheduled|completed|cancelled)' },
282
+ instructorId: { type: 'number', description: 'Instructor ID' },
283
+ },
284
+ required: ['id', 'title', 'sessionDate', 'startTime', 'endTime'],
285
+ },
286
+ })
287
+ async createSession(args: { id: number; [key: string]: any }, _context: McpContext): Promise<any> {
288
+ const { id, ...dto } = args;
289
+ return this.classGroupService.createSession(id, dto as any);
290
+ }
291
+
292
+ @McpTool({
293
+ name: 'lms.classes.sessions.update',
294
+ description: 'Updates a session in a class group.',
295
+ inputSchema: {
296
+ type: 'object',
297
+ properties: {
298
+ id: { type: 'number', description: 'Class group ID' },
299
+ sessionId: { type: 'number', description: 'Session ID' },
300
+ title: { type: 'string', description: 'Session title' },
301
+ description: { type: 'string', description: 'Session description' },
302
+ sessionDate: { type: 'string', description: 'Session date (ISO8601)' },
303
+ startTime: { type: 'string', description: 'Start time HH:MM' },
304
+ endTime: { type: 'string', description: 'End time HH:MM' },
305
+ location: { type: 'string', description: 'Physical location' },
306
+ meetingUrl: { type: 'string', description: 'Virtual meeting URL' },
307
+ color: { type: 'string', description: 'Session color hex code' },
308
+ status: { type: 'string', description: 'Status (scheduled|completed|cancelled)' },
309
+ instructorId: { type: 'number', description: 'Instructor ID' },
310
+ scope: { type: 'string', description: 'Update scope for recurring sessions (single|series)' },
311
+ },
312
+ required: ['id', 'sessionId'],
313
+ },
314
+ })
315
+ async updateSession(args: { id: number; sessionId: number; [key: string]: any }, _context: McpContext): Promise<any> {
316
+ const { id, sessionId, ...dto } = args;
317
+ return this.classGroupService.updateSession(id, sessionId, dto as any);
318
+ }
319
+
320
+ @McpTool({
321
+ name: 'lms.classes.sessions.delete',
322
+ description: 'Deletes a session from a class group. For recurring sessions, use scope=series to delete all.',
323
+ inputSchema: {
324
+ type: 'object',
325
+ properties: {
326
+ id: { type: 'number', description: 'Class group ID' },
327
+ sessionId: { type: 'number', description: 'Session ID' },
328
+ scope: { type: 'string', description: 'Delete scope for recurring sessions (single|series, default: single)' },
329
+ },
330
+ required: ['id', 'sessionId'],
331
+ },
332
+ })
333
+ async deleteSession(args: { id: number; sessionId: number; scope?: string }, _context: McpContext): Promise<any> {
334
+ return this.classGroupService.deleteSession(args.id, args.sessionId, args.scope as any);
335
+ }
336
+
337
+ @McpTool({
338
+ name: 'lms.classes.sessions.attendance.get',
339
+ description: 'Returns the attendance list for a specific session in a class group.',
340
+ inputSchema: {
341
+ type: 'object',
342
+ properties: {
343
+ id: { type: 'number', description: 'Class group ID' },
344
+ sessionId: { type: 'number', description: 'Session ID' },
345
+ },
346
+ required: ['id', 'sessionId'],
347
+ },
348
+ readOnly: true,
349
+ })
350
+ async getAttendance(args: { id: number; sessionId: number }, _context: McpContext): Promise<any> {
351
+ return this.classGroupService.getAttendance(args.id, args.sessionId);
352
+ }
353
+
354
+ @McpTool({
355
+ name: 'lms.classes.sessions.attendance.save',
356
+ description: 'Saves attendance records for a session.',
357
+ inputSchema: {
358
+ type: 'object',
359
+ properties: {
360
+ id: { type: 'number', description: 'Class group ID' },
361
+ sessionId: { type: 'number', description: 'Session ID' },
362
+ attendance: {
363
+ type: 'array',
364
+ description: 'Attendance records',
365
+ items: {
366
+ type: 'object',
367
+ properties: {
368
+ personId: { type: 'number', description: 'Person ID' },
369
+ present: { type: 'boolean', description: 'Whether the person was present' },
370
+ },
371
+ },
372
+ },
373
+ },
374
+ required: ['id', 'sessionId', 'attendance'],
375
+ },
376
+ })
377
+ async saveAttendance(args: { id: number; sessionId: number; attendance: any[] }, _context: McpContext): Promise<any> {
378
+ return this.classGroupService.saveAttendance(args.id, args.sessionId, args.attendance);
379
+ }
380
+
381
+ @McpTool({
382
+ name: 'lms.classes.materials.list',
383
+ description: 'Lists materials for a class group, optionally filtered by session.',
384
+ inputSchema: {
385
+ type: 'object',
386
+ properties: {
387
+ id: { type: 'number', description: 'Class group ID' },
388
+ sessionId: { type: 'number', description: 'Filter by session ID (optional)' },
389
+ },
390
+ required: ['id'],
391
+ },
392
+ readOnly: true,
393
+ })
394
+ async listMaterials(args: { id: number; sessionId?: number }, _context: McpContext): Promise<any> {
395
+ return this.classGroupService.listMaterials(args.id, args.sessionId);
396
+ }
397
+
398
+ @McpTool({
399
+ name: 'lms.classes.materials.create',
400
+ description: 'Creates a new material (link) for a class group.',
401
+ inputSchema: {
402
+ type: 'object',
403
+ properties: {
404
+ id: { type: 'number', description: 'Class group ID' },
405
+ title: { type: 'string', description: 'Material title (required)' },
406
+ description: { type: 'string', description: 'Material description' },
407
+ type: { type: 'string', description: 'Material type (required)' },
408
+ url: { type: 'string', description: 'Material URL' },
409
+ fileId: { type: 'number', description: 'File ID for uploaded materials' },
410
+ sessionId: { type: 'number', description: 'Associate with a specific session' },
411
+ },
412
+ required: ['id', 'title', 'type'],
413
+ },
414
+ })
415
+ async createMaterial(args: { id: number; [key: string]: any }, _context: McpContext): Promise<any> {
416
+ const { id, ...dto } = args;
417
+ return this.classGroupService.createMaterial(id, dto as any);
418
+ }
419
+
420
+ @McpTool({
421
+ name: 'lms.classes.materials.delete',
422
+ description: 'Deletes a material from a class group.',
423
+ inputSchema: {
424
+ type: 'object',
425
+ properties: {
426
+ id: { type: 'number', description: 'Class group ID' },
427
+ materialId: { type: 'number', description: 'Material ID' },
428
+ },
429
+ required: ['id', 'materialId'],
430
+ },
431
+ })
432
+ async deleteMaterial(args: { id: number; materialId: number }, _context: McpContext): Promise<any> {
433
+ return this.classGroupService.deleteMaterial(args.id, args.materialId);
434
+ }
435
+ }
@@ -1,12 +1,13 @@
1
1
  import { PrismaModule } from '@hed-hog/api-prisma';
2
2
  import { forwardRef, Module } from '@nestjs/common';
3
3
  import { ClassGroupController } from './class-group.controller';
4
+ import { LmsClassGroupMcpTools } from './class-group.mcp-tools';
4
5
  import { ClassGroupService } from './class-group.service';
5
6
 
6
7
  @Module({
7
8
  imports: [forwardRef(() => PrismaModule)],
8
9
  controllers: [ClassGroupController],
9
- providers: [ClassGroupService],
10
+ providers: [ClassGroupService, LmsClassGroupMcpTools],
10
11
  exports: [forwardRef(() => ClassGroupService)],
11
12
  })
12
13
  export class ClassGroupModule {}
@@ -1,9 +1,12 @@
1
1
  import { PrismaService } from '@hed-hog/api-prisma';
2
+ import { IntegrationDeveloperApiService } from '@hed-hog/core';
2
3
  import {
3
4
  BadRequestException,
4
5
  ConflictException,
6
+ Inject,
5
7
  Injectable,
6
8
  NotFoundException,
9
+ forwardRef,
7
10
  } from '@nestjs/common';
8
11
  import { Prisma } from '@prisma/client';
9
12
  import { PrismaClientKnownRequestError } from '@prisma/client/runtime/library';
@@ -55,7 +58,11 @@ export class ClassGroupService {
55
58
  'SA',
56
59
  ];
57
60
 
58
- constructor(private readonly prisma: PrismaService) {}
61
+ constructor(
62
+ private readonly prisma: PrismaService,
63
+ @Inject(forwardRef(() => IntegrationDeveloperApiService))
64
+ private readonly integrationApi: IntegrationDeveloperApiService,
65
+ ) {}
59
66
 
60
67
  private isEmailCode(code?: string | null) {
61
68
  return (code ?? '').toLowerCase() === 'email';
@@ -316,6 +323,14 @@ export class ClassGroupService {
316
323
  return createdClass;
317
324
  });
318
325
 
326
+ await this.integrationApi.publishEvent({
327
+ eventName: 'lms.class_group.created',
328
+ sourceModule: 'lms',
329
+ aggregateType: 'class_group',
330
+ aggregateId: String(created.id),
331
+ payload: { id: created.id, name: created.title ?? created.code, courseId: created.course_id, status: created.status },
332
+ }).catch(() => null);
333
+
319
334
  return this.mapClassGroup(created);
320
335
  } catch (error) {
321
336
  this.handlePrismaError(error);
@@ -414,6 +429,14 @@ export class ClassGroupService {
414
429
  return updatedClass;
415
430
  });
416
431
 
432
+ await this.integrationApi.publishEvent({
433
+ eventName: 'lms.class_group.updated',
434
+ sourceModule: 'lms',
435
+ aggregateType: 'class_group',
436
+ aggregateId: String(id),
437
+ payload: { id, name: dto.title, status: dto.status },
438
+ }).catch(() => null);
439
+
417
440
  return this.mapClassGroup(updated);
418
441
  } catch (error) {
419
442
  this.handlePrismaError(error);
@@ -422,6 +445,15 @@ export class ClassGroupService {
422
445
 
423
446
  async remove(id: number) {
424
447
  await this.prisma.course_class_group.delete({ where: { id } });
448
+
449
+ await this.integrationApi.publishEvent({
450
+ eventName: 'lms.class_group.deleted',
451
+ sourceModule: 'lms',
452
+ aggregateType: 'class_group',
453
+ aggregateId: String(id),
454
+ payload: { id },
455
+ }).catch(() => null);
456
+
425
457
  return { success: true };
426
458
  }
427
459
 
@@ -780,6 +812,15 @@ export class ClassGroupService {
780
812
  },
781
813
  });
782
814
  await this.ensureEnterpriseStudent(classGroupId, personId);
815
+
816
+ await this.integrationApi.publishEvent({
817
+ eventName: 'lms.class_group.student.enrolled',
818
+ sourceModule: 'lms',
819
+ aggregateType: 'class_group',
820
+ aggregateId: String(classGroupId),
821
+ payload: { classGroupId, courseId: group.course_id, personId, enrollmentId: enrollment.id },
822
+ }).catch(() => null);
823
+
783
824
  return enrollment;
784
825
  }
785
826
 
@@ -935,6 +976,15 @@ export class ClassGroupService {
935
976
  where: { id: enrollment.id },
936
977
  data: { status: 'cancelled' },
937
978
  });
979
+
980
+ await this.integrationApi.publishEvent({
981
+ eventName: 'lms.class_group.student.removed',
982
+ sourceModule: 'lms',
983
+ aggregateType: 'class_group',
984
+ aggregateId: String(classGroupId),
985
+ payload: { classGroupId, personId, enrollmentId: enrollment.id },
986
+ }).catch(() => null);
987
+
938
988
  return { success: true };
939
989
  }
940
990