> ## Documentation Index
> Fetch the complete documentation index at: https://memberpulseptyltd.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Course Creation

> Build courses with subjects, content, and assessments

Build comprehensive courses with structured subjects, diverse content types, and assessments.

## Course Structure

```
Course
├── Subject 1
│   ├── Content: Video
│   ├── Content: PDF
│   └── Content: Quiz
├── Subject 2
│   ├── Content: Text
│   └── Content: Quiz
└── Final Assessment
```

## Content Types

| Type  | Description                 |
| ----- | --------------------------- |
| Video | MP4, embedded YouTube/Vimeo |
| PDF   | Downloadable documents      |
| Text  | Rich text content           |
| Quiz  | Multiple choice, true/false |
| SCORM | SCORM packages              |

## Course Settings

* **Access**: Free, paid, member-only
* **Duration**: Estimated completion time
* **CPD Points**: Points awarded on completion
* **Pass Score**: Minimum quiz score (default: 70%)
* **Certificate**: Enable/disable certification

## UI Spec (from supplied spreadsheet)

The following field inventory is sourced from `workspace/sources/entity-registry.csv` ("Courses").

> This is a UI/requirements inventory (not the ERD). Some rows describe UI behavior (e.g. limits) rather than canonical storage.

### Course fields

| Field                     | Input Type         | Required     | Notes                                        |
| ------------------------- | ------------------ | ------------ | -------------------------------------------- |
| Course ID                 | Number             | Required     | System generated                             |
| Course Name               | Text               | Required     | model: `name`                                |
| Tile Short Description    | Text               | Required     | First \~135 chars shown in tile              |
| Course Description        | WYSIWYG (Textarea) | Required     | model: `description`                         |
| Course Category           | Multi-select       | Required     | model: `courseCategories`                    |
| Course Featured Image     | File               | Required     | model: `featuredImage`                       |
| Series                    | Multi-select       | -            | model: `courseSeries`                        |
| Branches                  | Multi-select       | -            | model: `courseBranches`                      |
| Course Type               | Selector           | Required     | model: `courseType`                          |
| Course Author             | Text               | Required     | model: `author`                              |
| Publish Date / Time       | Date + Time        | Required     | model: `publishDateTime`                     |
| Estimated Completion Time | Number             | Required     | Minutes; model: `estimatedCompletionTime`    |
| Start Date                | Date               | Required     | model: `startDate`                           |
| Close Date                | Date               | Not Required | Must be after start date; model: `closeDate` |
| CPD Points                | Number             | Required     | model: `cpdPoints`                           |
| CPD Category              | Multi-select       | Required     | model: `cpdCategories`                       |
| Members Price             | Text               | Required     | -                                            |
| Members Limit             | Number             | Not Required | model: `membersLimit`                        |
| Non-Members Price         | Text               | Required     | model: `nonMembersPrice`                     |
| Non-Members Limit         | Number             | Not Required | model: `nonMembersLimit`                     |
| General Attendance Limit  | Number             | Not Required | model: `generalAttendanceLimit`              |

#### Acceptance Criteria

##### Frontend

* [ ] Course fields workflow is implemented in the UI as described.

##### Backend / API

* [ ] Backend behavior supports Course fields as documented.

##### Permissions

* [ ] Access is restricted per the Capabilities matrix on this page (or equivalent role rules).

##### Business Rules

* [ ] All business rules for this feature are enforced.

##### Error Handling

* [ ] Error states return clear messages and appropriate HTTP status codes.

### Subject / quiz fields

| Field               | Input Type   | Required     | Notes                                                            |
| ------------------- | ------------ | ------------ | ---------------------------------------------------------------- |
| Subject Name        | Text         | Required     | model: `name`                                                    |
| Subject Description | Text         | Required     | model: `description`                                             |
| Subject Duration    | Number       | Required     | Minutes; empty means infinite timer                              |
| Subject File        | File         | Required     | Video / Document                                                 |
| File Thumbnail      | File         | Not Required | Default thumbnail used if empty                                  |
| Zoom Link           | Selector     | Required     | Pulls from available Zoom videos                                 |
| Questions Required  | True / False | Required     | model: `isQuestionsRequired`                                     |
| How many questions  | Number       | Required     | model: `numberOfQuestions`                                       |
| Generate with AI    | Yes / No     | Required     | model: `generateWithAI`                                          |
| Question Type       | Selector     | Required     | model: `questionType` (enum: `single_answer`, `multiple_answer`) |

#### Data Model Cross‑Reference (Entities)

* Course definition + embedded subject structure: [`Course`](/entities/core/course)
* Member enrollment + progress: [`Course Enrollment`](/entities/core/course-enrollment)
* Paid course purchases / invoices / receipts: [`Payment Transaction`](/entities/integration/payment-transaction)
* Sponsors: [`Sponsorship`](/entities/core/sponsorship)
* CPD: [`CPD Record`](/entities/core/cpd-record) and [`CPD Category`](/entities/core/cpd-category)

#### Acceptance Criteria

##### Frontend

* [ ] Subject / quiz fields workflow is implemented in the UI as described.

##### Backend / API

* [ ] Backend behavior supports Subject / quiz fields as documented.

##### Permissions

* [ ] Access is restricted per the Capabilities matrix on this page (or equivalent role rules).

##### Business Rules

* [ ] All business rules for this feature are enforced.

##### Error Handling

* [ ] Error states return clear messages and appropriate HTTP status codes.

## Features

### Course Creation

#### Acceptance Criteria

##### Frontend

* [ ] UI supports the workflows described in this feature.

##### Backend / API

* [ ] Backend behavior supports this feature as documented.

##### Permissions

* [ ] Access is restricted per the Capabilities matrix on this page (or equivalent role rules).

##### Business Rules

* [ ] All business rules for this feature are enforced.

##### Error Handling

* [ ] Error states return clear messages and appropriate HTTP status codes.

## Implementation Contracts

### Backend (API)

```
POST   /api/courses                          # Create course
PUT    /api/courses/{id}                     # Update course

POST   /api/courses/{id}/subjects            # Add subject
PUT    /api/courses/{id}/subjects/{subjectId}
DELETE /api/courses/{id}/subjects/{subjectId}
PUT    /api/courses/{id}/subjects/reorder    # Reorder subjects

POST   /api/courses/{id}/subjects/{subjectId}/content
PUT    /api/courses/{id}/content/{contentId}
DELETE /api/courses/{id}/content/{contentId}

POST   /api/courses/{id}/publish             # Publish course
POST   /api/courses/{id}/unpublish           # Unpublish
```
