1use bee_block::payload::milestone::option::dto::ReceiptMilestoneOptionDto;
5use bee_ledger_types::Receipt;
6#[cfg(feature = "peer")]
7use bee_protocol_types::peer::Peer;
8use serde::{Deserialize, Serialize};
9
10#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
12pub struct PeerDto {
13    pub id: String,
14    #[serde(rename = "multiAddresses")]
15    pub multi_addresses: Vec<String>,
16    #[serde(skip_serializing_if = "Option::is_none")]
17    pub alias: Option<String>,
18    pub relation: RelationDto,
19    pub connected: bool,
20    #[serde(skip_serializing_if = "Option::is_none")]
21    pub gossip: Option<GossipDto>,
22}
23
24#[cfg(feature = "peer")]
25impl From<&Peer> for PeerDto {
26    fn from(peer: &Peer) -> Self {
27        PeerDto {
28            id: peer.id().to_string(),
29            alias: Some(peer.alias().to_string()),
30            multi_addresses: vec![peer.address().to_string()],
31            relation: {
32                if peer.relation().is_known() {
33                    RelationDto::Known
34                } else if peer.relation().is_unknown() {
35                    RelationDto::Unknown
36                } else {
37                    RelationDto::Autopeered
38                }
39            },
40            connected: peer.is_connected(),
41            gossip: Some(GossipDto {
42                heartbeat: HeartbeatDto {
43                    solid_milestone_index: *peer.solid_milestone_index(),
44                    pruned_milestone_index: *peer.pruned_index(),
45                    latest_milestone_index: *peer.latest_milestone_index(),
46                    connected_peers: peer.connected_peers(),
47                    synced_peers: peer.synced_peers(),
48                },
49                metrics: MetricsDto {
50                    new_blocks: peer.metrics().new_blocks(),
51                    received_blocks: peer.metrics().blocks_received(),
52                    known_blocks: peer.metrics().known_blocks(),
53                    received_block_requests: peer.metrics().block_requests_received(),
54                    received_milestone_requests: peer.metrics().milestone_requests_received(),
55                    received_heartbeats: peer.metrics().heartbeats_received(),
56                    sent_blocks: peer.metrics().blocks_sent(),
57                    sent_block_requests: peer.metrics().block_requests_sent(),
58                    sent_milestone_requests: peer.metrics().milestone_requests_sent(),
59                    sent_heartbeats: peer.metrics().heartbeats_sent(),
60                    dropped_packets: 0,
61                },
62            }),
63        }
64    }
65}
66
67#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize, Default)]
69pub struct GossipDto {
70    pub heartbeat: HeartbeatDto,
71    pub metrics: MetricsDto,
72}
73
74#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
76pub enum RelationDto {
77    #[serde(rename = "known")]
78    Known,
79    #[serde(rename = "unknown")]
80    Unknown,
81    #[serde(rename = "autopeered")]
82    Autopeered,
83}
84
85#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)]
87pub struct HeartbeatDto {
88    #[serde(rename = "solidMilestoneIndex")]
89    pub solid_milestone_index: u32,
90    #[serde(rename = "prunedMilestoneIndex")]
91    pub pruned_milestone_index: u32,
92    #[serde(rename = "latestMilestoneIndex")]
93    pub latest_milestone_index: u32,
94    #[serde(rename = "connectedPeers")]
95    pub connected_peers: u8,
96    #[serde(rename = "syncedPeers")]
97    pub synced_peers: u8,
98}
99
100#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)]
102pub struct MetricsDto {
103    #[serde(rename = "newBlocks")]
104    pub new_blocks: u64,
105    #[serde(rename = "receivedBlocks")]
106    pub received_blocks: u64,
107    #[serde(rename = "knownBlocks")]
108    pub known_blocks: u64,
109    #[serde(rename = "receivedBlockRequests")]
110    pub received_block_requests: u64,
111    #[serde(rename = "receivedMilestoneRequests")]
112    pub received_milestone_requests: u64,
113    #[serde(rename = "receivedHeartbeats")]
114    pub received_heartbeats: u64,
115    #[serde(rename = "sentBlocks")]
116    pub sent_blocks: u64,
117    #[serde(rename = "sentBlockRequests")]
118    pub sent_block_requests: u64,
119    #[serde(rename = "sentMilestoneRequests")]
120    pub sent_milestone_requests: u64,
121    #[serde(rename = "sentHeartbeats")]
122    pub sent_heartbeats: u64,
123    #[serde(rename = "droppedPackets")]
124    pub dropped_packets: u64,
125}
126
127#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
129pub struct ReceiptDto {
130    pub receipt: ReceiptMilestoneOptionDto,
131    #[serde(rename = "milestoneIndex")]
132    pub milestone_index: u32,
133}
134
135impl From<Receipt> for ReceiptDto {
136    fn from(value: Receipt) -> Self {
137        ReceiptDto {
138            receipt: value.inner().into(),
139            milestone_index: **value.included_in(),
140        }
141    }
142}
143
144#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
146pub enum LedgerInclusionStateDto {
147    #[serde(rename = "conflicting")]
148    Conflicting,
149    #[serde(rename = "included")]
150    Included,
151    #[serde(rename = "noTransaction")]
152    NoTransaction,
153}