{ "info": { "_postman_id": "f7c2e4a1-8b3d-4e9f-a2c6-11dd99ee5501", "name": "Yimaru Exam Prep (Duolingo)", "description": "Exam-prep tree API (`/api/v1/exam-prep/...`): catalog courses → units → modules → lessons → practices. Requires Bearer token.\n\n**Courses** = `catalog-courses` in the backend. Set collection variables before chaining requests.", "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" }, "auth": { "type": "bearer", "bearer": [ { "key": "token", "value": "{{accessToken}}", "type": "string" } ] }, "variable": [ { "key": "baseUrl", "value": "http://localhost:8080" }, { "key": "accessToken", "value": "" }, { "key": "catalogCourseId", "value": "1" }, { "key": "unitId", "value": "1" }, { "key": "moduleId", "value": "1" }, { "key": "lessonId", "value": "1" }, { "key": "practiceId", "value": "1" } ], "item": [ { "name": "Duolingo", "item": [ { "name": "Courses", "description": "Backend route group: **`catalog-courses`** (`exam_prep.catalog_courses.*`)", "item": [ { "name": "Create catalog course", "request": { "method": "POST", "header": [ { "key": "Content-Type", "value": "application/json" } ], "body": { "mode": "raw", "raw": "{\n \"name\": \"IELTS Prep\",\n \"description\": \"Optional description\",\n \"thumbnail\": null\n}" }, "url": "{{baseUrl}}/api/v1/exam-prep/catalog-courses", "description": "Permission: `exam_prep.catalog_courses.create`" } }, { "name": "List catalog courses", "request": { "method": "GET", "url": "{{baseUrl}}/api/v1/exam-prep/catalog-courses?limit=20&offset=0", "description": "Permission: `exam_prep.catalog_courses.list`" } }, { "name": "Reorder catalog courses", "request": { "method": "PUT", "header": [ { "key": "Content-Type", "value": "application/json" } ], "body": { "mode": "raw", "raw": "{\n \"ordered_ids\": [1, 2, 3]\n}" }, "url": "{{baseUrl}}/api/v1/exam-prep/catalog-courses/reorder", "description": "Permission: `exam_prep.catalog_courses.reorder`. Must include every id in scope exactly once." } }, { "name": "Get catalog course by ID", "request": { "method": "GET", "url": "{{baseUrl}}/api/v1/exam-prep/catalog-courses/{{catalogCourseId}}", "description": "Permission: `exam_prep.catalog_courses.get`" } }, { "name": "Update catalog course", "request": { "method": "PUT", "header": [ { "key": "Content-Type", "value": "application/json" } ], "body": { "mode": "raw", "raw": "{\n \"name\": \"Updated name\",\n \"description\": null,\n \"thumbnail\": null,\n \"sort_order\": 1\n}" }, "url": "{{baseUrl}}/api/v1/exam-prep/catalog-courses/{{catalogCourseId}}", "description": "Permission: `exam_prep.catalog_courses.update`" } }, { "name": "Delete catalog course", "request": { "method": "DELETE", "url": "{{baseUrl}}/api/v1/exam-prep/catalog-courses/{{catalogCourseId}}", "description": "Permission: `exam_prep.catalog_courses.delete`" } } ] }, { "name": "Units", "description": "Nested under catalog course (`exam_prep.units.*`)", "item": [ { "name": "Create unit", "request": { "method": "POST", "header": [ { "key": "Content-Type", "value": "application/json" } ], "body": { "mode": "raw", "raw": "{\n \"name\": \"Grammar foundations\",\n \"description\": null,\n \"thumbnail\": null\n}" }, "url": "{{baseUrl}}/api/v1/exam-prep/catalog-courses/{{catalogCourseId}}/units", "description": "Permission: `exam_prep.units.create`" } }, { "name": "List units by catalog course", "request": { "method": "GET", "url": "{{baseUrl}}/api/v1/exam-prep/catalog-courses/{{catalogCourseId}}/units?limit=20&offset=0", "description": "Permission: `exam_prep.units.list`" } }, { "name": "Reorder units in catalog course", "request": { "method": "PUT", "header": [ { "key": "Content-Type", "value": "application/json" } ], "body": { "mode": "raw", "raw": "{\n \"ordered_ids\": [1, 2, 3]\n}" }, "url": "{{baseUrl}}/api/v1/exam-prep/catalog-courses/{{catalogCourseId}}/units/reorder", "description": "Permission: `exam_prep.units.reorder`" } }, { "name": "Get unit by ID", "request": { "method": "GET", "url": "{{baseUrl}}/api/v1/exam-prep/units/{{unitId}}", "description": "Permission: `exam_prep.units.get`" } }, { "name": "Update unit", "request": { "method": "PUT", "header": [ { "key": "Content-Type", "value": "application/json" } ], "body": { "mode": "raw", "raw": "{\n \"name\": \"Updated unit\",\n \"description\": null,\n \"thumbnail\": null,\n \"sort_order\": 1\n}" }, "url": "{{baseUrl}}/api/v1/exam-prep/units/{{unitId}}", "description": "Permission: `exam_prep.units.update`" } }, { "name": "Delete unit", "request": { "method": "DELETE", "url": "{{baseUrl}}/api/v1/exam-prep/units/{{unitId}}", "description": "Permission: `exam_prep.units.delete`" } } ] }, { "name": "Modules", "description": "Exam-prep **`unit_modules`** (`exam_prep.modules.*`)", "item": [ { "name": "Create module", "request": { "method": "POST", "header": [ { "key": "Content-Type", "value": "application/json" } ], "body": { "mode": "raw", "raw": "{\n \"name\": \"Present tense\",\n \"description\": null,\n \"thumbnail\": null,\n \"icon\": null\n}" }, "url": "{{baseUrl}}/api/v1/exam-prep/units/{{unitId}}/modules", "description": "Permission: `exam_prep.modules.create`" } }, { "name": "List modules by unit", "request": { "method": "GET", "url": "{{baseUrl}}/api/v1/exam-prep/units/{{unitId}}/modules?limit=20&offset=0", "description": "Permission: `exam_prep.modules.list`" } }, { "name": "Reorder modules in unit", "request": { "method": "PUT", "header": [ { "key": "Content-Type", "value": "application/json" } ], "body": { "mode": "raw", "raw": "{\n \"ordered_ids\": [1, 2, 3]\n}" }, "url": "{{baseUrl}}/api/v1/exam-prep/units/{{unitId}}/modules/reorder", "description": "Permission: `exam_prep.modules.reorder`" } }, { "name": "Get module by ID", "request": { "method": "GET", "url": "{{baseUrl}}/api/v1/exam-prep/modules/{{moduleId}}", "description": "Permission: `exam_prep.modules.get`" } }, { "name": "Update module", "request": { "method": "PUT", "header": [ { "key": "Content-Type", "value": "application/json" } ], "body": { "mode": "raw", "raw": "{\n \"name\": \"Updated module\",\n \"description\": null,\n \"thumbnail\": null,\n \"icon\": null,\n \"sort_order\": 1\n}" }, "url": "{{baseUrl}}/api/v1/exam-prep/modules/{{moduleId}}", "description": "Permission: `exam_prep.modules.update`" } }, { "name": "Delete module", "request": { "method": "DELETE", "url": "{{baseUrl}}/api/v1/exam-prep/modules/{{moduleId}}", "description": "Permission: `exam_prep.modules.delete`" } } ] }, { "name": "Lessons", "description": "`exam_prep.lessons.*`", "item": [ { "name": "Create lesson", "request": { "method": "POST", "header": [ { "key": "Content-Type", "value": "application/json" } ], "body": { "mode": "raw", "raw": "{\n \"title\": \"Intro video\",\n \"video_url\": \"https://example.com/video\",\n \"thumbnail\": null,\n \"description\": null\n}" }, "url": "{{baseUrl}}/api/v1/exam-prep/modules/{{moduleId}}/lessons", "description": "Permission: `exam_prep.lessons.create`" } }, { "name": "List lessons by module", "request": { "method": "GET", "url": "{{baseUrl}}/api/v1/exam-prep/modules/{{moduleId}}/lessons?limit=20&offset=0", "description": "Permission: `exam_prep.lessons.list_by_module`" } }, { "name": "Reorder lessons in module", "request": { "method": "PUT", "header": [ { "key": "Content-Type", "value": "application/json" } ], "body": { "mode": "raw", "raw": "{\n \"ordered_ids\": [1, 2, 3]\n}" }, "url": "{{baseUrl}}/api/v1/exam-prep/modules/{{moduleId}}/lessons/reorder", "description": "Permission: `exam_prep.lessons.reorder`" } }, { "name": "Get lesson by ID", "request": { "method": "GET", "url": "{{baseUrl}}/api/v1/exam-prep/lessons/{{lessonId}}", "description": "Permission: `exam_prep.lessons.get`" } }, { "name": "Update lesson", "request": { "method": "PUT", "header": [ { "key": "Content-Type", "value": "application/json" } ], "body": { "mode": "raw", "raw": "{\n \"title\": \"Updated lesson\",\n \"video_url\": null,\n \"thumbnail\": null,\n \"description\": null,\n \"sort_order\": 1\n}" }, "url": "{{baseUrl}}/api/v1/exam-prep/lessons/{{lessonId}}", "description": "Permission: `exam_prep.lessons.update`" } }, { "name": "Delete lesson", "request": { "method": "DELETE", "url": "{{baseUrl}}/api/v1/exam-prep/lessons/{{lessonId}}", "description": "Permission: `exam_prep.lessons.delete`" } } ] }, { "name": "Practices", "description": "Tied to lesson; **`question_set_id`** references shared `question_sets`. `exam_prep.practices.*`", "item": [ { "name": "Create practice", "request": { "method": "POST", "header": [ { "key": "Content-Type", "value": "application/json" } ], "body": { "mode": "raw", "raw": "{\n \"title\": \"Drill: articles\",\n \"story_description\": null,\n \"story_image\": null,\n \"persona_id\": null,\n \"question_set_id\": 1,\n \"quick_tips\": null\n}" }, "url": "{{baseUrl}}/api/v1/exam-prep/lessons/{{lessonId}}/practices", "description": "Permission: `exam_prep.practices.create`" } }, { "name": "List practices by lesson", "request": { "method": "GET", "url": "{{baseUrl}}/api/v1/exam-prep/lessons/{{lessonId}}/practices?limit=20&offset=0", "description": "Permission: `exam_prep.practices.list_by_lesson`" } }, { "name": "Get practice by ID", "request": { "method": "GET", "url": "{{baseUrl}}/api/v1/exam-prep/practices/{{practiceId}}", "description": "Permission: `exam_prep.practices.get`" } }, { "name": "Update practice", "request": { "method": "PUT", "header": [ { "key": "Content-Type", "value": "application/json" } ], "body": { "mode": "raw", "raw": "{\n \"title\": \"Updated practice\",\n \"story_description\": null,\n \"story_image\": null,\n \"persona_id\": null,\n \"question_set_id\": 1,\n \"quick_tips\": null\n}" }, "url": "{{baseUrl}}/api/v1/exam-prep/practices/{{practiceId}}", "description": "Permission: `exam_prep.practices.update`. Omit fields you do not change." } }, { "name": "Delete practice", "request": { "method": "DELETE", "url": "{{baseUrl}}/api/v1/exam-prep/practices/{{practiceId}}", "description": "Permission: `exam_prep.practices.delete`" } } ] } ] } ] }