Zum Inhalt springen

API: Anhänge

Anhänge verwenden einen dreistufigen, inhaltsadressierten Upload: Du registrierst die Datei mit ihrer SHA-256-Prüfsumme, lädst die Bytes zu einer vorsignierten URL hoch und bestätigst dann. Speichert der Arbeitsbereich bereits identischen Inhalt, entfällt der Upload-Schritt komplett.

POST /api/workspaces/{workspaceId}/tasks/{taskId}/attachments
{
"checksum": "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08",
"fileName": "color-sample.jpg",
"mediaType": "image/jpeg",
"sizeBytes": 182734
}

checksum ist der SHA-256-Hex-Wert des Dateiinhalts in Kleinbuchstaben. Liefert 201:

{
"id": "019f…",
"uploadUrl": "https://…storage…?X-Amz-Signature=…"
}
  • uploadUrl ist null, wenn der Arbeitsbereich diesen Inhalt bereits speichert — der Anhang ist damit vollständig, überspringe Schritt 2 und 3.
  • Fehler: 409, wenn diese Datei bereits an diese Aufgabe angehängt ist, 413, wenn das Speicherlimit des Arbeitsbereichs überschritten würde.

Sende die rohe Datei per PUT an uploadUrl, mit demselben Content-Type, den du registriert hast:

Terminal window
curl -X PUT --data-binary @color-sample.jpg \
-H "Content-Type: image/jpeg" "$UPLOAD_URL"

Die URL ist vorsigniert und kurzlebig; hier wird kein Todomino-Token gesendet.

POST /api/workspaces/{workspaceId}/tasks/{taskId}/attachments/{attachmentId}/complete

Liefert 200, nachdem der Server die Größe des gespeicherten Objekts geprüft hat. 400, wenn der Upload nie angekommen ist.

GET /api/workspaces/{workspaceId}/tasks/{taskId}/attachments/{attachmentId}/download

Antwortet mit 302 Found und einer kurzlebigen vorsignierten URL im Location-Header. Folge der Weiterleitung, ohne deinen Authorization-Header mitzusenden (die meisten HTTP-Clients machen das standardmäßig richtig).

DELETE /api/workspaces/{workspaceId}/tasks/{taskId}/attachments/{attachmentId}

Liefert 204. Entfernt den Anhang von der Aufgabe; die gespeicherte Datei wird erst gelöscht, wenn keine andere Aufgabe denselben Inhalt referenziert.