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