Skip to main content

relay_knowledge/api/operations/
proposal.rs

1use serde::{Deserialize, Serialize};
2
3use crate::{
4    api::ApiMetadata,
5    domain::{CommitReceipt, ProposalConflictRecord, ProposalRecord, ProposalState},
6};
7
8/// Proposal list filter.
9#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
10pub struct ProposalListApiRequest {
11    #[serde(skip_serializing_if = "Option::is_none")]
12    pub state: Option<ProposalState>,
13    pub limit: usize,
14}
15
16/// Proposal list response.
17#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
18pub struct ProposalListResponse {
19    pub metadata: ApiMetadata,
20    pub proposals: Vec<ProposalRecord>,
21}
22
23/// Proposal detail response with conflict lifecycle.
24#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
25pub struct ProposalShowResponse {
26    pub metadata: ApiMetadata,
27    pub proposal: ProposalRecord,
28    pub conflicts: Vec<ProposalConflictRecord>,
29    pub payload: serde_json::Value,
30}
31
32/// Manual proposal decision request.
33#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
34pub struct ProposalDecisionApiRequest {
35    pub actor: String,
36    #[serde(skip_serializing_if = "Option::is_none")]
37    pub reason: Option<String>,
38}
39
40/// Manual proposal decision response.
41#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
42pub struct ProposalDecisionResponse {
43    pub metadata: ApiMetadata,
44    pub proposal: ProposalRecord,
45    #[serde(skip_serializing_if = "Option::is_none")]
46    pub receipt: Option<CommitReceipt>,
47    #[serde(skip_serializing_if = "Option::is_none")]
48    pub index_refresh_error: Option<String>,
49}