@hed-hog/lms 0.0.274 → 0.0.275

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 +321 -206
  2. package/package.json +8 -8
package/README.md CHANGED
@@ -1,3 +1,4 @@
1
+ ```markdown
1
2
  # @hed-hog/lms
2
3
 
3
4
  ## 1. Visão geral do módulo
@@ -18,24 +19,24 @@ O módulo `@hed-hog/lms` é responsável pela gestão do sistema de Learning Man
18
19
 
19
20
  ## 3. Endpoints
20
21
 
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
+ > **Nota:** O código fonte fornecido não expõe endpoints REST ou GraphQL diretamente. Este módulo é consumido via serviços internos ou APIs do HedHog que integram com o LMS.
22
23
 
23
24
  ## 4. Regras de autenticação e autorização
24
25
 
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.
26
+ - Existe o papel (`role`) `admin-lms` com permissão total para gestão do LMS.
27
+ - Autenticação e autorização são gerenciadas externamente, utilizando o papel `admin-lms` para operações administrativas.
28
+ - Regras específicas de acesso devem ser implementadas conforme a integração com o sistema de autenticação do HedHog.
28
29
 
29
30
  ## 5. Estruturas de request/response
30
31
 
31
32
  - 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
+ - Operações são realizadas via serviços internos ou APIs que consomem este módulo.
33
34
 
34
35
  ## 6. Erros comuns
35
36
 
36
- - **Violação de integridade referencial:** ao tentar inserir ou atualizar registros com chaves estrangeiras inválidas.
37
+ - **Violação de integridade referencial:** ao inserir ou atualizar registros com chaves estrangeiras inválidas.
37
38
  - **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
+ - **Status inválidos:** ao definir valores fora dos enums para status de cursos, exames, matrículas, etc.
39
40
  - **Campos obrigatórios ausentes:** como títulos, slugs e chaves primárias.
40
41
 
41
42
  ## 7. Banco de dados (tabelas YAML)
@@ -43,360 +44,473 @@ O módulo `@hed-hog/lms` é responsável pela gestão do sistema de Learning Man
43
44
  ### certificate
44
45
 
45
46
  - **Finalidade:** Armazena certificados emitidos para estudantes em cursos, exames, grupos de aulas ou trilhas de aprendizagem.
46
- - **Colunas principais:**
47
+ - **Colunas:**
48
+ - `id` (PK)
47
49
  - `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`.
50
+ - `student_id` (FK para `person.id`, onDelete CASCADE): estudante que recebeu o certificado.
51
+ - `course_enrollment_id` (FK opcional para `course_enrollment.id`, onDelete SET NULL)
52
+ - `course_id` (FK opcional para `course.id`, onDelete SET NULL)
53
+ - `exam_id` (FK opcional para `exam.id`, onDelete SET NULL)
54
+ - `course_class_group_id` (FK opcional para `course_class_group.id`, onDelete SET NULL)
55
+ - `learning_path_id` (FK opcional para `learning_path.id`, onDelete SET NULL)
56
+ - `certificate_template_id` (FK para `certificate_template.id`)
57
+ - `certificate_type` (enum: `course`, `exam`, `course_class_group`, `learning_path`)
58
+ - `student_name` (varchar 255)
59
+ - `course_name` (varchar 255)
60
+ - `workload_hours` (int)
61
+ - `issued_at` (datetime)
62
+ - `completed_at` (datetime)
63
+ - `final_score` (int, nullable)
64
+ - `verification_url` (varchar 500, nullable)
65
+ - `pdf_url` (varchar 500, nullable)
66
+ - `created_at`, `updated_at`
57
67
  - **Índices:** único em `verification_code`.
58
68
 
59
69
  ### certificate_template
60
70
 
61
71
  - **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`).
72
+ - **Colunas:**
73
+ - `id` (PK)
74
+ - `name` (varchar 255)
75
+ - `slug` (varchar 255, único)
76
+ - `description` (text, nullable)
77
+ - `template_content` (text)
78
+ - `status` (enum: `draft`, `active`, `inactive`, default `draft`)
79
+ - `created_at`, `updated_at`
67
80
  - **Índices:** único em `slug`.
