Fermion supports bulk importing syllabus into your course. This can be handy if you have a lot of content and you want to quickly import it into your course.
In order to bulk import your curriculum, you must create a JSON object. This object can then directly be imported in our backend creating all relevant course items.Here’s the schema you have to follow:
If you’re importing course items in a recorded course, you have to follow the following schema:
Copy
type RecordedCourseItems = RecordedCourseItem[]// ^ this is the type your final JSON should conform totype RecordedCourseItem = | { type: 'Video' title: string sectionName: string descriptionInMarkdown: string } | { type: 'Article' title: string sectionName: string contentMarkdown: string } | { type: 'Coding Lab' title: string sectionName: string descriptionInMarkdown?: string } | { type: 'Quiz' title: string sectionName: string descriptionInMarkdown?: string questions: { question: string answerExplanation?: string options: { option: string isCorrect?: boolean }[] }[] }
Here’s an example of valid JSON that conforms to the schema above:
Copy
[ { "type": "Article", "sectionName": "Welcome to my course!", "title": "Introduction to Programming", "contentMarkdown": "I'll have some intro to programming data here" }, { "type": "Coding Lab", "sectionName": "Welcome to my course!", "title": "Hello to HTML", "descriptionInMarkdown": "Create an h1 tag in this lab and write your name." }, { "type": "Coding Lab", "sectionName": "Welcome to my course!", "title": "Building a Simple React Component", "descriptionInMarkdown": "Hands-on practice creating your first React component from scratch." }, { "type": "Quiz", "sectionName": "Welcome to my course!", "title": "JavaScript Fundamentals Quiz", "descriptionInMarkdown": "Test your knowledge of core JavaScript concepts", "questions": [ { "question": "What is the difference between let and var in JavaScript?", "answerExplanation": "Let is block-scoped, while var is function-scoped.", "options": [ { "option": "Let is block-scoped, var is function-scoped", "isCorrect": true }, { "option": "They are exactly the same", "isCorrect": false }, { "option": "Let is function-scoped, var is block-scoped", "isCorrect": false }, { "option": "Neither has any meaningful difference", "isCorrect": false } ] }, { "question": "What does the spread operator do in JavaScript?", "answerExplanation": "The spread operator allows an iterable to expand in places where 0+ arguments are expected.", "options": [ { "option": "Combines two arrays", "isCorrect": false }, { "option": "Spreads elements of an array or object", "isCorrect": true }, { "option": "Creates a deep copy of an object", "isCorrect": false }, { "option": "Merges object properties", "isCorrect": false } ] } ] }]
If you’re importing course items in a cohort course, you have to follow the following schema. The reason it is different from above course is because a cohort-based-course can also have live classes:
Copy
type CohortBasedCourseItems = CohortBasedCourseItem[]// ^ this is the type your final JSON should conform totype CohortBasedCourseItem = | { type: 'Video' title: string itemScheduledDate: string descriptionInMarkdown?: string } | { type: 'Live Class' liveClassStartAt: string title: string descriptionInMarkdown?: string liveClassDurationInMinutes: number } | { type: 'Article' title: string itemScheduledDate: string descriptionInMarkdown?: string contentMarkdown: string } | { type: 'Coding Lab' title: string itemScheduledDate: string descriptionInMarkdown?: string } | { type: 'Quiz' title: string descriptionInMarkdown?: string itemScheduledDate: string questions: { question: string answerExplanation?: string options: { option: string isCorrect?: boolean }[] }[] }
Here’s an example of valid JSON that conforms to the schema above:
Copy
[ { "type": "Live Class", "title": "Introduction to Web Development", "descriptionInMarkdown": "A comprehensive overview of modern web development techniques.", "liveClassStartAt": "2024-07-15T14:30:00Z", "liveClassDurationInMinutes": 60 }, { "type": "Article", "title": "Understanding JavaScript Closures", "itemScheduledDate": "2024-07-16T00:00:00Z", "descriptionInMarkdown": "A deep dive into one of JavaScript's most powerful features.", "contentMarkdown": "# JavaScript Closures\n\nClosures are a fundamental concept in JavaScript that allows functions to access variables from their outer (enclosing) scope even after the outer function has returned." }, { "type": "Coding Lab", "title": "Building a Simple React Component", "itemScheduledDate": "2024-07-16T00:00:00Z", "descriptionInMarkdown": "Hands-on practice creating your first React component from scratch." }, { "type": "Quiz", "title": "JavaScript Fundamentals Quiz", "itemScheduledDate": "2024-07-16T00:00:00Z", "descriptionInMarkdown": "Test your knowledge of core JavaScript concepts", "questions": [ { "question": "What is the difference between let and var in JavaScript?", "answerExplanation": "Let is block-scoped, while var is function-scoped.", "options": [ { "option": "Let is block-scoped, var is function-scoped", "isCorrect": true }, { "option": "They are exactly the same", "isCorrect": false }, { "option": "Let is function-scoped, var is block-scoped", "isCorrect": false }, { "option": "Neither has any meaningful difference", "isCorrect": false } ] }, { "question": "What does the spread operator do in JavaScript?", "answerExplanation": "The spread operator allows an iterable to expand in places where 0+ arguments are expected.", "options": [ { "option": "Combines two arrays", "isCorrect": false }, { "option": "Spreads elements of an array or object", "isCorrect": true }, { "option": "Creates a deep copy of an object", "isCorrect": false }, { "option": "Merges object properties", "isCorrect": false } ] } ] }]
Any errors in your JSON schema will be reported to you directly on the UI.