@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.
- package/README.md +321 -206
- 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
|
|
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
|
-
-
|
|
26
|
-
-
|
|
27
|
-
-
|
|
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
|
-
-
|
|
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
|
|
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
|
|
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
|
|
47
|
+
- **Colunas:**
|
|
48
|
+
- `id` (PK)
|
|
47
49
|
- `verification_code` (varchar 50, único): código para verificação do certificado.
|
|
48
|
-
- `student_id` (
|
|
49
|
-
- `course_enrollment_id` (
|
|
50
|
-
- `
|
|
51
|
-
- `
|
|
52
|
-
- `
|
|
53
|
-
- `
|
|
54
|
-
- `
|
|
55
|
-
- `
|
|
56
|
-
-
|
|
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
|
|
63
|
-
- `
|
|
64
|
-
- `
|
|
65
|
-
- `
|
|
66
|
-
- `
|
|
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
|
|
73
|
-
- `
|
|
74
|
-
- `
|
|
75
|
-
- `
|
|
76
|
-
- `
|
|
77
|
-
- `
|
|
78
|
-
-
|
|
79
|
-
- `
|
|
80
|
-
- `
|
|
81
|
-
- `
|
|
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
|
|
88
|
-
- `
|
|
89
|
-
- `
|
|
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
|
|
96
|
-
- `
|
|
97
|
-
- `
|
|
98
|
-
- `
|
|
99
|
-
- `
|
|
100
|
-
- `
|
|
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
|
|
107
|
-
- `
|
|
108
|
-
- `
|
|
109
|
-
- `
|
|
110
|
-
- `
|
|
111
|
-
- `
|
|
112
|
-
-
|
|
113
|
-
- `
|
|
114
|
-
- `
|
|
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
|
|
121
|
-
- `
|
|
122
|
-
- `
|
|
123
|
-
- `
|
|
124
|
-
-
|
|
125
|
-
- `
|
|
126
|
-
- `
|
|
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
|
|
133
|
-
- `
|
|
134
|
-
- `
|
|
135
|
-
- `
|
|
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
|
|
142
|
-
- `
|
|
143
|
-
- `
|
|
144
|
-
- `
|
|
145
|
-
- `
|
|
146
|
-
-
|
|
147
|
-
- `
|
|
148
|
-
- `
|
|
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
|
|
155
|
-
- `
|
|
156
|
-
- `
|
|
157
|
-
- `
|
|
158
|
-
- `
|
|
159
|
-
- `
|
|
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
|
|
166
|
-
- `
|
|
167
|
-
- `
|
|
168
|
-
- `
|
|
169
|
-
- `
|
|
170
|
-
- `
|
|
171
|
-
- `
|
|
172
|
-
- `
|
|
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
|
|
179
|
-
- `
|
|
180
|
-
- `
|
|
181
|
-
- `
|
|
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
|
|
188
|
-
- `
|
|
189
|
-
- `
|
|
190
|
-
- `
|
|
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
|
|
197
|
-
- `
|
|
198
|
-
- `
|
|
199
|
-
- `
|
|
200
|
-
- `
|
|
201
|
-
- `
|
|
202
|
-
-
|
|
203
|
-
- `
|
|
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
|
|
210
|
-
- `
|
|
211
|
-
- `
|
|
212
|
-
- `
|
|
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
|
|
219
|
-
- `
|
|
220
|
-
- `
|
|
221
|
-
- `
|
|
222
|
-
- `
|
|
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
|
|
229
|
-
- `
|
|
230
|
-
- `
|
|
231
|
-
-
|
|
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
|
|
238
|
-
- `
|
|
239
|
-
- `
|
|
240
|
-
- `
|
|
241
|
-
- `
|
|
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
|
|
248
|
-
- `
|
|
249
|
-
- `
|
|
250
|
-
-
|
|
251
|
-
- `
|
|
252
|
-
- `
|
|
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
|
|
259
|
-
-
|
|
260
|
-
- `
|
|
261
|
-
- `
|
|
262
|
-
- `
|
|
263
|
-
-
|
|
264
|
-
-
|
|
265
|
-
- `
|
|
266
|
-
-
|
|
267
|
-
-
|
|
268
|
-
-
|
|
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
|
|
274
|
-
- `
|
|
275
|
-
- `
|
|
276
|
-
- `
|
|
277
|
-
- `
|
|
278
|
-
- `
|
|
279
|
-
- `
|
|
280
|
-
- `
|
|
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
|
|
287
|
-
- `
|
|
288
|
-
- `
|
|
289
|
-
- `
|
|
290
|
-
- `
|
|
291
|
-
-
|
|
292
|
-
- `
|
|
293
|
-
- `
|
|
294
|
-
- `
|
|
295
|
-
- `
|
|
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
|
|
302
|
-
- `
|
|
303
|
-
- `
|
|
304
|
-
- `
|
|
305
|
-
- `
|
|
306
|
-
- `
|
|
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
|
|
313
|
-
- `
|
|
314
|
-
- `
|
|
315
|
-
- `
|
|
316
|
-
- `
|
|
317
|
-
- `
|
|
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
|
|
324
|
-
- `
|
|
325
|
-
- `
|
|
326
|
-
- `
|
|
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
|
|
333
|
-
- `
|
|
334
|
-
-
|
|
335
|
-
- `
|
|
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
|
|
342
|
-
- `
|
|
343
|
-
- `
|
|
344
|
-
- `
|
|
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
|
|
351
|
-
- `
|
|
352
|
-
- `
|
|
353
|
-
- `
|
|
354
|
-
- `
|
|
355
|
-
- `
|
|
356
|
-
-
|
|
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
|
|
363
|
-
- `
|
|
364
|
-
- `
|
|
365
|
-
- `
|
|
366
|
-
- `
|
|
367
|
-
-
|
|
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
|
|
374
|
-
- `
|
|
375
|
-
- `
|
|
376
|
-
- `
|
|
377
|
-
- `
|
|
378
|
-
- `
|
|
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
|
|
385
|
-
- `
|
|
386
|
-
- `
|
|
387
|
-
-
|
|
388
|
-
- `
|
|
389
|
-
- `
|
|
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
|
|
396
|
-
- `
|
|
397
|
-
- `
|
|
398
|
-
- `
|
|
399
|
-
- `
|
|
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.
|
|
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/
|
|
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/
|
|
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/
|
|
19
|
-
"@hed-hog/
|
|
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
|
".": {
|