68
81
 
69
82
  ### course
70
83
 
71
84
  - **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).
85
+ - **Colunas:**
86
+ - `id` (PK)
87
+ - `title` (varchar 255)
88
+ - `slug` (varchar 255, único)
89
+ - `description` (text, nullable)
90
+ - `short_description` (varchar 500, nullable)
91
+ - `level` (enum: `beginner`, `intermediate`, `advanced`, default `beginner`)
92
+ - `duration_hours` (int, default 0)
93
+ - `status` (enum: `draft`, `published`, `archived`, default `draft`)
94
+ - `primary_color`, `primary_contrast_color`, `secondary_color`, `secondary_contrast_color` (varchar 9, nullable)
95
+ - `certificate_workload` (int, nullable)
96
+ - `certificate_template_id` (FK opcional para `certificate_template.id`, onDelete SET NULL)
97
+ - `requirements`, `objectives`, `target_audience` (text, nullable)
98
+ - `created_at`, `updated_at`
82
99
  - **Índices:** único em `slug`.
83
100
 
84
101
  ### course_category
85
102
 
86
103
  - **Finalidade:** Associação entre cursos e categorias.
87
- - **Colunas principais:**
88
- - `course_id` (fk).
89
- - `category_id` (fk).
104
+ - **Colunas:**
105
+ - `id` (PK)
106
+ - `course_id` (FK para `course.id`, onDelete CASCADE)
107
+ - `category_id` (FK para `category.id`, onDelete CASCADE)
108
+ - `created_at`, `updated_at`
90
109
  - **Índices:** único em combinação `course_id` + `category_id`.
91
110
 
92
111
  ### course_class_attendance
93
112
 
94
113
  - **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).
114
+ - **Colunas:**
115
+ - `id` (PK)
116
+ - `course_class_session_id` (FK para `course_class_session.id`, onDelete CASCADE)
117
+ - `student_id` (FK para `person.id`, onDelete CASCADE)
118
+ - `present` (boolean, default false)
119
+ - `justification` (text, nullable)
120
+ - `recorded_by_id` (FK opcional para `person.id`, onDelete SET NULL)
121
+ - `created_at`, `updated_at`
101
122
  - **Índices:** único em combinação `course_class_session_id` + `student_id`.
102
123
 
103
124
  ### course_class_group
104
125
 
105
126
  - **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).
127
+ - **Colunas:**
128
+ - `id` (PK)
129
+ - `course_id` (FK para `course.id`, onDelete CASCADE)
130
+ - `title` (varchar 255)
131
+ - `code` (varchar 50, único)
132
+ - `description` (text, nullable)
133
+ - `delivery_mode` (enum: `presential`, `online`, `hybrid`)
134
+ - `status` (enum: `open`, `ongoing`, `completed`, `cancelled`, default `open`)
135
+ - `start_date` (datetime)
136
+ - `end_date` (datetime, nullable)
137
+ - `start_time` (varchar 5, nullable)
138
+ - `end_time` (varchar 5, nullable)
139
+ - `week_days` (text, nullable)
140
+ - `capacity` (int, default 30)
141
+ - `location` (text, nullable)
142
+ - `virtual_room_url` (varchar 500, nullable)
143
+ - `created_at`, `updated_at`
115
144
  - **Índices:** único em `code`.
116
145
 
117
146
  ### course_class_session
118
147
 
119
148
  - **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`).
149
+ - **Colunas:**
150
+ - `id` (PK)
151
+ - `course_class_group_id` (FK para `course_class_group.id`, onDelete CASCADE)
152
+ - `title` (varchar 255)
153
+ - `description` (text, nullable)
154
+ - `session_date` (datetime)
155
+ - `start_time` (varchar 5)
156
+ - `end_time` (varchar 5)
157
+ - `location` (text, nullable)
158
+ - `meeting_url` (varchar 500, nullable)
159
+ - `status` (enum: `scheduled`, `completed`, `cancelled`, default `scheduled`)
160
+ - `created_at`, `updated_at`
127
161
  - **Índices:** combinação `course_class_group_id` + `session_date`.
128
162
 
129
163
  ### course_class_session_instructor
130
164
 
131
165
  - **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`).
