맞춤형 과정
맞춤형 과정은 SecureCodingHub 콘텐츠 카탈로그에서 추출한 학습자 대면 큐레이팅된 주제와 시나리오의 시퀀스입니다. 일단 생성되면, 맞춤형 과정은 내장 주제 또는 카테고리처럼 할당될 수 있습니다. 동사에 따라 custom-courses:read 또는 custom-courses:write가 필요합니다.
엔드포인트
| Method | Path | Scope | 용도 |
|---|---|---|---|
GET | /custom-courses | custom-courses:read | 조직의 모든 맞춤형 과정 목록 조회. |
GET | /custom-courses/{'{'}id{'}'} | custom-courses:read | 정렬된 항목과 함께 단일 맞춤형 과정 검색. |
POST | /custom-courses | custom-courses:write | 새 맞춤형 과정 생성. |
PATCH | /custom-courses/{'{'}id{'}'} | custom-courses:write | 메타데이터 업데이트 및/또는 항목 목록 교체. |
DELETE | /custom-courses/{'{'}id{'}'} | custom-courses:write | 맞춤형 과정 소프트 비활성화. |
모든 경로는 https://api.limeplate.com/api/public/v1에 상대적입니다.
항목 모델
모든 맞춤형 과정은 정렬된 items 목록을 포함합니다. 각 항목은 카탈로그의 주제 또는 시나리오에 대한 참조입니다 — 식별자에 대해서는 콘텐츠 카탈로그를 참조하세요.
| 필드 | Type | 의미 |
|---|---|---|
itemType | string | "topic"(sql-injection와 같은 연습 주제) 또는 "scenario"(학습 모드 시나리오) 중 하나. |
itemId | string | 주제 또는 시나리오의 카탈로그 id. |
orderIndex | integer | 학습자 UI의 0 기반 표시 순서. 낮은 값이 먼저 나타납니다. |
PATCH 시, 항목을 그대로 두려면 items 필드를 생략하거나, 덮어쓰려면 전체 교체 목록을 보내세요. 부분 항목 업데이트는 없습니다 — 저장하고 싶은 순서대로 전체 시퀀스를 다시 보내세요.
맞춤형 과정 목록 조회
조직의 활성 맞춤형 과정당 하나의 항목을 가장 최근 업데이트 순으로 정렬하여 반환합니다.
GET /api/public/v1/custom-courses
Authorization: Bearer scs_live_…응답
[
{
"id": "8b1f0c2e-3a45-4d99-9a7e-2c5e1b3a8f02",
"name": "Backend Onboarding — Q2",
"description": "Required reading for new backend hires.",
"icon": "shield",
"color": "#3b82f6",
"itemCount": 6,
"usageCount": 12,
"createdByUserId": "1a2b3c4d-5e6f-7081-9203-4d5e6f708192",
"createdByName": "Jane Smith",
"createdAt": "2026-04-10T09:22:14Z",
"updatedAt": "2026-05-18T15:01:47Z"
}
]예시
curl -sS \
-H "Authorization: Bearer $SCH_API_KEY" \
https://api.limeplate.com/api/public/v1/custom-courses맞춤형 과정 가져오기
정렬된 항목이 확장된 과정을 반환합니다. resolvedTitle은 읽기 시점의 기본 주제 또는 시나리오의 사람이 읽을 수 있는 제목입니다 — 두 번째 카탈로그 조회 없이 렌더링하기에 편리합니다.
GET /api/public/v1/custom-courses/{customCourseId}
Authorization: Bearer scs_live_…응답
{
"id": "8b1f0c2e-3a45-4d99-9a7e-2c5e1b3a8f02",
"name": "Backend Onboarding — Q2",
"description": "Required reading for new backend hires.",
"icon": "shield",
"color": "#3b82f6",
"items": [
{
"id": "c1d2e3f4-5060-7081-9203-4d5e6f708192",
"itemType": "topic",
"itemId": "sql-injection",
"resolvedTitle": "SQL Injection",
"orderIndex": 0
},
{
"id": "d2e3f405-6070-8192-0304-5e6f70819203",
"itemType": "scenario",
"itemId": "auth-bypass-walkthrough",
"resolvedTitle": "Auth Bypass Walkthrough",
"orderIndex": 1
},
{
"id": "e3f40506-7081-9203-0405-6f7081920304",
"itemType": "topic",
"itemId": "xss",
"resolvedTitle": "Cross-Site Scripting",
"orderIndex": 2
}
],
"usageCount": 12,
"createdByUserId": "1a2b3c4d-5e6f-7081-9203-4d5e6f708192",
"createdByName": "Jane Smith",
"createdAt": "2026-04-10T09:22:14Z",
"updatedAt": "2026-05-18T15:01:47Z"
}예시
curl -sS \
-H "Authorization: Bearer $SCH_API_KEY" \
https://api.limeplate.com/api/public/v1/custom-courses/8b1f0c2e-3a45-4d99-9a7e-2c5e1b3a8f02맞춤형 과정 생성
과정을 생성하고 상세 보기를 반환합니다. API 키의 조직이 새 과정을 소유합니다. 키를 발행한 사용자가 생성자로 기록됩니다.
POST /api/public/v1/custom-courses
Authorization: Bearer scs_live_…
Content-Type: application/json요청 본문
{
"name": "Backend Onboarding — Q2",
"description": "Required reading for new backend hires.",
"icon": "shield",
"color": "#3b82f6",
"items": [
{ "itemType": "topic", "itemId": "sql-injection", "orderIndex": 0 },
{ "itemType": "scenario", "itemId": "auth-bypass-walkthrough", "orderIndex": 1 },
{ "itemType": "topic", "itemId": "xss", "orderIndex": 2 }
]
}name은 필수이며 조직 내에서 고유해야 합니다. description, icon 및 color은 선택 사항입니다 — color는 모든 CSS hex 문자열을 받습니다. items는 생성 시 비어 있을 수 있습니다. 나중에 PATCH를 통해 채울 수 있습니다.
응답
맞춤형 과정 가져오기와 동일한 형태.
예시
curl -sS -X POST \
-H "Authorization: Bearer $SCH_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Backend Onboarding — Q2",
"description": "Required reading for new backend hires.",
"icon": "shield",
"color": "#3b82f6",
"items": [
{ "itemType": "topic", "itemId": "sql-injection", "orderIndex": 0 },
{ "itemType": "topic", "itemId": "xss", "orderIndex": 1 }
]
}' \
https://api.limeplate.com/api/public/v1/custom-courses맞춤형 과정 업데이트
요청의 모든 필드는 선택 사항입니다. 변경하려는 필드만 전달하세요. items를 보내면 전체 항목 목록이 교체됩니다 — 순서를 변경하려면 새 orderIndex 값으로 모든 항목을 다시 보내세요.
PATCH /api/public/v1/custom-courses/{customCourseId}
Authorization: Bearer scs_live_…
Content-Type: application/json요청 본문
{
"name": "Backend Onboarding — Q3",
"items": [
{ "itemType": "topic", "itemId": "sql-injection", "orderIndex": 0 },
{ "itemType": "topic", "itemId": "ssrf", "orderIndex": 1 },
{ "itemType": "scenario", "itemId": "jwt-tampering", "orderIndex": 2 }
]
}응답
업데이트된 상세 객체.
예시
curl -sS -X PATCH \
-H "Authorization: Bearer $SCH_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "name": "Backend Onboarding — Q3" }' \
https://api.limeplate.com/api/public/v1/custom-courses/8b1f0c2e-3a45-4d99-9a7e-2c5e1b3a8f02맞춤형 과정 삭제
과정을 소프트 비활성화합니다. GET /custom-courses와 학습자 UI에서 더 이상 나타나지 않습니다. 과정을 참조한 기존 과제는 과거 진행 상황을 계속 추적하지만 새 수신자에게는 전달되지 않습니다.
DELETE /api/public/v1/custom-courses/{customCourseId}
Authorization: Bearer scs_live_…응답
{ "message": "Custom course deactivated" }예시
curl -sS -X DELETE \
-H "Authorization: Bearer $SCH_API_KEY" \
https://api.limeplate.com/api/public/v1/custom-courses/8b1f0c2e-3a45-4d99-9a7e-2c5e1b3a8f02맞춤형 과정 할당
맞춤형 과정은 할당될 때까지 학습자에게 전달되지 않습니다. targetType: "custom-course"과 targetId를 맞춤형 과정 id로 설정하여 과제를 사용하세요:
curl -sS -X POST \
-H "Authorization: Bearer $SCH_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"assigneeType": "user",
"assigneeId": "1a2b3c4d-5e6f-7081-9203-4d5e6f708192",
"contentArea": "practice",
"targetType": "custom-course",
"targetId": "8b1f0c2e-3a45-4d99-9a7e-2c5e1b3a8f02",
"deadline": "2026-06-15T00:00:00Z",
"isMandatory": true
}' \
https://api.limeplate.com/api/public/v1/assignments학습자는 orderIndex 순서로 항목을 봅니다. 연습 주제와 학습 시나리오는 각각의 진행 상황 엔드포인트에서 추적됩니다 — 진행 상황 참조.