@hed-hog/lms 0.0.331 → 0.0.347

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 (135) hide show
  1. package/dist/class-group/class-group.controller.d.ts +8 -8
  2. package/dist/class-group/class-group.service.d.ts +8 -8
  3. package/dist/course/course.controller.d.ts +6 -1
  4. package/dist/course/course.controller.d.ts.map +1 -1
  5. package/dist/course/course.controller.js +19 -2
  6. package/dist/course/course.controller.js.map +1 -1
  7. package/dist/course/course.service.d.ts +6 -0
  8. package/dist/course/course.service.d.ts.map +1 -1
  9. package/dist/course/course.service.js +63 -28
  10. package/dist/course/course.service.js.map +1 -1
  11. package/dist/course/dto/create-course.dto.d.ts +1 -0
  12. package/dist/course/dto/create-course.dto.d.ts.map +1 -1
  13. package/dist/course/dto/create-course.dto.js +5 -0
  14. package/dist/course/dto/create-course.dto.js.map +1 -1
  15. package/dist/enterprise/enterprise.controller.d.ts +84 -12
  16. package/dist/enterprise/enterprise.controller.d.ts.map +1 -1
  17. package/dist/enterprise/enterprise.controller.js +10 -0
  18. package/dist/enterprise/enterprise.controller.js.map +1 -1
  19. package/dist/enterprise/enterprise.service.d.ts +90 -12
  20. package/dist/enterprise/enterprise.service.d.ts.map +1 -1
  21. package/dist/enterprise/enterprise.service.js +413 -40
  22. package/dist/enterprise/enterprise.service.js.map +1 -1
  23. package/dist/enterprise/training/training-admin.controller.d.ts +9 -6
  24. package/dist/enterprise/training/training-admin.controller.d.ts.map +1 -1
  25. package/dist/enterprise/training/training-admin.controller.js +10 -6
  26. package/dist/enterprise/training/training-admin.controller.js.map +1 -1
  27. package/dist/enterprise/training/training-admin.service.d.ts +11 -5
  28. package/dist/enterprise/training/training-admin.service.d.ts.map +1 -1
  29. package/dist/enterprise/training/training-admin.service.js +108 -52
  30. package/dist/enterprise/training/training-admin.service.js.map +1 -1
  31. package/dist/enterprise/training/training-viewer.controller.d.ts +3 -0
  32. package/dist/enterprise/training/training-viewer.controller.d.ts.map +1 -1
  33. package/dist/evaluation/evaluation.controller.d.ts +2 -2
  34. package/dist/evaluation/evaluation.service.d.ts +2 -2
  35. package/dist/instructor/dto/create-instructor-skill.dto.d.ts +0 -4
  36. package/dist/instructor/dto/create-instructor-skill.dto.d.ts.map +1 -1
  37. package/dist/instructor/dto/create-instructor-skill.dto.js +0 -21
  38. package/dist/instructor/dto/create-instructor-skill.dto.js.map +1 -1
  39. package/dist/instructor/dto/update-instructor-skill.dto.d.ts +0 -4
  40. package/dist/instructor/dto/update-instructor-skill.dto.d.ts.map +1 -1
  41. package/dist/instructor/dto/update-instructor-skill.dto.js +0 -22
  42. package/dist/instructor/dto/update-instructor-skill.dto.js.map +1 -1
  43. package/dist/instructor/instructor-skill.controller.d.ts +4 -4
  44. package/dist/instructor/instructor-skill.service.d.ts +4 -7
  45. package/dist/instructor/instructor-skill.service.d.ts.map +1 -1
  46. package/dist/instructor/instructor-skill.service.js +2 -89
  47. package/dist/instructor/instructor-skill.service.js.map +1 -1
  48. package/dist/instructor/instructor.controller.d.ts +21 -0
  49. package/dist/instructor/instructor.controller.d.ts.map +1 -1
  50. package/dist/instructor/instructor.controller.js +19 -0
  51. package/dist/instructor/instructor.controller.js.map +1 -1
  52. package/dist/instructor/instructor.service.d.ts +27 -0
  53. package/dist/instructor/instructor.service.d.ts.map +1 -1
  54. package/dist/instructor/instructor.service.js +79 -25
  55. package/dist/instructor/instructor.service.js.map +1 -1
  56. package/dist/lms.module.d.ts.map +1 -1
  57. package/dist/lms.module.js.map +1 -1
  58. package/dist/training/dto/create-training.dto.d.ts +1 -0
  59. package/dist/training/dto/create-training.dto.d.ts.map +1 -1
  60. package/dist/training/dto/create-training.dto.js +5 -0
  61. package/dist/training/dto/create-training.dto.js.map +1 -1
  62. package/dist/training/training.controller.d.ts +4 -0
  63. package/dist/training/training.controller.d.ts.map +1 -1
  64. package/dist/training/training.service.d.ts +8 -0
  65. package/dist/training/training.service.d.ts.map +1 -1
  66. package/dist/training/training.service.js +71 -6
  67. package/dist/training/training.service.js.map +1 -1
  68. package/hedhog/data/route.yaml +23 -1
  69. package/hedhog/frontend/app/_components/class-form-sheet.tsx.ejs +80 -33
  70. package/hedhog/frontend/app/_components/course-form-sheet.tsx.ejs +3 -3
  71. package/hedhog/frontend/app/_components/create-lms-instructor-sheet.tsx.ejs +591 -0
  72. package/hedhog/frontend/app/certificates/issued/page.tsx.ejs +6 -1
  73. package/hedhog/frontend/app/certificates/models/page.tsx.ejs +39 -7
  74. package/hedhog/frontend/app/classes/[id]/page.tsx.ejs +1 -3
  75. package/hedhog/frontend/app/classes/page.tsx.ejs +34 -7
  76. package/hedhog/frontend/app/courses/[id]/_components/CourseClassificationCard.tsx.ejs +3 -33
  77. package/hedhog/frontend/app/courses/[id]/_components/CourseContentCard.tsx.ejs +9 -9
  78. package/hedhog/frontend/app/courses/[id]/_components/CourseMainInfoCard.tsx.ejs +109 -0
  79. package/hedhog/frontend/app/courses/[id]/_components/CourseMultiEntityPicker.tsx.ejs +40 -13
  80. package/hedhog/frontend/app/courses/[id]/_components/CourseRelationsCard.tsx.ejs +76 -81
  81. package/hedhog/frontend/app/courses/[id]/_components/CourseSummaryCard.tsx.ejs +60 -0
  82. package/hedhog/frontend/app/courses/[id]/structure/_components/course-scheduled-classes-tab.tsx.ejs +406 -0
  83. package/hedhog/frontend/app/courses/[id]/structure/_components/course-tree.tsx.ejs +134 -0
  84. package/hedhog/frontend/app/courses/[id]/structure/_components/detail-course.tsx.ejs +113 -0
  85. package/hedhog/frontend/app/courses/[id]/structure/_components/detail-lesson.tsx.ejs +314 -0
  86. package/hedhog/frontend/app/courses/[id]/structure/_components/detail-session.tsx.ejs +174 -0
  87. package/hedhog/frontend/app/courses/[id]/structure/_components/editor-course.tsx.ejs +243 -34
  88. package/hedhog/frontend/app/courses/[id]/structure/_components/mock-data.ts.ejs +185 -0
  89. package/hedhog/frontend/app/courses/page.tsx.ejs +6 -1
  90. package/hedhog/frontend/app/enterprise/_components/enterprise-activity-timeline.tsx.ejs +87 -0
  91. package/hedhog/frontend/app/enterprise/_components/enterprise-admin-create-sheet.tsx.ejs +4 -0
  92. package/hedhog/frontend/app/enterprise/_components/enterprise-administrators-tab.tsx.ejs +31 -5
  93. package/hedhog/frontend/app/enterprise/_components/enterprise-classes-tab.tsx.ejs +79 -20
  94. package/hedhog/frontend/app/enterprise/_components/enterprise-company-identity-card.tsx.ejs +11 -2
  95. package/hedhog/frontend/app/enterprise/_components/enterprise-course-edit-sheet.tsx.ejs +201 -0
  96. package/hedhog/frontend/app/enterprise/_components/enterprise-courses-tab.tsx.ejs +55 -24
  97. package/hedhog/frontend/app/enterprise/_components/enterprise-detail-sheet.tsx.ejs +430 -296
  98. package/hedhog/frontend/app/enterprise/_components/enterprise-mocks.ts.ejs +277 -0
  99. package/hedhog/frontend/app/enterprise/_components/enterprise-overview-analytics.tsx.ejs +205 -0
  100. package/hedhog/frontend/app/enterprise/_components/enterprise-person-edit-sheet.tsx.ejs +97 -0
  101. package/hedhog/frontend/app/enterprise/_components/enterprise-sheet.tsx.ejs +82 -57
  102. package/hedhog/frontend/app/enterprise/_components/enterprise-student-create-sheet.tsx.ejs +4 -0
  103. package/hedhog/frontend/app/enterprise/_components/enterprise-students-tab.tsx.ejs +60 -22
  104. package/hedhog/frontend/app/enterprise/_components/enterprise-types.ts.ejs +54 -0
  105. package/hedhog/frontend/app/enterprise/_components/enterprise-user-create-sheet.tsx.ejs +211 -0
  106. package/hedhog/frontend/app/enterprise/page.tsx.ejs +39 -7
  107. package/hedhog/frontend/app/exams/[id]/questions/page.tsx.ejs +31 -19
  108. package/hedhog/frontend/app/exams/page.tsx.ejs +6 -1
  109. package/hedhog/frontend/app/instructor-skills/page.tsx.ejs +51 -104
  110. package/hedhog/frontend/app/instructors/_components/instructor-form-sheet.tsx.ejs +625 -366
  111. package/hedhog/frontend/app/instructors/page.tsx.ejs +6 -1
  112. package/hedhog/frontend/app/paths/page.tsx.ejs +76 -8
  113. package/hedhog/frontend/app/reports/evaluations/page.tsx.ejs +6 -1
  114. package/hedhog/frontend/app/training/page.tsx.ejs +78 -9
  115. package/hedhog/frontend/messages/en.json +101 -10
  116. package/hedhog/frontend/messages/pt.json +115 -11
  117. package/hedhog/table/enterprise_student_license_event.yaml +30 -0
  118. package/hedhog/table/instructor_skill.yaml +0 -11
  119. package/hedhog/table/learning_path.yaml +4 -0
  120. package/package.json +6 -6
  121. package/src/course/course.controller.ts +18 -0
  122. package/src/course/course.service.ts +85 -26
  123. package/src/course/dto/create-course.dto.ts +4 -0
  124. package/src/enterprise/enterprise.controller.ts +5 -0
  125. package/src/enterprise/enterprise.service.ts +507 -29
  126. package/src/enterprise/training/training-admin.controller.ts +4 -0
  127. package/src/enterprise/training/training-admin.service.ts +115 -51
  128. package/src/instructor/dto/create-instructor-skill.dto.ts +0 -17
  129. package/src/instructor/dto/update-instructor-skill.dto.ts +0 -18
  130. package/src/instructor/instructor-skill.service.ts +2 -97
  131. package/src/instructor/instructor.controller.ts +16 -0
  132. package/src/instructor/instructor.service.ts +87 -10
  133. package/src/lms.module.ts +1 -0
  134. package/src/training/dto/create-training.dto.ts +4 -0
  135. package/src/training/training.service.ts +104 -5