166
+ - **Colunas:**
167
+ - `id` (PK)
168
+ - `course_class_session_id` (FK para `course_class_session.id`, onDelete CASCADE)
169
+ - `instructor_id` (FK para `instructor.id`, onDelete CASCADE)
170
+ - `role` (enum: `lead`, `assistant`, default `assistant`)
171
+ - `created_at`, `updated_at`
136
172
  - **Índices:** único em combinação `course_class_session_id` + `instructor_id`.
137
173
 
138
174
  ### course_enrollment
139
175
 
140
176
  - **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).
177
+ - **Colunas:**
178
+ - `id` (PK)
179
+ - `person_id` (FK para `person.id`, onDelete CASCADE)
180
+ - `course_class_group_id` (FK opcional para `course_class_group.id`, onDelete SET NULL)
181
+ - `course_id` (FK para `course.id`, onDelete CASCADE)
182
+ - `status` (enum: `pending`, `active`, `completed`, `cancelled`, `paused`, default `active`)
183
+ - `enrolled_at` (datetime)
184
+ - `completed_at` (datetime, nullable)
185
+ - `progress_percent` (int, default 0)
186
+ - `final_score` (int, nullable)
187
+ - `created_at`, `updated_at`
149
188
  - **Índices:** único em combinação `person_id` + `course_class_group_id`.
150
189
 
151
190
  ### course_image
152
191
 
153
192
  - **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).
193
+ - **Colunas:**
194
+ - `id` (PK)
195
+ - `course_id` (FK para `course.id`, onDelete CASCADE)
196
+ - `file_id` (FK para `file.id`, onDelete CASCADE)
197
+ - `image_type_id` (FK para `image_type.id`, onDelete CASCADE)
198
+ - `order` (int)
199
+ - `is_primary` (boolean, default false)
200
+ - `created_at`, `updated_at`
160
201
  - **Índices:** único em combinação `course_id` + `image_type_id` + `order`.
161
202
 
162
203
  ### course_lesson
163
204
 
164
205
  - **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).
206
+ - **Colunas:**
207
+ - `id` (PK)
208
+ - `course_module_id` (FK para `course_module.id`, onDelete CASCADE)
209
+ - `title` (varchar 255)
210
+ - `description` (text, nullable)
211
+ - `type` (enum: `video`, `text`, `quiz`, default `video`)
212
+ - `content` (text, nullable)
213
+ - `duration_seconds` (int, default 0)
214
+ - `order` (int)
215
+ - `is_released` (boolean, default true)
216
+ - `created_at`, `updated_at`
173
217
  - **Índices:** único em combinação `course_module_id` + `order`.
174
218
 
175
219
  ### course_lesson_file
176
220
 
177
221
  - **Finalidade:** Arquivos vinculados a aulas.
178
- - **Colunas principais:**
179
- - `course_lesson_id` (fk).
180
- - `file_id` (fk opcional).
181
- - `title` (varchar).
222
+ - **Colunas:**
223
+ - `id` (PK)
224
+ - `course_lesson_id` (FK para `course_lesson.id`, onDelete CASCADE)
225
+ - `file_id` (FK opcional para `file.id`, onDelete SET NULL)
226
+ - `title` (varchar 255)
227
+ - `created_at`, `updated_at`
182
228
  - **Índices:** em `course_lesson_id`.
183
229
 
184
230
  ### course_lesson_instructor
185
231
 
186
232
  - **Finalidade:** Instrutores vinculados a aulas.
