TIDAS-Paketimport-API
TIDAS-ZIP-Pakete über die TianGong-LCA-API mit API-Key-Authentifizierung importieren.
Dieser Leitfaden erklärt, wie Sie ein TIDAS-ZIP-Paket über die TianGong-LCA-
Edge-Function-API importieren. Die empfohlene API-Basis ist Ihre bereitgestellte Edge-Function-URL
mit angehängtem /functions/v1.
Typische Anwendungsfälle
- TIDAS-ZIP-Pakete gesammelt aus einem externen System importieren
- Denselben asynchronen Import-Ablauf wie die Produkt-UI wiederverwenden
- Strukturierte Validierungsfehler, Open-Data-Filterergebnisse und Nutzer- Konfliktdetails auswerten
Authentifizierung und Basis-URL
Der empfohlene Auth-Header ist:
Authorization: Bearer <USER_API_KEY>USER_API_KEYlässt sich auf der TianGong-LCA-Kontoprofilseite generieren- Behandeln Sie den API-Key mit derselben Sorgfalt wie Kontozugangsdaten als Secret
- First-Party-Browsersitzungen können weiterhin
USER_JWTnutzen; externe API- Integrationen solltenUSER_API_KEYbevorzugen
Beispiel-Basis-URL:
https://<your-project-ref>.supabase.co/functions/v1Nutzen Sie den aktuellen TianGong-LCA-Clouddienst, verwenden Sie:
https://qgzvkongdjqiiamzbbts.supabase.co/functions/v1Ablaufübersicht
Der vollständige Import-Ablauf umfasst vier Schritte:
POST /import_tidas_packagemitaction=prepare_uploadaufrufen- Die ZIP-Bytes an das zurückgegebene signierte Upload-Ziel hochladen
POST /import_tidas_packagemitaction=enqueueaufrufenGET /tidas_package_jobs/{job_id}abfragen und den Importbericht auswerten
Es empfiehlt sich, X-Idempotency-Key bei prepare_upload und
enqueue mitzusenden, damit Clients sicher wiederholen können.
Lokaler Preflight mit tidas
Automation clients can check a package with the released Rust
tidas 0.1.3 CLI before calling the
API. Extract the ZIP into a temporary directory, then run:
tidas validate ./unpacked-package \
--input-format tidas-json \
--issues ./validation-issues.jsonl \
--format jsonExit-Code 0 bedeutet, dass die lokale Validierung bestanden ist; Exit-Code 2 bedeutet, dass die
Validierung mit Datenproblemen abgeschlossen wurde. Eine Pipeline sollte Exit-Code, JSON-Bericht
und validation-issues.jsonl prüfen und erst nach bestandener lokaler Validierung hochladen.
Ein lokaler Preflight erzeugt keinen TianGong-LCA-Importauftrag und ersetzt weder
serverseitige Validierung, Konfliktprüfungen noch den endgültigen import_report. Die
tidas-Executable und die Plattform-API sind getrennte Ausführungsgrenzen.
1. Upload vorbereiten
Anfrage:
curl -i --location --request POST "${BASE_URL}/import_tidas_package" \
--header 'Content-Type: application/json' \
--header "Authorization: Bearer ${USER_API_KEY}" \
--header 'X-Idempotency-Key: tidas-import-prepare-001' \
--data '{
"action": "prepare_upload",
"filename": "example-package.zip",
"byte_size": 123456,
"content_type": "application/zip"
}'Beispielantwort:
{
"ok": true,
"action": "prepare_upload",
"job_id": "4a56e7b2-8f18-4f0f-a6b4-cf40f343d8b8",
"source_artifact_id": "9ad0da68-3933-4f7b-a3cb-a494b70ec0a2",
"artifact_url": "https://example.supabase.co/storage/v1/object/sign/tidas/import/example-package.zip",
"upload": {
"bucket": "tidas",
"object_path": "imports/example-package.zip",
"path": "imports/example-package.zip",
"token": "signed-upload-token",
"signed_url": "https://example.supabase.co/storage/v1/upload/resumable",
"expires_in_seconds": 300,
"filename": "example-package.zip",
"byte_size": 123456,
"content_type": "application/zip"
}
}Wichtige Felder:
job_id: wird beim Abfragen des asynchronen Auftrags verwendetsource_artifact_id: im späterenenqueue-Aufruf erforderlichupload.signed_url: die direkte Upload-URL, die CLI- oder generische HTTP-Clients nutzen könnenupload.bucket+upload.path+upload.token: nützlich, wenn Ihr Client bereits an das Supabase-Storage-SDK angebunden ist
2. Die ZIP-Datei hochladen
Liegt upload.signed_url vor, ist der empfohlene CLI-freundliche Weg, das
ZIP direkt hochzuladen:
curl -i --request PUT "${SIGNED_URL}" \
--header 'Content-Type: application/zip' \
--data-binary @./example-package.zipHier ist SIGNED_URL der von prepare_upload zurückgegebene Wert
upload.signed_url.
Nutzt Ihr Client bereits das Supabase-Storage-SDK, können Sie alternativ
upload.bucket, upload.path und upload.token mit
uploadToSignedUrl(...) verwenden:
const { error } = await supabase.storage
.from(upload.bucket)
.uploadToSignedUrl(upload.path, upload.token, file, {
contentType: upload.content_type,
upsert: true,
});3. In Warteschlange stellen
Nach erfolgreichem Upload markieren Sie das Quellartefakt als bereit und stellen den asynchronen Import-Worker in die Warteschlange:
curl -i --location --request POST "${BASE_URL}/import_tidas_package" \
--header 'Content-Type: application/json' \
--header "Authorization: Bearer ${USER_API_KEY}" \
--header 'X-Idempotency-Key: tidas-import-enqueue-001' \
--data '{
"action": "enqueue",
"job_id": "4a56e7b2-8f18-4f0f-a6b4-cf40f343d8b8",
"source_artifact_id": "9ad0da68-3933-4f7b-a3cb-a494b70ec0a2",
"artifact_sha256": "<optional-sha256>",
"artifact_byte_size": 123456,
"filename": "example-package.zip",
"content_type": "application/zip"
}'Beispielantwort:
{
"ok": true,
"mode": "queued",
"job_id": "4a56e7b2-8f18-4f0f-a6b4-cf40f343d8b8",
"source_artifact_id": "9ad0da68-3933-4f7b-a3cb-a494b70ec0a2"
}Mögliche mode-Werte:
queued: der Auftrag wurde eingereihtin_progress: derselbe Auftrag läuft bereitscompleted: derselbe Auftrag wurde zuvor bereits abgeschlossen
4. Auftragsstatus abfragen
Empfohlene Abfrage:
curl -i --location --request GET "${BASE_URL}/tidas_package_jobs/<job-id>" \
--header "Authorization: Bearer ${USER_API_KEY}"Die API unterstützt außerdem GET /tidas_package_jobs?job_id=<job-id> und
POST /tidas_package_jobs mit job_id im Anfragekörper.
Wichtige Antwortfelder:
status:queued,running,completed,failedund verwandte Zuständeartifacts: die Liste der Auftragsartefakteartifacts_by_kind.import_report: das Importbericht-Artefaktartifacts_by_kind.import_report.signed_download_url: eine temporäre URL zum Herunterladen des Importbericht-JSONartifacts_by_kind.import_report.download_status: Download-Zustand des Berichtartefakts, etwaavailable,not_ready,expired,deleted,object_missing,storage_path_invalidodersigned_url_failedartifacts_by_kind.import_report.download_error_code/download_error_message: Grund und empfohlene Aktion, wennsigned_download_urlleer oder nicht verfügbar ist
Bei status=completed müssen Clients in der Regel noch das
import_report-Artefakt herunterladen und diese Nutzlast als endgültiges Geschäftsergebnis
auswerten.
Ist download_status nicht available, entscheiden Sie anhand download_error_code, ob ein
neuer Auftrag angelegt, auf das Artefakt gewartet oder der Speicherpfad / die signierte URL
untersucht werden soll. Betrachten Sie status=completed allein nicht als Beweis,
dass der Bericht herunterladbar ist.
Semantik des Importberichts
Nach Abschluss des Importauftrags gehört die import_report-Nutzlast in der Regel zu
einer dieser Ergebnisklassen:
IMPORTED: Import erfolgreichUSER_DATA_CONFLICT: Import wurde abgelehnt, weil er mit bestehenden nutzereigenen Datensätzen kollidiertVALIDATION_FAILED: Import wurde durch Paket-Validierungsfehler blockiert
Das bedeutet:
tidas_package_jobs.status=completedbedeutet nicht automatisch, dass Daten importiert wurden- Das endgültige Geschäftsergebnis sollte aus
import_report.okundimport_report.codebestimmt werden
Erfolgsbeispiel:
{
"ok": true,
"code": "IMPORTED",
"message": "TIDAS package imported successfully",
"summary": {
"total_entries": 42,
"filtered_open_data_count": 3,
"user_conflict_count": 0,
"importable_count": 39,
"imported_count": 39,
"validation_issue_count": 0,
"error_count": 0,
"warning_count": 0
},
"filtered_open_data": [],
"user_conflicts": [],
"validation_issues": []
}Beispiel eines Validierungsfehlers
Die Validierung läuft nach enqueue asynchron im Worker. Schlägt sie
fehl, enthält der import_report eine maschinenlesbare Issueliste.
{
"ok": false,
"code": "VALIDATION_FAILED",
"message": "TIDAS package validation failed",
"summary": {
"total_entries": 7,
"filtered_open_data_count": 0,
"user_conflict_count": 0,
"importable_count": 0,
"imported_count": 0,
"validation_issue_count": 2,
"error_count": 1,
"warning_count": 1
},
"filtered_open_data": [],
"user_conflicts": [],
"validation_issues": [
{
"issue_code": "schema_error",
"severity": "error",
"category": "sources",
"file_path": "sources/a.json",
"location": "<root>",
"message": "Schema Error at <root>: missing required field",
"context": {
"validator": "required"
}
},
{
"issue_code": "localized_text_language_error",
"severity": "warning",
"category": "processes",
"file_path": "processes/b.json",
"location": "processDataSet/name/baseName/0",
"message": "Localized text error at processDataSet/name/baseName/0: invalid lang",
"context": {}
}
]
}Client-Empfehlungen:
- Lokalisieren Sie nach Möglichkeit über
issue_code - Zeigen Sie zur Fehlersuche zusätzlich rohe
message,file_pathundlocationan - Nutzen Sie
summary.error_count,summary.warning_countundsummary.validation_issue_countfür übergeordnete Zusammenfassungen - Für Produktfluss-Klassifikationen prüft die Validierung
@classId,@level,#textund die Elternkette gemeinsam. CPC-/ILCD-Produktklassifikationen können spezifischere Issue-Codes zurückgeben wieproduct_category_unknown_class_id,product_category_level_mismatch,product_category_text_mismatchoderproduct_category_parent_mismatch; extern benannte Klassifikationssysteme erhalten weiterhin strukturelle Validierung.
Feldkompatibilität von Prozessdatensätzen
Der Import-Worker validiert processes/*.json gegen das aktuelle TIDAS-Schema.
Beachten Sie bei der Vorbereitung von Prozessdatensätzen diese Felder besonders:
processDataSet.modellingAndValidation.dataSourcesTreatmentAndRepresentativeness.annualSupplyOrProductionVolumeist nun erforderlich und nutzt eine feldspezifische mehrsprachige Textform. Jeder#text-Wert sollte mit einer parsbaren Zahl beginnen und einen Einheiten- oder Kontext- Suffix behalten, etwa"123.45 kg/year"oder"1.2E3 kg/year".- Senden Sie
annualSupplyOrProductionVolumenicht als alten schlichten numerischen String und lassen Sie den Einheiten- oder Kontext-Suffix nicht weg. processDataSet.exchanges.exchange[].locationsollte nach Möglichkeit einen TIDAS-/ILCD- Standortkategoriecode verwenden, etwaCN,CN-BJ,RERoderGLO. Nicht-leere Alt-Strings werden aus Kompatibilität mit externen Daten weiterhin akzeptiert.exchange.locationist kein mehrsprachiger Text; senden Sie keinStringMultiLang- Objekt oder Array. Bei Produkteingabe-Austauschvorgängen dient dieses Feld zusätzlich als expliziter Versorgungsregions-Anker der nachgelagerten Anbieter-Verknüpfung.- Klassifikationsfelder dürfen an ihrer natürlichen Kategorietiefe enden. Fügen Sie keine leeren unteren Ebenen hinzu, nur um die Hierarchie zu füllen; gültige Ebene-0- oder Ebene-0-1-Pfade können die Validierung bestehen.
common:classification/common:categoryerzwingen weiterhin maximale Tiefe, einen Wert je Ebene und gültige Kategoriewerte. Zu tiefe Pfade, doppelte Ebenen oder ungültige Kategoriewerte liefern weiterhinschema_erroroder einen Klassifikationshierarchie-Fehler.- Das veröffentlichte Produktfluss-Klassifikationsschema behält weiterhin den vollständigen kontrollierten Klassifikationsvertrag. Der Plattform-Validator nutzt einen internen Index zur Beschleunigung der Prüfungen von Klassenwert, Ebene, Text und Elternkette; dies erweitert nicht die beim API-Import akzeptierten Produktklassifikationen.
Pakete mit Feldformen oder -werten, die nicht zum aktuellen Schema passen, scheitern
mit schema_error; der Importbericht verweist über file_path, location und
message auf die Prozessdatei und das Feld.
CAS-Nummern-Validierung
Das aktuelle TIDAS-Schema kennzeichnet CAS-Nummern mit dem Format cas-number. Der Import-Worker prüft
die Form im Stil 64-17-5 und validiert anschließend die finale CAS-Prüfziffer.
- TIDAS-JSON-CAS-Nummern mit falscher Prüfziffer werden als Formatprobleme zurückgegeben.
CASNumber-Werte in eILCD/ILCD-Fluss-XML erhalten dieselbe ergänzende Prüfziffer-Validierung.- Enthält der Bericht
issue_code: "cas_number_checksum_error", sieht der Wert wie eine CAS- Nummer aus, aber die Prüfziffer stimmt nicht; korrigieren Sie die Quell-CAS-Nummer vor dem erneuten Versuch.
Implementierungshinweise
- Die Paketvalidierung wird nicht synchron im Browser abgeschlossen; sie läuft im asynchronen Worker
prepare_uploadallein genügt nicht; Upload, Enqueue und Abfragen sind alle erforderlich- API-Key-Authentifizierung und Browser-JWT teilen denselben Endpunkt-Vertrag; externe Integrationen sollten API-Keys bevorzugen
- Halten Sie die Edge-Function-Basis-URL mit der bereitgestellten Umgebung konsistent, die Ihre Produkt-UI bedient