fix(tcf): Schema-Mapping fuer NOT NULL constraints (domain_pattern, source_name)
CI / detect-changes (push) Successful in 10s
CI / branch-name (push) Has been skipped
CI / guardrail-integrity (push) Has been skipped
CI / secret-scan (push) Has been skipped
CI / dep-audit (push) Has been skipped
CI / sbom-scan (push) Has been skipped
CI / validate-canonical-controls (push) Successful in 14s
CI / loc-budget (push) Failing after 20s
CI / go-lint (push) Has been skipped
CI / python-lint (push) Has been skipped
CI / nodejs-lint (push) Has been skipped
CI / nodejs-build (push) Successful in 2m33s
CI / test-go (push) Failing after 52s
CI / iace-gt-coverage (push) Successful in 25s
CI / test-python-backend (push) Successful in 40s
CI / test-python-document-crawler (push) Has been skipped
CI / test-python-dsms-gateway (push) Has been skipped

This commit is contained in:
Benjamin Admin
2026-05-22 00:32:54 +02:00
parent 2e87b74749
commit 19d4b12e07
@@ -91,28 +91,38 @@ async def fetch_and_ingest_tcf_vendors(db: Session) -> dict:
leg_purposes = v.get("legIntPurposes") or []
all_purposes = list(set(purposes) | set(leg_purposes))
category = _category_for_purposes(all_purposes)
privacy_url = (v.get("policyUrl") or "").strip()[:500] or None
# Cookie-Names die der Vendor laut TCF setzt sind nicht in der
# GVL — wir kennzeichnen nur den Vendor-Eintrag mit ID + Purposes.
# Vendor wird mit synthetic cookie_name='<vendor>_tcf_marker'
# gespeichert; Library-Lookup nutzt vendor_name-Match.
marker = f"_tcf_v{vid}"
try:
db.execute(sa_text(
"""
INSERT INTO compliance.cookie_library
(cookie_name, actual_category, vendor_name, source)
VALUES (:n, :cat, :v, 'iab_tcf_v2')
(cookie_name, domain_pattern, vendor_name,
vendor_privacy_url, actual_category,
purpose_en, source_name, source_url, confidence)
VALUES (:n, :dp, :v, :pu, :cat, :purp, 'iab_tcf_v2',
'https://vendor-list.consensu.org/v3/vendor-list.json',
0.99)
ON CONFLICT (cookie_name) DO UPDATE
SET actual_category = EXCLUDED.actual_category,
vendor_name = EXCLUDED.vendor_name
SET actual_category = EXCLUDED.actual_category,
vendor_name = EXCLUDED.vendor_name,
vendor_privacy_url = EXCLUDED.vendor_privacy_url,
purpose_en = EXCLUDED.purpose_en,
source_name = EXCLUDED.source_name,
confidence = EXCLUDED.confidence
"""
), {"n": marker, "cat": category,
"v": f"[TCF-{vid}] {name}"})
), {"n": marker, "dp": "*",
"v": f"[TCF-{vid}] {name}",
"pu": privacy_url, "cat": category,
"purp": f"IAB TCF v2 Purposes: {sorted(all_purposes)}"})
inserted += 1
except Exception as e:
logger.warning("TCF vendor %s insert failed: %s", vid, e)
skipped += 1
db.rollback() # neue Transaktion fuer naechsten Insert
db.commit()
return {"n_vendors_in_gvl": len(vendors), "inserted": inserted,
"skipped": skipped}