1from typing import Optional, Dict, Any
2from pydantic import BaseModel, Field
3
4
5class AtKafkaOp(BaseModel):
6 action: str
7 collection: str
8 rkey: str
9 uri: str
10 cid: str
11 path: str
12 record: Optional[Dict[str, Any]]
13
14
15class AtKafkaIdentity(BaseModel):
16 seq: int
17 handle: str
18
19
20class AtKafkaInfo(BaseModel):
21 name: str
22 message: Optional[str] = None
23
24
25class AtKafkaAccount(BaseModel):
26 active: bool
27 seq: int
28 status: Optional[str] = None
29
30
31class DIDDocument(BaseModel):
32 context: Optional[list] = Field(None, alias="@context")
33 id: Optional[str] = None
34 also_known_as: Optional[list] = Field(None, alias="alsoKnownAs")
35 verification_method: Optional[list] = Field(None, alias="verificationMethod")
36 service: Optional[list] = None
37
38 class Config:
39 populate_by_name = True
40
41
42class ProfileViewDetailed(BaseModel):
43 did: str
44 handle: str
45 display_name: Optional[str] = Field(None, alias="displayName")
46 description: Optional[str] = None
47 avatar: Optional[str] = None
48 banner: Optional[str] = None
49 followers_count: Optional[int] = Field(None, alias="followersCount")
50 follows_count: Optional[int] = Field(None, alias="followsCount")
51 posts_count: Optional[int] = Field(None, alias="postsCount")
52 indexed_at: Optional[str] = Field(None, alias="indexedAt")
53 viewer: Optional[Dict[str, Any]] = None
54 labels: Optional[list] = None
55
56 class Config:
57 populate_by_name = True
58
59
60class EventMetadata(BaseModel):
61 did_document: Optional[DIDDocument] = Field(None, alias="didDocument")
62 pds_host: Optional[str] = Field(None, alias="pdsHost")
63 handle: Optional[str] = None
64 did_created_at: Optional[str] = Field(None, alias="didCreatedAt")
65 account_age: Optional[int] = Field(None, alias="accountAge")
66 profile: Optional[ProfileViewDetailed] = None
67
68 class Config:
69 populate_by_name = True
70
71
72class AtKafkaEvent(BaseModel):
73 did: str
74 timestamp: str
75 metadata: Optional[EventMetadata] = Field(None, alias="eventMetadata")
76 operation: Optional[AtKafkaOp] = None
77 account: Optional[AtKafkaAccount] = None
78 identity: Optional[AtKafkaIdentity] = None
79 info: Optional[AtKafkaInfo] = None
80
81 class Config:
82 populate_by_name = True