39 lines
990 B
Python
39 lines
990 B
Python
import json
|
|
from typing import Any
|
|
|
|
from core.domain.errors import (
|
|
CDRProcessingError,
|
|
FailureReason,
|
|
)
|
|
from core.domain.models import NormalizedCDR
|
|
from core.domain.normalization import normalize_cdr
|
|
from core.domain.validation import parse_raw_cdr
|
|
|
|
|
|
def decode_payload(value: bytes) -> dict[str, Any]:
|
|
try:
|
|
text = value.decode("utf-8")
|
|
payload = json.loads(text)
|
|
|
|
except (UnicodeDecodeError, json.JSONDecodeError) as exc:
|
|
raise CDRProcessingError(
|
|
reason=FailureReason.MALFORMED_JSON,
|
|
detail=f"Unable to decode Kafka message as JSON: {exc}",
|
|
) from exc
|
|
|
|
if not isinstance(payload, dict):
|
|
raise CDRProcessingError(
|
|
reason=FailureReason.NORMALIZATION_ERROR,
|
|
detail="Kafka JSON payload must be an object.",
|
|
)
|
|
|
|
return payload
|
|
|
|
|
|
def process_payload(
|
|
payload: dict[str, Any],
|
|
) -> NormalizedCDR:
|
|
raw_cdr = parse_raw_cdr(payload)
|
|
|
|
return normalize_cdr(raw_cdr)
|