Skip to main content

Architecture Overview

Cross-package rule: No type imports between frontend packages. Each defines local interfaces.

1. Server: Course Module

Module: server/src/course/course.module.ts

1.1 Hierarchy

1.2 Controllers

File: server/src/course/course.controller.ts — Route prefix /course Section endpoints (nested under /course): Subsection endpoints: Item endpoints: Property endpoints (Requirements, Inclusions, Audiences): Batch controller (batch-update.controller.ts): Course Manager controller (course-manager.controller.ts):

1.3 Services

1.4 Entities

Course (entities/course.entity.ts) — Table: courses CourseSection (entities/sections.entity.ts) — Table: course_sections CourseSubSection (entities/subsections.entity.ts) — Table: course_subsections CourseItem (entities/course_item.entity.ts) — Table: course_items Level (entities/level.entity.ts) — Table: levels — id, text CourseManager (entities/manager.entity.ts) — Junction: course ↔ instructor

1.5 Enums

1.6 CASL Permissions

File: course.permissions.ts Hooks: CourseHook loads course entity for permission checks. CourseSectionHook loads section’s parent course.

1.7 WebSocket Gateway

File: course-progress.gateway.ts — Namespace course-progress Events: heartbeat, time_update, mark_completed, get_last_watched. 5s debounce on writes. Syncs video position to UserVideoProgress.

1.8 Background Jobs

File: jobs/certificate-generation.job.ts — BullMQ job for completion certificates.

2. Server: Enrollment Module

Module: server/src/enrollment/enrollment.module.ts — Route /enrollment

2.1 Endpoints

Enrollment Entity (entities/enrollment.entity.ts) — Table: enrollments EnrollmentStatus enum: PENDING, APPROVED, COMPLETED, REJECTED, REFUNDED

2.2 Enrollment Flow


3. Server: Cross-Cutting

3.1 OpenSearch Integration

Files: server/src/opensearch/ Courses are indexed with gigActive flag. Search queries filter gigActive: true. Route: /marketplace/course (separate controller) Used by public/ for course discovery. Wraps OpenSearch queries.

3.3 Analytics

File: server/src/analytics/entities/course-analytics-daily.entity.ts Daily aggregations: enrollments, revenue, views, completions per course.

3.4 Video Infrastructure

  • Bunny Stream for video hosting
  • TUS resumable upload protocol via initVideoUpload → returns upload URL + signature
  • refreshVideoUpload for expiring signatures
  • getVideoPlayback returns playback URL, thumbnail, available resolutions

4. Student Frontend

4.1 Service Layer

File: student/src/services/course.service.ts Static HTTP client class. Defines local Course, Section, Subsection, Item, Level, Category, Instructor, etc. interfaces.

4.2 Player Service

File: student/src/services/course-player.service.ts Returns StudentCoursePlayerDto with section locking, progress, pre-signed video URLs.

4.3 Progress Service

File: student/src/services/course-progress.service.ts

4.4 React Query Hooks

useCourseProgress returns:
  • progress, isLoading, error
  • updateProgress, updateSection, updateSubsection, updateItem
  • setCurrentPosition, getItemProgress, markItemCompleted, updateVideoTime
  • getSectionProgress, getSubsectionProgress
Optimistic update pattern: onMutate snapshots + onError rollback + onSettled invalidation.

4.5 Zustand Store

File: student/src/stores/my-course.ts Persisted store (my-course-store key) for current player position: sectionId, subsectionId, itemId, videoCurrentTime.

4.6 Progress Types

File: student/src/types/course-progress.d.ts

4.7 Pages

4.8 Player Components


5. Instructor Frontend

5.1 Service Layer

File: instructor/src/services/course.service.ts Full CRUD for course management. Defines local CourseResponseDto, CreateCourseDto, UpdateCourseDto, CourseSummaryDto, CourseManagerDto. Additional services:
  • instructor/src/services/course-item.service.ts — Item CRUD
  • instructor/src/services/course-section.service.ts — Section CRUD
  • instructor/src/services/course-subsection.service.ts — Subsection CRUD

5.2 Course Editor

Multi-step form with Zustand store slices: Editor pages: Editor components:

5.3 Dashboard Pages

5.4 Zod Validation

File: instructor/src/utils/schema/course.schema.ts — normalizedCurriculumSchema

6. Admin Frontend

6.1 Service Layer

File: admin/src/services/course.service.ts

6.2 Admin Course Types

File: admin/src/types/course.types.ts Defines AdminCourse (280+ lines), CourseListParams, CurriculumData, CourseFilters, CourseStatistics, CourseDetailAnalytics, CourseReview, PublishStatus enum, DurationMeasure enum, VisibilityUpdate.

6.3 Zod Schemas

File: admin/src/schemas/course.schema.ts courseFiltersSchema, visibilityUpdateSchema, courseRejectionSchema, courseApprovalSchema.

6.4 Data Provider Handler

File: admin/src/providers/data-provider/handlers/courses.handler.ts Integrates with Refine/React Admin for list, show, delete operations.

6.5 Pages & Components


7. Public/Marketplace Frontend

7.1 Service Layer

File: public/src/services/course.service.ts

7.2 Hooks

7.3 Store

File: public/src/stores/course.ts Zustand store: currentTab, selectedSections for à-la-carte purchasing with section selection/deselection and price calculation.

8. SDK (Auto-generated)

Files: sdk/src/

9. Data Flow Diagrams

Course Creation (Instructor)

Course Player (Student)

Course Approval (Admin)

Enrollment (Student Purchase)

Course Search (Marketplace)


10. File Index by Package

Server: Course Module (~58 files)

Server: Enrollment Module (~16 files)

enrollment.module.ts, enrollment.controller.ts, enrollment.service.ts, entities/enrollment.entity.ts, entities/section-enrollments.entity.ts, enums/enrollment-status.entity.ts, dto/ (7 files), listeners/enrollment.listener.ts, enrollment.permissions.ts, enrollment.hook.ts

Server: Cross-Cutting

elastic/course-elastic.service.ts, elastic/types/opensearch-course.type.ts, elastic/properties/course.property.ts, elastic/listeners/course.listener.ts, analytics/entities/course-analytics-daily.entity.ts, faker/flows/course.flow.ts, validation/schemas/course.schema.ts, templates/emails/course.tsx

Student Frontend (~18 files)

Instructor Frontend (~30 files)

Admin Frontend (~18 files)

Public Marketplace (~7 files)

SDK (~4 files)

axios/course/course.ts, axios/course-managers/course-managers.ts, hooks/course/course.ts, hooks/course-managers/course-managers.ts

Landing Page (~3 files)

components/cards/courses_card/CoursesCard.jsx, pages/home/courseSearch/CourseSearch.jsx