Dokümanlar/API ve Webhook'lar/İlerleme

İlerleme

Bir kullanıcının eğitim ilerlemesini okuyun: pratik (zorluk başına), öğrenme (senaryo başına) ve aktif atamalar. Tüm uç noktalar salt okunurdur ve progress:read kapsamını gerektirir. Granül kasten incedir — çoğu LMS senkronizasyonu ve BI pipeline'ı, kullanıcı başına bu üç uç noktayı yoklamaktan başka bir şeye ihtiyaç duymaz.

Uç noktalar

MethodPathKapsamAmaç
GET/users/{'{'}userId{'}'}/practice-progressprogress:readSkor ve zaman damgalarıyla tamamlanmış pratik zorlukları.
GET/users/{'{'}userId{'}'}/learn-progressprogress:readDurum bilgisiyle öğrenme modu senaryoları.
GET/users/{'{'}userId{'}'}/assignmentsprogress:readKullanıcının aktif atamaları ve ilerleme yüzdesi.

Bu rotaların API'nin kök seviyesinde olduğuna dikkat edin — /progress/ altında değil, /api/public/v1/users/{'{'}userId{'}'}/…. {'{'}userId{'}'}, Users API ve webhook payload'ları tarafından döndürülen SecureCodingHub kullanıcı id'sidir.

Pratik ilerlemesi