187
- - **Colunas principais:**
188
- - `course_lesson_id` (fk).
189
- - `instructor_id` (fk).
190
- - `role` (enum): `lead`, `assistant` (default `assistant`).
233
+ - **Colunas:**
234
+ - `id` (PK)
235
+ - `course_lesson_id` (FK para `course_lesson.id`, onDelete CASCADE)
236
+ - `instructor_id` (FK para `instructor.id`, onDelete CASCADE)
237
+ - `role` (enum: `lead`, `assistant`, default `assistant`)
238
+ - `created_at`, `updated_at`
191
239
  - **Índices:** único em combinação `course_lesson_id` + `instructor_id`.
192
240
 
193
241
  ### course_lesson_progress
194
242
 
195
243
  - **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).
244
+ - **Colunas:**
245
+ - `id` (PK)
246
+ - `course_enrollment_id` (FK para `course_enrollment.id`, onDelete CASCADE)
247
+ - `course_lesson_id` (FK para `course_lesson.id`, onDelete CASCADE)
248
+ - `status` (enum: `not_started`, `in_progress`, `completed`, default `not_started`)
249
+ - `progress_percent` (int, default 0)
250
+ - `video_progress_seconds` (int, default 0)
251
+ - `started_at` (datetime, nullable)
252
+ - `completed_at` (datetime, nullable)
253
+ - `time_spent_seconds` (int, default 0)
254
+ - `created_at`, `updated_at`
204
255
  - **Índices:** único em combinação `course_enrollment_id` + `course_lesson_id`.
205
256
 
206
257
  ### course_lesson_question
207
258
 
208
259
  - **Finalidade:** Questões associadas a aulas do tipo quiz.
209
- - **Colunas principais:**
210
- - `course_lesson_id` (fk).
211
- - `question_id` (fk).
212
- - `order` (int).
260
+ - **Colunas:**
261
+ - `id` (PK)
262
+ - `course_lesson_id` (FK para `course_lesson.id`, onDelete CASCADE)
263
+ - `question_id` (FK para `question.id`, onDelete CASCADE)
264
+ - `order` (int)
265
+ - `created_at`, `updated_at`
213
266
  - **Índices:** únicos em combinações `course_lesson_id` + `question_id` e `course_lesson_id` + `order`.
214
267
 
215
268
  ### course_module
216
269
 
217
270
  - **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).
271
+ - **Colunas:**
272
+ - `id` (PK)
273
+ - `course_id` (FK para `course.id`, onDelete CASCADE)
274
+ - `title` (varchar 255)
275
+ - `description` (text, nullable)
276
+ - `order` (int)
277
+ - `duration_minutes` (int, default 0)
278
+ - `created_at`, `updated_at`
223
279
  - **Índices:** único em combinação `course_id` + `order`.
224
280
 
225
281
  ### course_prerequisite
226
282
 
227
283
  - **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.
284
+ - **Colunas:**
285
+ - `id` (PK)
286
+ - `course_id` (FK para `course.id`, onDelete CASCADE)
287
+ - `prerequisite_type` (enum: `course`, `learning_path`, `exam`, default `course`)
288
+ - `prerequisite_course_id` (FK opcional para `course.id`, onDelete CASCADE)
289
+ - `prerequisite_learning_path_id` (FK opcional para `learning_path.id`, onDelete CASCADE)
290
+ - `prerequisite_exam_id` (FK opcional para `exam.id`, onDelete CASCADE)
291
+ - `created_at`, `updated_at`
232
292
  - **Índices:** únicos para combinações de curso e pré-requisitos.
233
293
 
234
294
  ### evaluation_rating
235
295
 
236
296
  - **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).
297
+ - **Colunas:**
298
+ - `id` (PK)
299
+ - `evaluation_topic_id` (FK para `evaluation_topic.id`, onDelete CASCADE)
300
+ - `evaluator_id` (FK opcional para `person.id`, onDelete SET NULL)
301
+ - `score` (decimal 2,1)
302
+ - `comment` (text, nullable)
303
+ - `created_at`, `updated_at`
242
304
  - **Índices:** único em combinação `evaluation_topic_id` + `evaluator_id`.
243
305
 
244
306
  ### evaluation_topic
