DokumentationProdukteArtim Academy LMSCode-ReviewsCode-Reviews V1
Code-Review anlegen
In API Explorer austestenÖffnet den Explorer mit Methode und Pfad dieses Requests.
Stellt einen Diff zur Review in einem Kurs.
files trägt den Diff, wie er im LMS angezeigt wird. Wer aus einem echten Patch kommt, zerlegt ihn vorher: jede Zeile wird ein Eintrag mit type und den beiden Zeilennummern.
POST https://code-reviews.api.lms.artim-industries.com/v1/courses/{courseId}/code-reviews
| Methode | POST |
| Basis | code-reviews.api.lms.artim-industries.com/v1 |
| Scope | lms.codeReviews:write |
| Antwort | 201 |
| Zugang | Developer Mitgliedschaft |
| Auth | Authorization: Bearer lmsapi_… |
Parameter
| Parameter | Ort | Typ | Pflicht | Bedeutung |
|---|---|---|---|---|
courseId | Pfad | string | ja | Die Kennung des Kurses aus der Kursliste. |
Anfragekörper
| Feld | Typ | Bedeutung |
|---|---|---|
title | string | Der Titel. Pflicht. |
subtitle | string | Die Unterzeile — meist der Branch-Name. |
brief | string | Die Aufgabenstellung über dem Diff. |
lessonId | string | Die Lesson, an der sie hängt. |
sourceBranch | string | Der Branch, aus dem der Diff kommt. |
baseBranch | string | Der Branch, gegen den er läuft. |
files | array | Die Dateien als {path, language, lines} mit lines als {type, oldNum, newNum, text}. Pflicht. |
Felder, die der Vertrag nicht nennt, werden verworfen — ein Client kann keine eigenen Felder unterschieben.
{
"title": "Result-Typ einführen",
"subtitle": "feat/result-type",
"brief": "Finde die drei Fehler.",
"lessonId": "lsn_44b1",
"sourceBranch": "feat/result-type",
"baseBranch": "main",
"files": [
{
"path": "src/result.ts",
"language": "typescript",
"lines": [{ "type": "add", "newNum": 1, "text": "export type Result<T> = { ok: true; value: T }" }]
}
]
}
Anfrage
curl -X POST "https://code-reviews.api.lms.artim-industries.com/v1/courses/{courseId}/code-reviews" \
-H "Authorization: Bearer lmsapi_…" \
-H "Content-Type: application/json" \
-d '{ "title": "Result-Typ einführen", "subtitle": "feat/result-type", "brief": "Finde die drei Fehler.", "lessonId": "lsn_44b1", "sourceBranch": "feat/result-type", "baseBranch": "main", "files": [ { "path": "src/result.ts", "language": "typescript", "lines": [{ "type": "add", "newNum": 1, "text": "export type Result<T> = { ok: true; value: T }" }] } ] }'
Antwort
| Feld | Typ | Bedeutung |
|---|---|---|
id | string | Die Kennung der neuen Review-Aufgabe. |
title | string | Der Titel. |
fileCount | integer | Wie viele Dateien angelegt wurden. |
{ "id": "cr_2f60", "title": "Result-Typ einführen", "fileCount": 1 }
Fehler
| Status | code | Wann |
|---|---|---|
400 | invalid_request | Ein Pflichtfeld fehlt, ein Typ passt nicht, oder ein Verweis zeigt auf etwas, das es hier nicht gibt. |
401 | invalid_token | Bearer fehlt, ist unbekannt oder abgelaufen. |
403 | missing_scope | Das Token trägt den Scope dieses Endpunkts nicht. |
404 | not_found | Der Eintrag gehört nicht zum freigegebenen Akademie — oder die Anfrage kam auf der falschen Subdomain an. |
409 | conflict | Der Zustand verbietet die Änderung — der Fehlerkörper nennt den Grund. |
429 | rate_limited | Kontingent erschöpft, siehe Retry-After. |
Jede Fehlerantwort trägt dieselbe Hülle: error.code benennt den Fehler, error.message sagt in einem Satz, was fehlt.
Rate Limits
Das Limit gilt pro Team, nicht pro Token.
| Zugang | Produktion | Sandbox |
|---|---|---|
| Hobby | 60 Anfragen/Minute | ohne Limit |
| Developer Mitgliedschaft | 10.000 Anfragen/Minute | ohne Limit |
Bei 429 sagt der Retry-After-Header, wie lange du warten sollst.