@@ -176,10 +176,10 @@ export declare class ClassGroupController {
176
176
  status: import("@prisma/client").$Enums.course_enrollment_status_22007f5947_enum;
177
177
  }[]>;
178
178
  enrollStudent(id: number, dto: EnrollStudentDto): Promise<{
179
+ status: import("@prisma/client").$Enums.course_enrollment_status_22007f5947_enum;
179
180
  id: number;
180
181
  created_at: Date;
181
182
  updated_at: Date;
182
- status: import("@prisma/client").$Enums.course_enrollment_status_22007f5947_enum;
183
183
  completed_at: Date | null;
184
184
  person_id: number;
185
185
  course_id: number;
@@ -319,46 +319,46 @@ export declare class ClassGroupController {
319
319
  }>;
320
320
  listMaterials(id: number, sessionId?: string): Promise<({
321
321
  file: {
322
- path: string;
323
322
  size: number;
323
+ path: string;
324
324
  id: number;
325
325
  filename: string;
326
326
  };
327
327
  course_class_session: {
328
- id: number;
329
328
  title: string;
329
+ id: number;
330
330
  };
331
331
  } & {
332
+ title: string;
333
+ url: string | null;
332
334
  id: number;
333
335
  description: string | null;
334
336
  created_at: Date;
335
337
  updated_at: Date;
336
338
  file_id: number | null;
337
339
  course_class_group_id: number;
338
- title: string;
339
340
  course_class_session_id: number | null;
340
341
  material_type: import("@prisma/client").$Enums.course_class_group_material_material_type_6e6c399501_enum;
341
- url: string | null;
342
342
  sort_order: number;
343
343
  })[]>;
344
344
  createMaterial(id: number, dto: CreateMaterialDto): Promise<{
345
345
  file: {
346
- path: string;
347
346
  size: number;
347
+ path: string;
348
348
  id: number;
349
349
  filename: string;
350
350
  };
351
351
  } & {
352
+ title: string;
353
+ url: string | null;
352
354
  id: number;
353
355
  description: string | null;
354
356
  created_at: Date;
355
357
  updated_at: Date;
356
358
  file_id: number | null;
357
359
  course_class_group_id: number;
358
- title: string;
359
360
  course_class_session_id: number | null;
360
361
  material_type: import("@prisma/client").$Enums.course_class_group_material_material_type_6e6c399501_enum;
361
- url: string | null;
362
362
  sort_order: number;
363
363
  }>;
364
364
  deleteMaterial(id: number, materialId: number): Promise<{
@@ -198,10 +198,10 @@ export declare class ClassGroupService {
198
198
  status: import("@prisma/client").$Enums.course_enrollment_status_22007f5947_enum;
199
199
  }[]>;
200
200
  enrollStudent(classGroupId: number, personId: number): Promise<{
201
+ status: import("@prisma/client").$Enums.course_enrollment_status_22007f5947_enum;
201
202
  id: number;
202
203
  created_at: Date;
203
204
  updated_at: Date;
204
- status: import("@prisma/client").$Enums.course_enrollment_status_22007f5947_enum;
205
205
  completed_at: Date | null;
206
206
  person_id: number;
207
207
  course_id: number;
@@ -368,46 +368,46 @@ export declare class ClassGroupService {
368
368
  private handlePrismaError;
369
369
  listMaterials(classGroupId: number, sessionId?: number): Promise<({
370
370
  file: {
371
- path: string;
372
371
  size: number;
372
+ path: string;
373
373
  id: number;
374
374
  filename: string;
375
375
  };
376
376
  course_class_session: {
377
- id: number;
378
377
  title: string;
378
+ id: number;
379
379
  };
380
380
  } & {
381
+ title: string;
382
+ url: string | null;
381
383
  id: number;
382
384
  description: string | null;
383
385
  created_at: Date;
384
386
  updated_at: Date;
385
387
  file_id: number | null;
386
388
  course_class_group_id: number;
387
- title: string;
388
389
  course_class_session_id: number | null;
389
390
  material_type: import("@prisma/client").$Enums.course_class_group_material_material_type_6e6c399501_enum;
390
- url: string | null;
391
391
  sort_order: number;
392
392
  })[]>;
393
393
  createMaterial(classGroupId: number, dto: import('./dto/material.dto').CreateMaterialDto): Promise<{
394
394
  file: {
395
- path: string;
396
395
  size: number;
396
+ path: string;
397
397
  id: number;
398
398
  filename: string;
399
399
  };
400
400
  } & {
401
+ title: string;
402
+ url: string | null;
401
403
  id: number;
402
404
  description: string | null;
403
405
  created_at: Date;
404
406
  updated_at: Date;
405
407
  file_id: number | null;
406
408
  course_class_group_id: number;
407
- title: string;
408
409
  course_class_session_id: number | null;
409
410
  material_type: import("@prisma/client").$Enums.course_class_group_material_material_type_6e6c399501_enum;
410
- url: string | null;
411
411
  sort_order: number;
412
412
  }>;
413
413
  deleteMaterial(classGroupId: number, materialId: number): Promise<{
@@ -4,7 +4,7 @@ import { UpdateCourseDto } from './dto/update-course.dto';
4
4
  export declare class CourseController {
5
5
  private readonly courseService;
6
6
  constructor(courseService: CourseService);
7
- list(page?: string, pageSize?: string, search?: string, status?: string, level?: string, category?: string): Promise<{
7
+ list(page?: string, pageSize?: string, search?: string, status?: string, level?: string, category?: string, offeringTypes?: string | string[]): Promise<{
8
8
  total: number;
9
9
  page: number;
10
10
  pageSize: number;
@@ -55,6 +55,7 @@ export declare class CourseController {
55
55
  sessionCount: number;
56
56
  averageCompletion: number;
57
57
  certificatesIssued: any;
58
+ certificateModel: any;
58
59
  progressByModule: {
59
60
  moduleId: number;
60
61
  moduleTitle: string;
@@ -65,6 +66,7 @@ export declare class CourseController {
65
66
  createdAt: any;
66
67
  }[];
67
68
  }>;
69
+ private toArray;
68
70
  stats(): Promise<{
69
71
  totalCourses: number;
70
72
  publishedCourses: number;
@@ -117,6 +119,7 @@ export declare class CourseController {
117
119
  sessionCount: number;
118
120
  averageCompletion: number;
119
121
  certificatesIssued: any;
122
+ certificateModel: any;
120
123
  progressByModule: {
121
124
  moduleId: number;
122
125
  moduleTitle: string;
@@ -172,6 +175,7 @@ export declare class CourseController {
172
175
  sessionCount: number;
173
176
  averageCompletion: number;
174
177
  certificatesIssued: any;
178
+ certificateModel: any;
175
179
  progressByModule: {
176
180
  moduleId: number;
177
181
  moduleTitle: string;
@@ -227,6 +231,7 @@ export declare class CourseController {
227
231
  sessionCount: number;
228
232
  averageCompletion: number;
229
233
  certificatesIssued: any;
234
+ certificateModel: any;
230
235
  progressByModule: {
231
236
  moduleId: number;
232
237
  moduleTitle: string;
@@ -1 +1 @@
1
- {"version":3,"file":"course.controller.d.ts","sourceRoot":"","sources":["../../src/course/course.controller.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE1D,qBAEa,gBAAgB;IACf,OAAO,CAAC,QAAQ,CAAC,aAAa;gBAAb,aAAa,EAAE,aAAa;IAGzD,IAAI,CACa,IAAI,CAAC,EAAE,MAAM,EACT,QAAQ,CAAC,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,MAAM,EAChB,KAAK,CAAC,EAAE,MAAM,EACX,QAAQ,CAAC,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAatC,KAAK;;;;;;IAKL,OAAO,CAA4B,EAAE,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAK7C,MAAM,CAAS,GAAG,EAAE,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAKnC,MAAM,CACuB,EAAE,EAAE,MAAM,EAC7B,GAAG,EAAE,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAM9B,MAAM,CAA4B,EAAE,EAAE,MAAM;;;CAG7C"}
1
+ {"version":3,"file":"course.controller.d.ts","sourceRoot":"","sources":["../../src/course/course.controller.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE1D,qBAEa,gBAAgB;IACf,OAAO,CAAC,QAAQ,CAAC,aAAa;gBAAb,aAAa,EAAE,aAAa;IAGzD,IAAI,CACa,IAAI,CAAC,EAAE,MAAM,EACT,QAAQ,CAAC,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,MAAM,EAChB,KAAK,CAAC,EAAE,MAAM,EACX,QAAQ,CAAC,EAAE,MAAM,EACZ,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAa3D,OAAO,CAAC,OAAO;IAiBf,KAAK;;;;;;IAKL,OAAO,CAA4B,EAAE,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAK7C,MAAM,CAAS,GAAG,EAAE,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAKnC,MAAM,CACuB,EAAE,EAAE,MAAM,EAC7B,GAAG,EAAE,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAM9B,MAAM,CAA4B,EAAE,EAAE,MAAM;;;CAG7C"}
@@ -22,7 +22,7 @@ let CourseController = class CourseController {
22
22
  constructor(courseService) {
23
23
  this.courseService = courseService;
24
24
  }
25
- list(page, pageSize, search, status, level, category) {
25
+ list(page, pageSize, search, status, level, category, offeringTypes) {
26
26
  return this.courseService.list({
27
27
  page: page ? Number(page) : 1,
28
28
  pageSize: pageSize ? Number(pageSize) : 12,
@@ -30,8 +30,24 @@ let CourseController = class CourseController {
30
30
  status,
31
31
  level,
32
32
  category,
33
+ offeringTypes: this.toArray(offeringTypes),
33
34
  });
34
35
  }
36
+ toArray(value) {
37
+ if (Array.isArray(value)) {
38
+ return value
39
+ .flatMap((item) => String(item).split(','))
40
+ .map((item) => item.trim())
41
+ .filter(Boolean);
42
+ }
43
+ if (typeof value === 'string') {
44
+ return value
45
+ .split(',')
46
+ .map((item) => item.trim())
47
+ .filter(Boolean);
48
+ }
49
+ return [];
50
+ }
35
51
  stats() {
36
52
  return this.courseService.stats();
37
53
  }
@@ -57,8 +73,9 @@ __decorate([
57
73
  __param(3, (0, common_1.Query)('status')),
58
74
  __param(4, (0, common_1.Query)('level')),
59
75
  __param(5, (0, common_1.Query)('category')),
76
+ __param(6, (0, common_1.Query)('offeringTypes')),
60
77
  __metadata("design:type", Function),
61
- __metadata("design:paramtypes", [String, String, String, String, String, String]),
78
+ __metadata("design:paramtypes", [String, String, String, String, String, String, Object]),
62
79
  __metadata("design:returntype", void 0)
63
80
  ], CourseController.prototype, "list", null);
64
81
  __decorate([
@@ -1 +1 @@
1
- {"version":3,"file":"course.controller.js","sourceRoot":"","sources":["../../src/course/course.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AACA,sCAAoC;AACpC,2CAUwB;AACxB,qDAAiD;AACjD,+DAA0D;AAC1D,+DAA0D;AAInD,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;IAC3B,YAA6B,aAA4B;QAA5B,kBAAa,GAAb,aAAa,CAAe;IAAG,CAAC;IAG7D,IAAI,CACa,IAAa,EACT,QAAiB,EACnB,MAAe,EACf,MAAe,EAChB,KAAc,EACX,QAAiB;QAEpC,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;YAC7B,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7B,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE;YAC1C,MAAM;YACN,MAAM;YACN,KAAK;YACL,QAAQ;SACT,CAAC,CAAC;IACL,CAAC;IAGD,KAAK;QACH,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;IACpC,CAAC;IAGD,OAAO,CAA4B,EAAU;QAC3C,OAAO,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACxC,CAAC;IAGD,MAAM,CAAS,GAAoB;QACjC,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACxC,CAAC;IAGD,MAAM,CACuB,EAAU,EAC7B,GAAoB;QAE5B,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IAC5C,CAAC;IAGD,MAAM,CAA4B,EAAU;QAC1C,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACvC,CAAC;CACF,CAAA;AAjDY,4CAAgB;AAI3B;IADC,IAAA,YAAG,GAAE;IAEH,WAAA,IAAA,cAAK,EAAC,MAAM,CAAC,CAAA;IACb,WAAA,IAAA,cAAK,EAAC,UAAU,CAAC,CAAA;IACjB,WAAA,IAAA,cAAK,EAAC,QAAQ,CAAC,CAAA;IACf,WAAA,IAAA,cAAK,EAAC,QAAQ,CAAC,CAAA;IACf,WAAA,IAAA,cAAK,EAAC,OAAO,CAAC,CAAA;IACd,WAAA,IAAA,cAAK,EAAC,UAAU,CAAC,CAAA;;;;4CAUnB;AAGD;IADC,IAAA,YAAG,EAAC,OAAO,CAAC;;;;6CAGZ;AAGD;IADC,IAAA,YAAG,EAAC,KAAK,CAAC;IACF,WAAA,IAAA,cAAK,EAAC,IAAI,EAAE,qBAAY,CAAC,CAAA;;;;+CAEjC;AAGD;IADC,IAAA,aAAI,GAAE;IACC,WAAA,IAAA,aAAI,GAAE,CAAA;;qCAAM,mCAAe;;8CAElC;AAGD;IADC,IAAA,cAAK,EAAC,KAAK,CAAC;IAEV,WAAA,IAAA,cAAK,EAAC,IAAI,EAAE,qBAAY,CAAC,CAAA;IACzB,WAAA,IAAA,aAAI,GAAE,CAAA;;6CAAM,mCAAe;;8CAG7B;AAGD;IADC,IAAA,eAAM,EAAC,KAAK,CAAC;IACN,WAAA,IAAA,cAAK,EAAC,IAAI,EAAE,qBAAY,CAAC,CAAA;;;;8CAEhC;2BAhDU,gBAAgB;IAF5B,IAAA,UAAI,GAAE;IACN,IAAA,mBAAU,EAAC,aAAa,CAAC;qCAEoB,8BAAa;GAD9C,gBAAgB,CAiD5B"}
1
+ {"version":3,"file":"course.controller.js","sourceRoot":"","sources":["../../src/course/course.controller.ts"],"names":[],"mappings":"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"}
@@ -11,6 +11,7 @@ export declare class CourseService {
11
11
  private normalizeOfferingType;
12
12
  private normalizeOptionalText;
13
13
  private resolveCourseTitle;
14
+ private resolveCertificateTemplateId;
14
15
  list(params: {
15
16
  page?: number;
16
17
  pageSize?: number;
@@ -18,6 +19,7 @@ export declare class CourseService {
18
19
  status?: string;
19
20
  level?: string;
20
21
  category?: string;
22
+ offeringTypes?: string[];
21
23
  }): Promise<{
22
24
  total: number;
23
25
  page: number;
@@ -69,6 +71,7 @@ export declare class CourseService {
69
71
  sessionCount: number;
70
72
  averageCompletion: number;
71
73
  certificatesIssued: any;
74
+ certificateModel: any;
72
75
  progressByModule: {
73
76
  moduleId: number;
74
77
  moduleTitle: string;
@@ -131,6 +134,7 @@ export declare class CourseService {
131
134
  sessionCount: number;
132
135
  averageCompletion: number;
133
136
  certificatesIssued: any;
137
+ certificateModel: any;
134
138
  progressByModule: {
135
139
  moduleId: number;
136
140
  moduleTitle: string;
@@ -186,6 +190,7 @@ export declare class CourseService {
186
190
  sessionCount: number;
187
191
  averageCompletion: number;
188
192
  certificatesIssued: any;
193
+ certificateModel: any;
189
194
  progressByModule: {
190
195
  moduleId: number;
191
196
  moduleTitle: string;
@@ -241,6 +246,7 @@ export declare class CourseService {
241
246
  sessionCount: number;
242
247
  averageCompletion: number;
243
248
  certificatesIssued: any;
249
+ certificateModel: any;
244
250
  progressByModule: {
245
251
  moduleId: number;
246
252
  moduleTitle: string;
@@ -1 +1 @@
1
- {"version":3,"file":"course.service.d.ts","sourceRoot":"","sources":["../../src/course/course.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,8BAA8B,EAAE,MAAM,eAAe,CAAC;AAE/D,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAoB1D,qBACa,aAAa;IAEtB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAEvB,OAAO,CAAC,QAAQ,CAAC,cAAc;gBAFd,MAAM,EAAE,aAAa,EAErB,cAAc,EAAE,8BAA8B;IAGjE,OAAO,CAAC,cAAc;IAetB,OAAO,CAAC,eAAe;IAmBvB,OAAO,CAAC,qBAAqB;IAqB7B,OAAO,CAAC,qBAAqB;IAK7B,OAAO,CAAC,kBAAkB;IAIpB,IAAI,CAAC,MAAM,EAAE;QACjB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0BAyiBe,MAAM;6BACH,MAAM;0BACT,MAAM;;;;;;;IA5dhB,KAAK;;;;;;IAiBL,OAAO,CAAC,EAAE,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sBAycR,MAAM;yBACH,MAAM;sBACT,MAAM;;;;;;IAnVhB,MAAM,CAAC,GAAG,EAAE,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sBAiVjB,MAAM;yBACH,MAAM;sBACT,MAAM;;;;;;IAxMhB,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sBAsM7B,MAAM;yBACH,MAAM;sBACT,MAAM;;;;;;IAxBhB,MAAM,CAAC,EAAE,EAAE,MAAM;;;IAcvB,OAAO,CAAC,SAAS;YAkGH,uBAAuB;YAYvB,eAAe;YAgDf,mBAAmB;YAoDnB,gBAAgB;YAgBhB,eAAe;YAaf,iBAAiB;YAwBjB,iBAAiB;YA6DjB,0BAA0B;CA8CzC"}
1
+ {"version":3,"file":"course.service.d.ts","sourceRoot":"","sources":["../../src/course/course.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,8BAA8B,EAAE,MAAM,eAAe,CAAC;AAE/D,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAoB1D,qBACa,aAAa;IAEtB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAEvB,OAAO,CAAC,QAAQ,CAAC,cAAc;gBAFd,MAAM,EAAE,aAAa,EAErB,cAAc,EAAE,8BAA8B;IAGjE,OAAO,CAAC,cAAc;IAetB,OAAO,CAAC,eAAe;IAmBvB,OAAO,CAAC,qBAAqB;IAqB7B,OAAO,CAAC,qBAAqB;IAK7B,OAAO,CAAC,kBAAkB;YAIZ,4BAA4B;IA6BpC,IAAI,CAAC,MAAM,EAAE;QACjB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;KAC1B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0BA6kBe,MAAM;6BACH,MAAM;0BACT,MAAM;;;;;;;IA7fhB,KAAK;;;;;;IAiBL,OAAO,CAAC,EAAE,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sBA0eR,MAAM;yBACH,MAAM;sBACT,MAAM;;;;;;IAjXhB,MAAM,CAAC,GAAG,EAAE,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sBA+WjB,MAAM;yBACH,MAAM;sBACT,MAAM;;;;;;IAvNhB,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sBAqN7B,MAAM;yBACH,MAAM;sBACT,MAAM;;;;;;IAxBhB,MAAM,CAAC,EAAE,EAAE,MAAM;;;IAcvB,OAAO,CAAC,SAAS;YAuGH,uBAAuB;YAYvB,eAAe;YAgDf,mBAAmB;YAwCnB,gBAAgB;YAgBhB,eAAe;YAaf,iBAAiB;YAwBjB,iBAAiB;YA6DjB,0BAA0B;CA8CzC"}
@@ -89,6 +89,28 @@ let CourseService = class CourseService {
89
89
  var _a;
90
90
  return (_a = this.normalizeOptionalText(title)) !== null && _a !== void 0 ? _a : slug;
91
91
  }
92
+ async resolveCertificateTemplateId(value) {
93
+ if (value === undefined) {
94
+ return undefined;
95
+ }
96
+ const normalized = String(value !== null && value !== void 0 ? value : '').trim();
97
+ if (!normalized) {
98
+ return null;
99
+ }
100
+ const numericId = Number(normalized);
101
+ const template = await this.prisma.certificate_template.findFirst({
102
+ where: Number.isInteger(numericId) && numericId > 0
103
+ ? {
104
+ OR: [{ id: numericId }, { slug: normalized }],
105
+ }
106
+ : { slug: normalized },
107
+ select: { id: true },
108
+ });
109
+ if (!template) {
110
+ throw new common_1.BadRequestException('Certificate template not found');
111
+ }
112
+ return template.id;
113
+ }
92
114
  async list(params) {
93
115
  const page = Math.max(Number(params.page) || 1, 1);
94
116
  const pageSize = Math.max(Number(params.pageSize) || 12, 1);
@@ -113,6 +135,9 @@ let CourseService = class CourseService {
113
135
  some: { category: { slug: params.category } },
114
136
  };
115
137
  }
138
+ if (params.offeringTypes && params.offeringTypes.length > 0) {
139
+ where.offering_type = { in: params.offeringTypes };
140
+ }
116
141
  const [courses, total] = await Promise.all([
117
142
  this.prisma.course.findMany({
118
143
  skip,
@@ -221,6 +246,9 @@ let CourseService = class CourseService {
221
246
  },
222
247
  },
223
248
  },
249
+ certificate_template: {
250
+ select: { id: true, slug: true },
251
+ },
224
252
  _count: {
225
253
  select: {
226
254
  course_enrollment: true,
@@ -285,9 +313,10 @@ let CourseService = class CourseService {
285
313
  }
286
314
  async create(dto) {
287
315
  var _a, _b, _c, _d;
288
- const { categorySlugs, logoFileId, bannerFileId, instructorIds } = dto, data = __rest(dto, ["categorySlugs", "logoFileId", "bannerFileId", "instructorIds"]);
316
+ const { categorySlugs, logoFileId, bannerFileId, instructorIds, certificateModel } = dto, data = __rest(dto, ["categorySlugs", "logoFileId", "bannerFileId", "instructorIds", "certificateModel"]);
289
317
  const normalizedSlug = data.slug.trim();
290
318
  const resolvedTitle = this.resolveCourseTitle(data.title, normalizedSlug);
319
+ const certificateTemplateId = await this.resolveCertificateTemplateId(certificateModel);
291
320
  const categories = (categorySlugs === null || categorySlugs === void 0 ? void 0 : categorySlugs.length)
292
321
  ? await this.prisma.category.findMany({
293
322
  where: { slug: { in: categorySlugs } },
@@ -305,7 +334,7 @@ let CourseService = class CourseService {
305
334
  validInstructorIds = instructorIds.filter((id) => validIds.has(id));
306
335
  }
307
336
  const c = await this.prisma.course.create({
308
- data: Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({ name: data.name, slug: normalizedSlug, title: resolvedTitle }, (data.description !== undefined && {
337
+ data: Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({ name: data.name, slug: normalizedSlug, title: resolvedTitle }, (data.description !== undefined && {
309
338
  description: data.description,
310
339
  })), { level: (_a = this.normalizeLevel(data.level)) !== null && _a !== void 0 ? _a : 'beginner', status: (_b = this.normalizeStatus(data.status)) !== null && _b !== void 0 ? _b : 'draft' }), (data.requirements !== undefined && {
311
340
  requirements: data.requirements,
@@ -317,6 +346,8 @@ let CourseService = class CourseService {
317
346
  duration_hours: data.durationHours,
318
347
  })), (data.certificateWorkload !== undefined && {
319
348
  certificate_workload: data.certificateWorkload,
349
+ })), (certificateTemplateId !== undefined && {
350
+ certificate_template_id: certificateTemplateId,
320
351
  })), (data.primaryColor !== undefined && {
321
352
  primary_color: data.primaryColor,
322
353
  })), (data.primaryContrastColor !== undefined && {
@@ -373,6 +404,9 @@ let CourseService = class CourseService {
373
404
  },
374
405
  },
375
406
  },
407
+ certificate_template: {
408
+ select: { id: true, slug: true },
409
+ },
376
410
  _count: { select: { course_enrollment: true } },
377
411
  },
378
412
  });
@@ -394,7 +428,7 @@ let CourseService = class CourseService {
394
428
  }
395
429
  async update(id, dto) {
396
430
  var _a;
397
- const { categorySlugs, logoFileId, bannerFileId, instructorIds } = dto, data = __rest(dto, ["categorySlugs", "logoFileId", "bannerFileId", "instructorIds"]);
431
+ const { categorySlugs, logoFileId, bannerFileId, instructorIds, certificateModel } = dto, data = __rest(dto, ["categorySlugs", "logoFileId", "bannerFileId", "instructorIds", "certificateModel"]);
398
432
  let existingSlug;
399
433
  if (data.title !== undefined &&
400
434
  this.normalizeOptionalText(data.title) === undefined &&
@@ -409,6 +443,7 @@ let CourseService = class CourseService {
409
443
  const resolvedTitle = data.title !== undefined
410
444
  ? this.resolveCourseTitle(data.title, (_a = resolvedSlug !== null && resolvedSlug !== void 0 ? resolvedSlug : existingSlug) !== null && _a !== void 0 ? _a : '')
411
445
  : undefined;
446
+ const certificateTemplateId = await this.resolveCertificateTemplateId(certificateModel);
412
447
  const categories = (categorySlugs === null || categorySlugs === void 0 ? void 0 : categorySlugs.length)
413
448
  ? await this.prisma.category.findMany({
414
449
  where: { slug: { in: categorySlugs } },
@@ -437,7 +472,7 @@ let CourseService = class CourseService {
437
472
  }
438
473
  const c = await this.prisma.course.update({
439
474
  where: { id },
440
- data: Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, (data.name !== undefined && { name: data.name })), (resolvedSlug !== undefined && { slug: resolvedSlug })), (resolvedTitle !== undefined && { title: resolvedTitle })), (data.description !== undefined && { description: data.description })), (data.level !== undefined && {
475
+ data: Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, (data.name !== undefined && { name: data.name })), (resolvedSlug !== undefined && { slug: resolvedSlug })), (resolvedTitle !== undefined && { title: resolvedTitle })), (data.description !== undefined && { description: data.description })), (data.level !== undefined && {
441
476
  level: this.normalizeLevel(data.level),
442
477
  })), (data.status !== undefined && {
443
478
  status: this.normalizeStatus(data.status),
@@ -451,6 +486,8 @@ let CourseService = class CourseService {
451
486
  duration_hours: data.durationHours,
452
487
  })), (data.certificateWorkload !== undefined && {
453
488
  certificate_workload: data.certificateWorkload,
489
+ })), (certificateTemplateId !== undefined && {
490
+ certificate_template_id: certificateTemplateId,
454
491
  })), (data.primaryColor !== undefined && {
455
492
  primary_color: data.primaryColor,
456
493
  })), (data.primaryContrastColor !== undefined && {
@@ -500,6 +537,9 @@ let CourseService = class CourseService {
500
537
  },
501
538
  },
502
539
  },
540
+ certificate_template: {
541
+ select: { id: true, slug: true },
542
+ },
503
543
  _count: { select: { course_enrollment: true } },
504
544
  },
505
545
  });
@@ -546,7 +586,7 @@ let CourseService = class CourseService {
546
586
  return { success: true };
547
587
  }
548
588
  mapCourse(c, metrics, extras) {
549
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29;
589
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31;
550
590
  const resolvedName = (_b = (_a = extras === null || extras === void 0 ? void 0 : extras.name) !== null && _a !== void 0 ? _a : c.name) !== null && _b !== void 0 ? _b : null;
551
591
  const resolvedTitle = (_c = this.normalizeOptionalText(c.title)) !== null && _c !== void 0 ? _c : c.slug;
552
592
  const courseImages = Array.isArray(c.course_image) ? c.course_image : [];
@@ -604,8 +644,11 @@ let CourseService = class CourseService {
604
644
  sessionCount: (_22 = metrics === null || metrics === void 0 ? void 0 : metrics.sessionCount) !== null && _22 !== void 0 ? _22 : 0,
605
645
  averageCompletion: Math.round((_23 = metrics === null || metrics === void 0 ? void 0 : metrics.averageCompletion) !== null && _23 !== void 0 ? _23 : 0),
606
646
  certificatesIssued: (_26 = (_24 = metrics === null || metrics === void 0 ? void 0 : metrics.certificatesIssued) !== null && _24 !== void 0 ? _24 : (_25 = c._count) === null || _25 === void 0 ? void 0 : _25.certificate) !== null && _26 !== void 0 ? _26 : 0,
607
- progressByModule: (_27 = metrics === null || metrics === void 0 ? void 0 : metrics.progressByModule) !== null && _27 !== void 0 ? _27 : [],
608
- instructors: ((_28 = c.course_instructor) !== null && _28 !== void 0 ? _28 : []).map((ci) => {
647
+ certificateModel: (_28 = (_27 = c.certificate_template) === null || _27 === void 0 ? void 0 : _27.slug) !== null && _28 !== void 0 ? _28 : (c.certificate_template_id
648
+ ? String(c.certificate_template_id)
649
+ : null),
650
+ progressByModule: (_29 = metrics === null || metrics === void 0 ? void 0 : metrics.progressByModule) !== null && _29 !== void 0 ? _29 : [],
651
+ instructors: ((_30 = c.course_instructor) !== null && _30 !== void 0 ? _30 : []).map((ci) => {
609
652
  var _a, _b, _c, _d, _e, _f;
610
653
  return ({
611
654
  id: ci.instructor_id,
@@ -613,7 +656,7 @@ let CourseService = class CourseService {
613
656
  avatarId: (_f = (_e = (_d = ci.instructor) === null || _d === void 0 ? void 0 : _d.person) === null || _e === void 0 ? void 0 : _e.avatar_id) !== null && _f !== void 0 ? _f : null,
614
657
  });
615
658
  }),
616
- instructorIds: ((_29 = c.course_instructor) !== null && _29 !== void 0 ? _29 : []).map((ci) => ci.instructor_id),
659
+ instructorIds: ((_31 = c.course_instructor) !== null && _31 !== void 0 ? _31 : []).map((ci) => ci.instructor_id),
617
660
  createdAt: c.created_at,
618
661
  };
619
662
  }
@@ -661,41 +704,33 @@ let CourseService = class CourseService {
661
704
  return extrasById;
662
705
  }
663
706
  async persistCourseExtras(id, data) {
664
- const sets = [];
665
- const params = [];
707
+ const updateData = {};
666
708
  if (data.name !== undefined) {
667
- params.push(data.name);
668
- sets.push(`name = $${params.length}`);
709
+ updateData.name = data.name;
669
710
  }
670
711
  if (data.isFeatured !== undefined) {
671
- params.push(data.isFeatured);
672
- sets.push(`is_featured = $${params.length}`);
712
+ updateData.is_featured = data.isFeatured;
673
713
  }
674
714
  if (data.hasCertificate !== undefined) {
675
- params.push(data.hasCertificate);
676
- sets.push(`has_certificate = $${params.length}`);
715
+ updateData.has_certificate = data.hasCertificate;
677
716
  }
678
717
  if (data.isListed !== undefined) {
679
- params.push(data.isListed);
680
- sets.push(`is_listed = $${params.length}`);
718
+ updateData.is_listed = data.isListed;
681
719
  }
682
720
  if (data.offeringType !== undefined) {
683
- params.push(data.offeringType);
684
- sets.push(`offering_type = $${params.length}`);
721
+ updateData.offering_type = data.offeringType;
685
722
  }
686
- if (sets.length === 0) {
723
+ if (Object.keys(updateData).length === 0) {
687
724
  return;
688
725
  }
689
- params.push(id);
690
726
  try {
691
- await this.prisma.$executeRawUnsafe(`
692
- UPDATE course
693
- SET ${sets.join(', ')}, updated_at = NOW()
694
- WHERE id = $${params.length}
695
- `, ...params);
727
+ await this.prisma.course.update({
728
+ where: { id },
729
+ data: updateData,
730
+ });
696
731
  }
697
732
  catch (_a) {
698
- // Columns may not exist yet in environments with outdated schema.
733
+ // Some environments may still be behind the current course schema.
699
734
  }
700
735
  }
701
736
  async syncCourseImages(courseId, data) {