245
307
 
246
308
  - **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).
309
+ - **Colunas:**
310
+ - `id` (PK)
311
+ - `name` (varchar 255)
312
+ - `description` (text, nullable)
313
+ - `target_type` (enum: `course`, `course_lesson`, `course_class_session`, `question`, `exam`)
314
+ - `course_id` (FK opcional para `course.id`, onDelete SET NULL)
315
+ - `course_lesson_id` (FK opcional para `course_lesson.id`, onDelete SET NULL)
316
+ - `course_class_session_id` (FK opcional para `course_class_session.id`, onDelete SET NULL)
317
+ - `question_id` (FK opcional para `question.id`, onDelete SET NULL)
318
+ - `exam_id` (FK opcional para `exam.id`, onDelete SET NULL)
319
+ - `order` (int)
320
+ - `is_active` (boolean, default true)
321
+ - `created_at`, `updated_at`
253
322
  - **Índices:** únicos para combinações de alvo e ordem.
254
323
 
255
324
  ### exam
256
325
 
257
326
  - **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.
327
+ - **Colunas:**
328
+ - `id` (PK)
329
+ - `course_id` (FK opcional para `course.id`, onDelete SET NULL)
330
+ - `course_class_group_id` (FK opcional para `course_class_group.id`, onDelete SET NULL)
331
+ - `title` (varchar 255)
332
+ - `description` (text, nullable)
333
+ - `instructions` (text, nullable)
334
+ - `exam_type` (enum: `quiz`, `test`, `assignment`, `project`)
335
+ - `status` (enum: `draft`, `published`, `closed`, `archived`, default `draft`)
336
+ - `primary_color`, `primary_contrast_color`, `secondary_color`, `secondary_contrast_color` (varchar 9, nullable)
337
+ - `starts_at` (datetime, nullable)
338
+ - `ends_at` (datetime, nullable)
339
+ - `time_limit_minutes` (int, nullable)
340
+ - `attempts_allowed` (int, default 1)
341
+ - `min_score` (int, default 60)
342
+ - `max_score` (int, default 100)
343
+ - `shuffle_questions` (boolean, default false)
344
+ - `shuffle_options` (boolean, default false)
345
+ - `show_result` (boolean, default true)
346
+ - `show_answer_key` (boolean, default false)
347
+ - `show_explanation_after_answer` (boolean, default false)
348
+ - `require_all_questions_answered_to_finish` (boolean, default false)
349
+ - `created_at`, `updated_at`
350
+ - **Índices:** em `course_id`, `course_class_group_id` e `status`.
269
351
 
270
352
  ### exam_answer
271
353
 
272
354
  - **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).
355
+ - **Colunas:**
356
+ - `id` (PK)
357
+ - `exam_attempt_id` (FK para `exam_attempt.id`, onDelete CASCADE)
358
+ - `question_id` (FK para `question.id`, onDelete CASCADE)
359
+ - `exam_option_id` (FK opcional para `exam_option.id`, onDelete SET NULL)
360
+ - `answer_text` (text, nullable)
361
+ - `is_correct` (boolean, nullable)
362
+ - `points_awarded` (int, default 0)
363
+ - `teacher_feedback` (text, nullable)
364
+ - `created_at`, `updated_at`
281
365
  - **Índices:** único em combinação `exam_attempt_id` + `question_id`.
282
366
 
283
367
  ### exam_attempt
284
368
 
285
369
  - **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).
370
+ - **Colunas:**
371
+ - `id` (PK)
372
+ - `exam_id` (FK para `exam.id`, onDelete CASCADE)
373
+ - `student_id` (FK para `person.id`, onDelete CASCADE)
374
+ - `course_enrollment_id` (FK opcional para `course_enrollment.id`, onDelete SET NULL)
375
+ - `attempt_number` (int, default 1)
376
+ - `started_at` (datetime)
377
+ - `finished_at` (datetime, nullable)
378
+ - `duration_seconds` (int, nullable)
379
+ - `score` (int, nullable)
380
+ - `status` (enum: `in_progress`, `completed`, `abandoned`, `voided`, default `in_progress`)
381
+ - `ip_address` (varchar 45, nullable)
382
+ - `created_at`, `updated_at`
296
383
  - **Índices:** único em combinação `exam_id` + `student_id` + `attempt_number`.
