from typing import Optional, Dict, Any from pydantic import BaseModel, Field class AtKafkaOp(BaseModel): action: str collection: str rkey: str uri: str cid: str path: str record: Optional[Dict[str, Any]] class AtKafkaIdentity(BaseModel): seq: int handle: str class AtKafkaInfo(BaseModel): name: str message: Optional[str] = None class AtKafkaAccount(BaseModel): active: bool seq: int status: Optional[str] = None class DIDDocument(BaseModel): context: Optional[list] = Field(None, alias="@context") id: Optional[str] = None also_known_as: Optional[list] = Field(None, alias="alsoKnownAs") verification_method: Optional[list] = Field(None, alias="verificationMethod") service: Optional[list] = None class Config: populate_by_name = True class ProfileViewDetailed(BaseModel): did: str handle: str display_name: Optional[str] = Field(None, alias="displayName") description: Optional[str] = None avatar: Optional[str] = None banner: Optional[str] = None followers_count: Optional[int] = Field(None, alias="followersCount") follows_count: Optional[int] = Field(None, alias="followsCount") posts_count: Optional[int] = Field(None, alias="postsCount") indexed_at: Optional[str] = Field(None, alias="indexedAt") viewer: Optional[Dict[str, Any]] = None labels: Optional[list] = None class Config: populate_by_name = True class EventMetadata(BaseModel): did_document: Optional[DIDDocument] = Field(None, alias="didDocument") pds_host: Optional[str] = Field(None, alias="pdsHost") handle: Optional[str] = None did_created_at: Optional[str] = Field(None, alias="didCreatedAt") account_age: Optional[int] = Field(None, alias="accountAge") profile: Optional[ProfileViewDetailed] = None class Config: populate_by_name = True class AtKafkaEvent(BaseModel): did: str timestamp: str metadata: Optional[EventMetadata] = Field(None, alias="eventMetadata") operation: Optional[AtKafkaOp] = None account: Optional[AtKafkaAccount] = None identity: Optional[AtKafkaIdentity] = None info: Optional[AtKafkaInfo] = None class Config: populate_by_name = True