4.3 KiB
Backend API für LabelPrintAgent
Diese Datei beschreibt die Endpunkte, die der PaperlessManager bereitstellen muss, damit der LabelPrintAgent Etiketten abholen, drucken und das Ergebnis zurückmelden kann.
Der LabelPrintAgent rendert keine Layouts selbst. Das Backend liefert ein fertiges Etikettbild.
Authentifizierung
Alle Endpunkte sollten denselben Bearer Token akzeptieren:
Authorization: Bearer {apiToken}
Der Token wird im Agent lokal verschlüsselt gespeichert.
1. Nächsten Druckjob abrufen
GET /api/label-print-agent/jobs/next?agentId={agentId}
Der Agent ruft diesen Endpunkt alle X Sekunden auf.
Query-Parameter
| Name | Pflicht | Beschreibung |
|---|---|---|
agentId |
ja | Eindeutige ID des Agents, z. B. Rechnername |
Antwort, wenn kein Job vorhanden ist
204 No Content
Antwort mit Bild direkt im JSON
200 OK
Content-Type: application/json
{
"jobId": "12345",
"labelImageBase64": "iVBORw0KGgoAAAANSUhEUgAA...",
"labelImageContentType": "image/png",
"labelWidthMm": 57,
"labelHeightMm": 32
}
Antwort mit separater Bild-URL
{
"jobId": "12345",
"labelImageUrl": "/api/label-print-agent/jobs/12345/image",
"labelImageContentType": "image/png",
"labelWidthMm": 57,
"labelHeightMm": 32
}
Felder
| Feld | Pflicht | Beschreibung |
|---|---|---|
jobId |
ja | Eindeutige Job-ID für Rückmeldungen |
labelImageBase64 |
bedingt | Base64-kodiertes Etikettbild |
labelImageUrl |
bedingt | URL zum Nachladen des Etikettbilds |
labelImageContentType |
empfohlen | z. B. image/png |
labelWidthMm |
ja | Etikettenbreite in mm, z. B. 57 |
labelHeightMm |
ja | Etikettenhöhe in mm, z. B. 32 |
labelImageBase64 oder labelImageUrl muss gesetzt sein.
2. Etikettbild nachladen
Nur erforderlich, wenn labelImageUrl verwendet wird.
GET /api/label-print-agent/jobs/{jobId}/image
Antwort
200 OK
Content-Type: image/png
Body: Binärdaten des fertigen Etikettbilds.
Empfehlung: PNG, schwarz/weiß, passend zum Etikettenformat, z. B. 57 x 32 mm bei 300 dpi.
3. Erfolgreichen Druck melden
POST /api/label-print-agent/jobs/{jobId}/printed
Content-Type: application/json
Request Body
{
"agentId": "PC-BUERO",
"printerName": "DYMO LabelWriter 450"
}
Antwort
200 OK
oder:
204 No Content
Das Backend sollte den Job erst hier endgültig als gedruckt markieren.
4. Fehler melden
POST /api/label-print-agent/jobs/{jobId}/error
Content-Type: application/json
Request Body
{
"agentId": "PC-BUERO",
"printerName": "DYMO LabelWriter 450",
"errorMessage": "Drucker ist nicht verfügbar."
}
Antwort
200 OK
oder:
204 No Content
Das Backend entscheidet danach, ob der Job erneut angeboten wird oder auf Fehler bleibt.
Backend-Verhalten
Empfohlener Ablauf im Backend:
- Job erstellen und serverseitig Layout, Nummern, QR-Code und Bild erzeugen.
- Job bleibt wartend, bis ein Agent ihn abholt.
jobs/nextliefert jeweils höchstens einen Job.- Backend reserviert oder lockt den Job beim Ausliefern, damit zwei Agents ihn nicht parallel drucken.
- Agent druckt lokal.
- Agent meldet
printedodererror. - Backend setzt den finalen Status.
Empfohlene Statuscodes
| Situation | Status |
|---|---|
| Kein Job vorhanden | 204 No Content |
| Job vorhanden | 200 OK |
| Token fehlt/ungültig | 401 Unauthorized |
| Agent darf nicht drucken | 403 Forbidden |
| Job-ID unbekannt | 404 Not Found |
| Backend-Fehler | 500 Internal Server Error |
Server-Sent Events optional
Später kann das Backend zusätzlich einen Event-Endpunkt anbieten:
GET /api/label-print-agent/events?agentId={agentId}
Accept: text/event-stream
Beispiel:
event: label-job-available
data: {"count":1}
Der Agent könnte dann bei einem Event sofort jobs/next aufrufen. Polling bleibt trotzdem als Fallback sinnvoll.
Wichtige Designentscheidung
Der Agent kennt keine fachlichen Layouts mehr:
- keine
layout_key - keine lokalen LabelTemplates
- keine MySQL-Verbindung
- keine Nummernreservierung
- kein QR-Code-Rendering
Das Backend liefert ein fertiges Bild. Der Agent ist nur noch lokaler Windows-Druck-Connector.