297
384
 
298
385
  ### exam_image
299
386
 
300
387
  - **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).
388
+ - **Colunas:**
389
+ - `id` (PK)
390
+ - `exam_id` (FK para `exam.id`, onDelete CASCADE)
391
+ - `file_id` (FK para `file.id`, onDelete CASCADE)
392
+ - `image_type_id` (FK para `image_type.id`, onDelete CASCADE)
393
+ - `order` (int)
394
+ - `is_primary` (boolean, default false)
395
+ - `created_at`, `updated_at`
307
396
  - **Índices:** único em combinação `exam_id` + `image_type_id` + `order`.
308
397
 
309
398
  ### exam_option
310
399
 
311
400
  - **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).
401
+ - **Colunas:**
402
+ - `id` (PK)
403
+ - `question_id` (FK para `question.id`, onDelete CASCADE)
404
+ - `option_text` (text)
405
+ - `is_correct` (boolean, default false)
406
+ - `position` (int, default 0)
407
+ - `feedback` (text, nullable)
408
+ - `created_at`, `updated_at`
318
409
  - **Índices:** único em combinação `question_id` + `position`.
319
410
 
320
411
  ### exam_question
321
412
 
322
413
  - **Finalidade:** Questões associadas a exames.
323
- - **Colunas principais:**
324
- - `exam_id` (fk).
325
- - `question_id` (fk).
326
- - `order` (int).
414
+ - **Colunas:**
415
+ - `id` (PK)
416
+ - `exam_id` (FK para `exam.id`, onDelete CASCADE)
417
+ - `question_id` (FK para `question.id`, onDelete CASCADE)
418
+ - `order` (int)
419
+ - `created_at`, `updated_at`
327
420
  - **Índices:** únicos em combinações `exam_id` + `question_id` e `exam_id` + `order`.
328
421
 
329
422
  ### image_type
330
423
 
