@hed-hog/lms 0.0.274 → 0.0.276

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