@hed-hog/lms 0.0.365 → 0.0.366

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