331
424
  - **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`).
425
+ - **Colunas:**
426
+ - `id` (PK)
427
+ - `name` (varchar 100)
428
+ - `slug` (varchar 100, único)
429
+ - `applies_to_course` (boolean, default false)
430
+ - `applies_to_exam` (boolean, default false)
431
+ - `applies_to_learning_path` (boolean, default false)
432
+ - `status` (enum: `active`, `inactive`, default `active`)
433
+ - `created_at`, `updated_at`
336
434
  - **Índices:** único em `slug`.
337
435
 
338
436
  ### instructor
339
437
 
340
438
  - **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).
439
+ - **Colunas:**
440
+ - `id` (PK)
441
+ - `person_id` (FK único para `person.id`, onDelete CASCADE)
442
+ - `status` (enum: `active`, `inactive`, default `active`)
443
+ - `can_teach_courses` (boolean, default true)
444
+ - `created_at`, `updated_at`
345
445
  - **Índices:** único em `person_id`.
346
446
 
347
447
  ### learning_path
348
448
 
349
449
  - **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.
450
+ - **Colunas:**
451
+ - `id` (PK)
452
+ - `title` (varchar 255)
453
+ - `slug` (varchar 255, único)
454
+ - `description` (text, nullable)
455
+ - `short_description` (varchar 500, nullable)
456
+ - `level` (enum: `beginner`, `intermediate`, `advanced`, default `beginner`)
457
+ - `duration_hours` (int, default 0)
458
+ - `status` (enum: `draft`, `active`, `archived`, default `draft`)
459
+ - `primary_color`, `primary_contrast_color`, `secondary_color`, `secondary_contrast_color` (varchar 9, nullable)
460
+ - `created_at`, `updated_at`
357
461
  - **Índices:** único em `slug`.
358
462
 
359
463
  ### learning_path_enrollment
360
464
 
361
465
  - **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.
466
+ - **Colunas:**
467
+ - `id` (PK)
468
+ - `learning_path_id` (FK para `learning_path.id`, onDelete CASCADE)
469
+ - `person_id` (FK para `person.id`, onDelete CASCADE)
470
+ - `status` (enum: `active`, `completed`, `cancelled`, default `active`)
471
+ - `progress_percent` (int, default 0)
472
+ - `enrolled_at` (datetime)
473
+ - `completed_at` (datetime, nullable)
474
+ - `created_at`, `updated_at`
368
475
  - **Índices:** único em combinação `learning_path_id` + `person_id`.
369
476
 
370
477
  ### learning_path_image
371
478
 
372
479
  - **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).
480
+ - **Colunas:**
481
+ - `id` (PK)
482
+ - `learning_path_id` (FK para `learning_path.id`, onDelete CASCADE)
483
+ - `file_id` (FK para `file.id`, onDelete CASCADE)
484
+ - `image_type_id` (FK para `image_type.id`, onDelete CASCADE)
485
+ - `order` (int)
486
+ - `is_primary` (boolean, default false)
487
+ - `created_at`, `updated_at`
379
488
  - **Índices:** único em combinação `learning_path_id` + `image_type_id` + `order`.
380
489
 
381
490
  ### learning_path_step
382
491
 
383
492
  - **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).
493
+ - **Colunas:**
494
+ - `id` (PK)
495
+ - `learning_path_id` (FK para `learning_path.id`, onDelete CASCADE)
496
+ - `step_type` (enum: `course`, `exam`)
497
+ - `course_id` (FK opcional para `course.id`, onDelete CASCADE)
498
+ - `exam_id` (FK opcional para `exam.id`, onDelete CASCADE)
499
+ - `order` (int)
500
+ - `is_required` (boolean, default true)
501
+ - `created_at`, `updated_at`
390
502
  - **Índices:** únicos para combinações de trilha e ordem, curso ou exame.
391
503
 
392
504
  ### question
393
505
 
394
506
  - **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).
507
+ - **Colunas:**
508
+ - `id` (PK)
509
+ - `question_type` (enum: `multiple_choice`, `true_false`, `essay`, `fill_blank`, `matching`)
510
+ - `statement` (text)
511
+ - `explanation` (text, nullable)
512
+ - `points` (int, default 1)
513
+ - `created_at`, `updated_at`
400
514
 
401
515
  ## 8. Regras de negócio relevantes
402
516
 
@@ -485,3 +599,4 @@ const certificado = await prisma.certificate.create({
485
599
  ---
486
600
 
487
601
  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`.
602
+ ```
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hed-hog/lms",
3
- "version": "0.0.274",
3
+ "version": "0.0.275",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "dependencies": {
@@ -9,15 +9,15 @@
9
9
  "@nestjs/core": "^11",
10
10
  "@nestjs/jwt": "^11",
11
11
  "@nestjs/mapped-types": "*",
12
- "@hed-hog/api-pagination": "0.0.6",
13
- "@hed-hog/core": "0.0.274",
12
+ "@hed-hog/core": "0.0.275",
14
13
  "@hed-hog/api": "0.0.4",
15
- "@hed-hog/api-locale": "0.0.13",
16
- "@hed-hog/finance": "0.0.274",
14
+ "@hed-hog/finance": "0.0.275",
17
15
  "@hed-hog/api-types": "0.0.1",
18
- "@hed-hog/contact": "0.0.274",
19
- "@hed-hog/category": "0.0.274",
20
- "@hed-hog/api-prisma": "0.0.5"
16
+ "@hed-hog/api-pagination": "0.0.6",
17
+ "@hed-hog/contact": "0.0.275",
18
+ "@hed-hog/api-prisma": "0.0.5",
19
+ "@hed-hog/api-locale": "0.0.13",
20
+ "@hed-hog/category": "0.0.275"
21
21
  },
22
22
  "exports": {
23
23
  ".": {