@hed-hog/lms 0.0.270 → 0.0.274

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 (2) hide show
  1. package/README.md +487 -0
  2. package/package.json +5 -5
package/README.md ADDED
@@ -0,0 +1,487 @@
1
+ # @hed-hog/lms
2
+
3
+ ## 1. Visão geral do módulo
4
+
5
+ O módulo `@hed-hog/lms` é responsável pela gestão do sistema de Learning Management System (LMS) dentro do monorepo HedHog. Ele oferece funcionalidades para gerenciamento de cursos, aulas, avaliações, certificados, matrículas, instrutores, trilhas de aprendizagem e demais componentes relacionados ao ambiente educacional digital.
6
+
7
+ ## 2. Escopo e responsabilidades
8
+
9
+ - Gerenciamento de cursos, módulos, aulas e suas respectivas estruturas.
10
+ - Controle de matrículas em cursos e trilhas de aprendizagem.
11
+ - Administração de avaliações, tentativas e respostas.
12
+ - Emissão e verificação de certificados.
13
+ - Gestão de instrutores e suas atribuições.
14
+ - Controle de presenças em aulas presenciais ou online.
15
+ - Organização de trilhas de aprendizagem e seus passos.
16
+ - Suporte a imagens e arquivos relacionados a cursos, exames e trilhas.
17
+ - Avaliações e feedbacks sobre tópicos específicos do LMS.
18
+
19
+ ## 3. Endpoints
20
+
21
+ > **Nota:** O código fonte fornecido não expõe endpoints REST ou GraphQL diretamente. Este README documenta as tabelas e estruturas de dados do módulo LMS. Para uso via API, consulte a documentação específica da API que consome este módulo.
22
+
23
+ ## 4. Regras de autenticação e autorização
24
+
25
+ - O módulo define um papel (`role`) chamado `admin-lms` com permissão total para gestão do LMS.
26
+ - A autenticação e autorização devem ser gerenciadas externamente, utilizando o papel `admin-lms` para operações administrativas.
27
+ - Outras regras específicas de acesso devem ser implementadas conforme a integração com o sistema de autenticação do HedHog.
28
+
29
+ ## 5. Estruturas de request/response
30
+
31
+ - Não aplicável diretamente, pois o módulo não expõe endpoints REST no código fornecido.
32
+ - As operações devem ser realizadas via serviços internos ou APIs que consumam este módulo.
33
+
34
+ ## 6. Erros comuns
35
+
36
+ - **Violação de integridade referencial:** ao tentar inserir ou atualizar registros com chaves estrangeiras inválidas.
37
+ - **Duplicidade de registros únicos:** como códigos únicos de certificado, slugs de cursos ou templates.
38
+ - **Status inválidos:** ao tentar definir valores fora dos enums definidos para status de cursos, exames, matrículas, etc.
39
+ - **Campos obrigatórios ausentes:** como títulos, slugs e chaves primárias.
40
+
41
+ ## 7. Banco de dados (tabelas YAML)
42
+
43
+ ### certificate
44
+
45
+ - **Finalidade:** Armazena certificados emitidos para estudantes em cursos, exames, grupos de aulas ou trilhas de aprendizagem.
46
+ - **Colunas principais:**
47
+ - `verification_code` (varchar 50, único): código para verificação do certificado.
48
+ - `student_id` (fk para person): estudante que recebeu o certificado.
49
+ - `course_enrollment_id` (fk opcional): matrícula relacionada.
50
+ - `certificate_type` (enum): tipo do certificado (`course`, `exam`, `course_class_group`, `learning_path`).
51
+ - `student_name`, `course_name` (varchar 255): nomes para exibição.
52
+ - `workload_hours` (int): carga horária.
53
+ - `issued_at`, `completed_at` (datetime): datas relevantes.
54
+ - `final_score` (int opcional): nota final.
55
+ - `verification_url`, `pdf_url` (varchar 500 opcionais): URLs para verificação e PDF.
56
+ - **Integridade:** chaves estrangeiras com ações `CASCADE` ou `SET NULL`.
57
+ - **Índices:** único em `verification_code`.
58
+
59
+ ### certificate_template
60
+
61
+ - **Finalidade:** Modelos de certificados para emissão.
62
+ - **Colunas principais:**
63
+ - `name`, `slug` (varchar 255, slug único).
64
+ - `description` (texto opcional).
65
+ - `template_content` (texto): conteúdo do template.
66
+ - `status` (enum): `draft`, `active`, `inactive` (default `draft`).
67
+ - **Índices:** único em `slug`.
68
+
69
+ ### course
70
+
71
+ - **Finalidade:** Cursos disponíveis no LMS.
72
+ - **Colunas principais:**
73
+ - `title`, `slug` (varchar 255, slug único).
74
+ - `description`, `short_description` (texto e varchar 500 opcionais).
75
+ - `level` (enum): `beginner`, `intermediate`, `advanced` (default `beginner`).
76
+ - `duration_hours` (int, default 0).
77
+ - `status` (enum): `draft`, `published`, `archived` (default `draft`).
78
+ - Cores primárias e secundárias para personalização visual.
79
+ - `certificate_workload` (int opcional).
80
+ - `certificate_template_id` (fk opcional).
81
+ - `requirements`, `objectives`, `target_audience` (texto opcionais).
82
+ - **Índices:** único em `slug`.
83
+
84
+ ### course_category
85
+
86
+ - **Finalidade:** Associação entre cursos e categorias.
87
+ - **Colunas principais:**
88
+ - `course_id` (fk).
89
+ - `category_id` (fk).
90
+ - **Índices:** único em combinação `course_id` + `category_id`.
91
+
92
+ ### course_class_attendance
93
+
94
+ - **Finalidade:** Registro de presença dos estudantes em sessões de aula.
95
+ - **Colunas principais:**
96
+ - `course_class_session_id` (fk).
97
+ - `student_id` (fk).
98
+ - `present` (boolean, default false).
99
+ - `justification` (texto opcional).
100
+ - `recorded_by_id` (fk opcional).
101
+ - **Índices:** único em combinação `course_class_session_id` + `student_id`.
102
+
103
+ ### course_class_group
104
+
105
+ - **Finalidade:** Grupos de aulas de um curso.
106
+ - **Colunas principais:**
107
+ - `course_id` (fk).
108
+ - `title`, `code` (varchar, código único).
109
+ - `description` (texto opcional).
110
+ - `delivery_mode` (enum): `presential`, `online`, `hybrid`.
111
+ - `status` (enum): `open`, `ongoing`, `completed`, `cancelled` (default `open`).
112
+ - Datas e horários de início e fim.
113
+ - `capacity` (int, default 30).
114
+ - `location`, `virtual_room_url` (texto e varchar 500 opcionais).
115
+ - **Índices:** único em `code`.
116
+
117
+ ### course_class_session
118
+
119
+ - **Finalidade:** Sessões específicas dentro de um grupo de aula.
120
+ - **Colunas principais:**
121
+ - `course_class_group_id` (fk).
122
+ - `title`, `description` (varchar e texto opcional).
123
+ - `session_date` (datetime).
124
+ - Horários de início e fim.
125
+ - `location`, `meeting_url` (texto e varchar 500 opcionais).
126
+ - `status` (enum): `scheduled`, `completed`, `cancelled` (default `scheduled`).
127
+ - **Índices:** combinação `course_class_group_id` + `session_date`.
128
+
129
+ ### course_class_session_instructor
130
+
131
+ - **Finalidade:** Instrutores vinculados a sessões de aula.
132
+ - **Colunas principais:**
133
+ - `course_class_session_id` (fk).
134
+ - `instructor_id` (fk).
135
+ - `role` (enum): `lead`, `assistant` (default `assistant`).
136
+ - **Índices:** único em combinação `course_class_session_id` + `instructor_id`.
137
+
138
+ ### course_enrollment
139
+
140
+ - **Finalidade:** Matrículas de pessoas em cursos ou grupos de aula.
141
+ - **Colunas principais:**
142
+ - `person_id` (fk).
143
+ - `course_class_group_id` (fk opcional).
144
+ - `course_id` (fk).
145
+ - `status` (enum): `pending`, `active`, `completed`, `cancelled`, `paused` (default `active`).
146
+ - Datas de matrícula e conclusão.
147
+ - `progress_percent` (int, default 0).
148
+ - `final_score` (int opcional).
149
+ - **Índices:** único em combinação `person_id` + `course_class_group_id`.
150
+
151
+ ### course_image
152
+
153
+ - **Finalidade:** Imagens associadas a cursos.
154
+ - **Colunas principais:**
155
+ - `course_id` (fk).
156
+ - `file_id` (fk).
157
+ - `image_type_id` (fk).
158
+ - `order` (int).
159
+ - `is_primary` (boolean, default false).
160
+ - **Índices:** único em combinação `course_id` + `image_type_id` + `order`.
161
+
162
+ ### course_lesson
163
+
164
+ - **Finalidade:** Aulas dentro de módulos de curso.
165
+ - **Colunas principais:**
166
+ - `course_module_id` (fk).
167
+ - `title`, `description` (varchar e texto opcional).
168
+ - `type` (enum): `video`, `text`, `quiz` (default `video`).
169
+ - `content` (texto opcional).
170
+ - `duration_seconds` (int, default 0).
171
+ - `order` (int).
172
+ - `is_released` (boolean, default true).
173
+ - **Índices:** único em combinação `course_module_id` + `order`.
174
+
175
+ ### course_lesson_file
176
+
177
+ - **Finalidade:** Arquivos vinculados a aulas.
178
+ - **Colunas principais:**
179
+ - `course_lesson_id` (fk).
180
+ - `file_id` (fk opcional).
181
+ - `title` (varchar).
182
+ - **Índices:** em `course_lesson_id`.
183
+
184
+ ### course_lesson_instructor
185
+
186
+ - **Finalidade:** Instrutores vinculados a aulas.
187
+ - **Colunas principais:**
188
+ - `course_lesson_id` (fk).
189
+ - `instructor_id` (fk).
190
+ - `role` (enum): `lead`, `assistant` (default `assistant`).
191
+ - **Índices:** único em combinação `course_lesson_id` + `instructor_id`.
192
+
193
+ ### course_lesson_progress
194
+
195
+ - **Finalidade:** Progresso dos estudantes em aulas.
196
+ - **Colunas principais:**
197
+ - `course_enrollment_id` (fk).
198
+ - `course_lesson_id` (fk).
199
+ - `status` (enum): `not_started`, `in_progress`, `completed` (default `not_started`).
200
+ - `progress_percent` (int, default 0).
201
+ - `video_progress_seconds` (int, default 0).
202
+ - Datas de início e conclusão.
203
+ - `time_spent_seconds` (int, default 0).
204
+ - **Índices:** único em combinação `course_enrollment_id` + `course_lesson_id`.
205
+
206
+ ### course_lesson_question
207
+
208
+ - **Finalidade:** Questões associadas a aulas do tipo quiz.
209
+ - **Colunas principais:**
210
+ - `course_lesson_id` (fk).
211
+ - `question_id` (fk).
212
+ - `order` (int).
213
+ - **Índices:** únicos em combinações `course_lesson_id` + `question_id` e `course_lesson_id` + `order`.
214
+
215
+ ### course_module
216
+
217
+ - **Finalidade:** Módulos dentro de cursos.
218
+ - **Colunas principais:**
219
+ - `course_id` (fk).
220
+ - `title`, `description` (varchar e texto opcional).
221
+ - `order` (int).
222
+ - `duration_minutes` (int, default 0).
223
+ - **Índices:** único em combinação `course_id` + `order`.
224
+
225
+ ### course_prerequisite
226
+
227
+ - **Finalidade:** Pré-requisitos para cursos.
228
+ - **Colunas principais:**
229
+ - `course_id` (fk).
230
+ - `prerequisite_type` (enum): `course`, `learning_path`, `exam` (default `course`).
231
+ - FK para curso, trilha ou exame conforme tipo.
232
+ - **Índices:** únicos para combinações de curso e pré-requisitos.
233
+
234
+ ### evaluation_rating
235
+
236
+ - **Finalidade:** Avaliações e notas dadas a tópicos de avaliação.
237
+ - **Colunas principais:**
238
+ - `evaluation_topic_id` (fk).
239
+ - `evaluator_id` (fk opcional).
240
+ - `score` (decimal 2,1).
241
+ - `comment` (texto opcional).
242
+ - **Índices:** único em combinação `evaluation_topic_id` + `evaluator_id`.
243
+
244
+ ### evaluation_topic
245
+
246
+ - **Finalidade:** Tópicos para avaliação dentro do LMS.
247
+ - **Colunas principais:**
248
+ - `name`, `description` (varchar e texto opcional).
249
+ - `target_type` (enum): `course`, `course_lesson`, `course_class_session`, `question`, `exam`.
250
+ - FK opcionais para entidades alvo.
251
+ - `order` (int).
252
+ - `is_active` (boolean, default true).
253
+ - **Índices:** únicos para combinações de alvo e ordem.
254
+
255
+ ### exam
256
+
257
+ - **Finalidade:** Exames vinculados a cursos ou grupos de aula.
258
+ - **Colunas principais:**
259
+ - FK para curso e grupo de aula (opcionais).
260
+ - `title`, `description`, `instructions` (varchar e textos opcionais).
261
+ - `exam_type` (enum): `quiz`, `test`, `assignment`, `project`.
262
+ - `status` (enum): `draft`, `published`, `closed`, `archived` (default `draft`).
263
+ - Cores para personalização.
264
+ - Datas de início e fim, limite de tempo.
265
+ - `attempts_allowed` (int, default 1).
266
+ - Notas mínima e máxima.
267
+ - Flags para embaralhamento e exibição de resultados.
268
+ - **Índices:** em curso, grupo e status.
269
+
270
+ ### exam_answer
271
+
272
+ - **Finalidade:** Respostas dadas em tentativas de exame.
273
+ - **Colunas principais:**
274
+ - `exam_attempt_id` (fk).
275
+ - `question_id` (fk).
276
+ - `exam_option_id` (fk opcional).
277
+ - `answer_text` (texto opcional).
278
+ - `is_correct` (boolean opcional).
279
+ - `points_awarded` (int, default 0).
280
+ - `teacher_feedback` (texto opcional).
281
+ - **Índices:** único em combinação `exam_attempt_id` + `question_id`.
282
+
283
+ ### exam_attempt
284
+
285
+ - **Finalidade:** Tentativas de realização de exames por estudantes.
286
+ - **Colunas principais:**
287
+ - `exam_id` (fk).
288
+ - `student_id` (fk).
289
+ - `course_enrollment_id` (fk opcional).
290
+ - `attempt_number` (int, default 1).
291
+ - Datas de início e fim.
292
+ - `duration_seconds` (int opcional).
293
+ - `score` (int opcional).
294
+ - `status` (enum): `in_progress`, `completed`, `abandoned`, `voided` (default `in_progress`).
295
+ - `ip_address` (varchar 45 opcional).
296
+ - **Índices:** único em combinação `exam_id` + `student_id` + `attempt_number`.
297
+
298
+ ### exam_image
299
+
300
+ - **Finalidade:** Imagens associadas a exames.
301
+ - **Colunas principais:**
302
+ - `exam_id` (fk).
303
+ - `file_id` (fk).
304
+ - `image_type_id` (fk).
305
+ - `order` (int).
306
+ - `is_primary` (boolean, default false).
307
+ - **Índices:** único em combinação `exam_id` + `image_type_id` + `order`.
308
+
309
+ ### exam_option
310
+
311
+ - **Finalidade:** Opções de resposta para questões de exame.
312
+ - **Colunas principais:**
313
+ - `question_id` (fk).
314
+ - `option_text` (texto).
315
+ - `is_correct` (boolean, default false).
316
+ - `position` (int, default 0).
317
+ - `feedback` (texto opcional).
318
+ - **Índices:** único em combinação `question_id` + `position`.
319
+
320
+ ### exam_question
321
+
322
+ - **Finalidade:** Questões associadas a exames.
323
+ - **Colunas principais:**
324
+ - `exam_id` (fk).
325
+ - `question_id` (fk).
326
+ - `order` (int).
327
+ - **Índices:** únicos em combinações `exam_id` + `question_id` e `exam_id` + `order`.
328
+
329
+ ### image_type
330
+
331
+ - **Finalidade:** Tipos de imagens aplicáveis a cursos, exames e trilhas.
332
+ - **Colunas principais:**
333
+ - `name`, `slug` (varchar 100, slug único).
334
+ - Flags para aplicação em curso, exame e trilha.
335
+ - `status` (enum): `active`, `inactive` (default `active`).
336
+ - **Índices:** único em `slug`.
337
+
338
+ ### instructor
339
+
340
+ - **Finalidade:** Instrutores cadastrados no LMS.
341
+ - **Colunas principais:**
342
+ - `person_id` (fk único).
343
+ - `status` (enum): `active`, `inactive` (default `active`).
344
+ - `can_teach_courses` (boolean, default true).
345
+ - **Índices:** único em `person_id`.
346
+
347
+ ### learning_path
348
+
349
+ - **Finalidade:** Trilhas de aprendizagem compostas por cursos e exames.
350
+ - **Colunas principais:**
351
+ - `title`, `slug` (varchar 255, slug único).
352
+ - `description`, `short_description` (texto e varchar 500 opcionais).
353
+ - `level` (enum): `beginner`, `intermediate`, `advanced` (default `beginner`).
354
+ - `duration_hours` (int, default 0).
355
+ - `status` (enum): `draft`, `active`, `archived` (default `draft`).
356
+ - Cores para personalização.
357
+ - **Índices:** único em `slug`.
358
+
359
+ ### learning_path_enrollment
360
+
361
+ - **Finalidade:** Matrículas em trilhas de aprendizagem.
362
+ - **Colunas principais:**
363
+ - `learning_path_id` (fk).
364
+ - `person_id` (fk).
365
+ - `status` (enum): `active`, `completed`, `cancelled` (default `active`).
366
+ - `progress_percent` (int, default 0).
367
+ - Datas de matrícula e conclusão.
368
+ - **Índices:** único em combinação `learning_path_id` + `person_id`.
369
+
370
+ ### learning_path_image
371
+
372
+ - **Finalidade:** Imagens associadas a trilhas de aprendizagem.
373
+ - **Colunas principais:**
374
+ - `learning_path_id` (fk).
375
+ - `file_id` (fk).
376
+ - `image_type_id` (fk).
377
+ - `order` (int).
378
+ - `is_primary` (boolean, default false).
379
+ - **Índices:** único em combinação `learning_path_id` + `image_type_id` + `order`.
380
+
381
+ ### learning_path_step
382
+
383
+ - **Finalidade:** Passos dentro de uma trilha, podendo ser cursos ou exames.
384
+ - **Colunas principais:**
385
+ - `learning_path_id` (fk).
386
+ - `step_type` (enum): `course`, `exam`.
387
+ - FK para curso ou exame conforme tipo.
388
+ - `order` (int).
389
+ - `is_required` (boolean, default true).
390
+ - **Índices:** únicos para combinações de trilha e ordem, curso ou exame.
391
+
392
+ ### question
393
+
394
+ - **Finalidade:** Questões para avaliações e quizzes.
395
+ - **Colunas principais:**
396
+ - `question_type` (enum): `multiple_choice`, `true_false`, `essay`, `fill_blank`, `matching`.
397
+ - `statement` (texto).
398
+ - `explanation` (texto opcional).
399
+ - `points` (int, default 1).
400
+
401
+ ## 8. Regras de negócio relevantes
402
+
403
+ - Certificados são vinculados a estudantes e podem estar associados a diferentes tipos de atividades (curso, exame, grupo de aula, trilha).
404
+ - Cursos, exames e trilhas possuem status que controlam sua visibilidade e disponibilidade.
405
+ - Matrículas e inscrições possuem status que refletem o progresso e situação do aluno.
406
+ - Avaliações e tentativas de exame são controladas para permitir múltiplas tentativas e registrar resultados detalhados.
407
+ - Instrutores podem ter papéis distintos (líder ou assistente) em aulas e sessões.
408
+ - Trilhas de aprendizagem são compostas por passos ordenados que podem ser cursos ou exames, podendo ser obrigatórios ou opcionais.
409
+ - Progresso em aulas e cursos é monitorado para permitir acompanhamento detalhado do aluno.
410
+ - Imagens e arquivos são organizados por tipo e podem ser marcados como primários para exibição.
411
+
412
+ ## 9. Guia rápido de uso (exemplos)
413
+
414
+ > Como o módulo não expõe endpoints diretamente, o uso típico envolve integração via serviços internos ou APIs do HedHog.
415
+
416
+ ### Exemplo: Criar um novo curso
417
+
418
+ ```ts
419
+ const novoCurso = await prisma.course.create({
420
+ data: {
421
+ title: 'Introdução ao HedHog LMS',
422
+ slug: 'introducao-hedhog-lms',
423
+ description: 'Curso básico para entender o LMS HedHog',
424
+ level: 'beginner',
425
+ duration_hours: 10,
426
+ status: 'draft',
427
+ },
428
+ });
429
+ ```
430
+
431
+ ### Exemplo: Matricular um estudante em um curso
432
+
433
+ ```ts
434
+ const matricula = await prisma.course_enrollment.create({
435
+ data: {
436
+ person_id: estudanteId,
437
+ course_id: cursoId,
438
+ status: 'active',
439
+ enrolled_at: new Date(),
440
+ },
441
+ });
442
+ ```
443
+
444
+ ### Exemplo: Registrar presença em uma sessão de aula
445
+
446
+ ```ts
447
+ const presenca = await prisma.course_class_attendance.upsert({
448
+ where: {
449
+ course_class_session_id_student_id: {
450
+ course_class_session_id: sessaoId,
451
+ student_id: estudanteId,
452
+ },
453
+ },
454
+ update: { present: true },
455
+ create: {
456
+ course_class_session_id: sessaoId,
457
+ student_id: estudanteId,
458
+ present: true,
459
+ },
460
+ });
461
+ ```
462
+
463
+ ### Exemplo: Emitir um certificado
464
+
465
+ ```ts
466
+ const certificado = await prisma.certificate.create({
467
+ data: {
468
+ verification_code: gerarCodigoUnico(),
469
+ student_id: estudanteId,
470
+ course_id: cursoId,
471
+ certificate_template_id: templateId,
472
+ certificate_type: 'course',
473
+ student_name: nomeEstudante,
474
+ course_name: nomeCurso,
475
+ workload_hours: cargaHoraria,
476
+ issued_at: new Date(),
477
+ completed_at: dataConclusao,
478
+ final_score: notaFinal,
479
+ verification_url: urlVerificacao,
480
+ pdf_url: urlPdf,
481
+ },
482
+ });
483
+ ```
484
+
485
+ ---
486
+
487
+ Para mais detalhes sobre integração e uso, consulte a documentação geral do HedHog e os serviços que consomem o módulo `@hed-hog/lms`.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hed-hog/lms",
3
- "version": "0.0.270",
3
+ "version": "0.0.274",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "dependencies": {
@@ -10,13 +10,13 @@
10
10
  "@nestjs/jwt": "^11",
11
11
  "@nestjs/mapped-types": "*",
12
12
  "@hed-hog/api-pagination": "0.0.6",
13
- "@hed-hog/core": "0.0.270",
13
+ "@hed-hog/core": "0.0.274",
14
14
  "@hed-hog/api": "0.0.4",
15
15
  "@hed-hog/api-locale": "0.0.13",
16
+ "@hed-hog/finance": "0.0.274",
16
17
  "@hed-hog/api-types": "0.0.1",
17
- "@hed-hog/finance": "0.0.270",
18
- "@hed-hog/contact": "0.0.270",
19
- "@hed-hog/category": "0.0.270",
18
+ "@hed-hog/contact": "0.0.274",
19
+ "@hed-hog/category": "0.0.274",
20
20
  "@hed-hog/api-prisma": "0.0.5"
21
21
  },
22
22
  "exports": {