Kullanıcının tamamladığı her zorluk için bir satır. Pratik konuları birden fazla zorluk içerir (0'dan başlayarak indekslenir) ve her zorluk iki aşamadan geçer — zafiyet tespiti ve yama seçimi — bağımsız olarak puanlanır.

GET /api/public/v1/users/{userId}/practice-progress
Authorization: Bearer scs_live_…

Yanıt

[
  {
    "topicId": "sql-injection",
    "challengeIndex": 0,
    "language": "python",
    "score": 100,
    "phase1Score": 50,
    "phase2Score": 50,
    "phase1HintUsed": false,
    "phase2HintUsed": false,
    "completedAt": "2026-05-20T14:32:08Z"
  },
  {
    "topicId": "sql-injection",
    "challengeIndex": 1,
    "language": "python",
    "score": 80,
    "phase1Score": 30,
    "phase2Score": 50,
    "phase1HintUsed": true,
    "phase2HintUsed": false,
    "completedAt": "2026-05-21T09:14:55Z"
  },
  {
    "topicId": "xss",
    "challengeIndex": 0,
    "language": "javascript",
    "score": 100,
    "phase1Score": 50,
    "phase2Score": 50,
    "phase1HintUsed": false,
    "phase2HintUsed": false,
    "completedAt": "2026-05-22T11:48:31Z"
  }
]
  • topicId — pratik konusunun katalog id'si (örn. sql-injection, xss, ssrf).
  • challengeIndex — konu içindeki zorluğun sıfır tabanlı indeksi.
  • language — kullanıcının zorluğu çözdüğü dil.
  • score — 100 üzerinden toplam. phase1Score ve phase2Score toplamı score eder; her biri 50 üzerinden.
  • phase1HintUsed / phase2HintUsed — boolean; ipucu kullanımının ne kadara mal olacağına client karar verir, sunucu yalnızca bayrağı ve sonuç skoru kaydeder.
  • completedAt — en son tamamlanmanın ISO 8601 UTC zaman damgası.

Bu listede yalnızca tamamlanmış zorluklar görünür. Devam eden denemeler ifşa edilmez.

Örnek

curl -sS \
  -H "Authorization: Bearer $SCH_API_KEY" \
  https://api.limeplate.com/api/public/v1/users/1a2b3c4d-5e6f-7081-9203-4d5e6f708192/practice-progress

Öğrenme ilerlemesi

Kullanıcının açtığı her öğrenme modu senaryosu için bir satır. Öğrenme senaryoları rehberli yürüyüşlerdir; adım sayısı ve kaba bir status alanı ile izlenir.

GET /api/public/v1/users/{userId}/learn-progress
Authorization: Bearer scs_live_…

Yanıt

[
  {
    "scenarioId": "auth-bypass-walkthrough",
    "currentStep": 8,
    "totalSteps": 8,
    "status": "completed",
    "startedAt": "2026-05-18T13:02:11Z",
    "completedAt": "2026-05-18T13:41:07Z",
    "lastAccessAt": "2026-05-18T13:41:07Z"
  },
  {
    "scenarioId": "jwt-tampering",
    "currentStep": 3,
    "totalSteps": 7,
    "status": "started",
    "startedAt": "2026-05-23T16:20:00Z",
    "completedAt": null,
    "lastAccessAt": "2026-05-24T10:08:42Z"
  }
]
  • scenarioId — senaryonun katalog id'si.
  • currentStep / totalSteps — senaryo içindeki ilerleme. Eşit olduğunda senaryo bitmiş demektir.
  • statusstarted veya completed'den biri.
  • completedAt — senaryo bitene kadar null.
  • lastAccessAt — ilerleme yapıp yapmadığından bağımsız olarak kullanıcının senaryoyu son açtığı zaman.

Örnek

curl -sS \
  -H "Authorization: Bearer $SCH_API_KEY" \
  https://api.limeplate.com/api/public/v1/users/1a2b3c4d-5e6f-7081-9203-4d5e6f708192/learn-progress

Atamalar

Kullanıcının aktif atamaları, pratik ve öğrenme ilerlemesine kendiniz join atmak zorunda kalmamanız için önceden hesaplanmış bir tamamlanma yüzdesiyle birlikte. Bu bireye kadar çözülmüş kullanıcı seviyesi, ekip seviyesi ve kurum seviyesi atamaları içerir.

GET /api/public/v1/users/{userId}/assignments
Authorization: Bearer scs_live_…

Yanıt

[
  {
    "id": "f1a2b3c4-d5e6-4708-8192-03405e6f7081",
    "contentArea": "practice",
    "targetType": "topic",
    "targetId": "sql-injection",
    "targetTitle": "SQL Injection",
    "deadline": "2026-06-15T00:00:00Z",
    "isMandatory": true,
    "isOverdue": false,
    "isCompleted": false,
    "totalItems": 5,
    "completedItems": 2,
    "progressPercent": 40.0,
    "note": "Assigned after CodeQL finding in payments-api."
  },
  {
    "id": "a2b3c4d5-e6f7-4081-9203-405e6f708192",
    "contentArea": "learn",
    "targetType": "scenario",
    "targetId": "auth-bypass-walkthrough",
    "targetTitle": "Auth Bypass Walkthrough",
    "deadline": "2026-05-31T00:00:00Z",
    "isMandatory": false,
    "isOverdue": false,
    "isCompleted": true,
    "totalItems": 1,
    "completedItems": 1,
    "progressPercent": 100.0,
    "note": null
  }
]
  • contentAreapractice veya learn.
  • targetType — pratik için: category, module, topic veya custom-course. Öğrenme için: course, scenario veya custom-course.
  • isOverdue — teslim tarihi geçtiyse ve atama henüz tamamlanmamışsa true.
  • progressPercent — 0-100'e ölçeklenmiş tamamlanma oranı.

Örnek

curl -sS \
  -H "Authorization: Bearer $SCH_API_KEY" \
  https://api.limeplate.com/api/public/v1/users/1a2b3c4d-5e6f-7081-9203-4d5e6f708192/assignments

Yoklama desenleri

LMS veya BI pipeline'ları için saatte bir kez batch yoklama normalde yeterlidir — pratik ve öğrenme ilerlemesi yalnızca kullanıcı bir iş bitirdiğinde değişir. Atama tarafında daha sıkı canlı gösterge panelleri için yoklama yerine assignment.completed webhook'una abone olun; bkz. Webhook'lar. v1'de practice.completed veya learn.completed olayı yoktur — bunlar için bu uç noktaları yoklayın.