<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet"
        integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.3.0/css/all.min.css"
        integrity="sha512-SzlrxWUlpfuzQ+pcUCosxcglQRNAq/DZjVsC0lE40xsADsfeQoEypE+enwcOiGjk/bSuGGKHEyjSoQ1zVisanQ=="
        crossorigin="anonymous" referrerpolicy="no-referrer" />
</head>
</html>
from typing import Dict, Optional, TypedDict, Union

from pydantic import BaseModel
from typing_extensions import NotRequired

MetadataType = TypedDict(
    "MetadataType",
    {
        "entityId": str,
        "entityName": str,
        "eventName": str,
        "publisherName": NotRequired[str],
        "publishDate": NotRequired[str],
        "authorization": NotRequired[str],
        "traceparent": NotRequired[str],
        "tracestate": NotRequired[str],
        "containsPersonalData": NotRequired[bool],
        "token": NotRequired[str],
    },
)
ParamsType = TypedDict(
    "ParamsType", {"metadata": MetadataType, "payload": Dict[str, str]}
)


class Metadata(BaseModel):
    entityId: str
    entityName: str
    eventName: str
    publisherName: str = ""
    publishDate: str = ""
    authorization: Optional[str] = None
    traceparent: str = ""
    tracestate: str = ""
    containsPersonalData: bool = False
    token: str = ""


class Params(BaseModel):
    metadata: Metadata
    payload: dict = {}

    @staticmethod
    def from_dict(data: Union[dict, ParamsType]):
        return Params(
            metadata=Metadata(**data.get("metadata", {})),
            payload=data.get("payload", {}),
        )


class Payload(BaseModel):
    method: str
    params: Params
    jsonrpc: str
    id: int
