1use crate::types::common::{Amount, Receiver};
2use chrono::{DateTime, Utc};
3use serde::{Deserialize, Serialize};
4use serde_json::Value;
5
6#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
7#[serde(rename_all = "camelCase")]
8pub struct IncomingPayment {
9 pub id: String,
10 pub wallet_address: String,
11 pub completed: bool,
12 #[serde(skip_serializing_if = "Option::is_none")]
13 pub incoming_amount: Option<Amount>,
14 pub received_amount: Amount,
15 #[serde(skip_serializing_if = "Option::is_none")]
16 pub expires_at: Option<DateTime<Utc>>,
17 #[serde(skip_serializing_if = "Option::is_none")]
18 pub metadata: Option<Value>,
19 pub created_at: DateTime<Utc>,
20 #[serde(skip_serializing_if = "Option::is_none")]
21 pub updated_at: Option<DateTime<Utc>>,
22 #[serde(skip_serializing_if = "Option::is_none")]
23 pub methods: Option<Vec<PaymentMethod>>,
24}
25
26#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
27#[serde(rename_all = "camelCase")]
28pub struct IncomingPaymentWithMethods {
29 #[serde(flatten)]
30 pub payment: IncomingPayment,
31 pub methods: Vec<PaymentMethod>,
32}
33
34#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
35#[serde(tag = "type", rename_all = "lowercase")]
36pub enum PaymentMethod {
37 #[serde(rename = "ilp")]
38 Ilp {
39 #[serde(rename = "ilpAddress")]
40 ilp_address: String,
41 #[serde(rename = "sharedSecret")]
42 shared_secret: String,
43 },
44}
45
46#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
47#[serde(rename_all = "camelCase")]
48pub struct PublicIncomingPayment {
49 pub received_amount: Amount,
50 pub auth_server: String,
51}
52
53#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
54#[serde(rename_all = "camelCase")]
55pub struct CreateIncomingPaymentRequest {
56 pub wallet_address: String,
57 #[serde(skip_serializing_if = "Option::is_none")]
58 pub incoming_amount: Option<Amount>,
59 #[serde(skip_serializing_if = "Option::is_none")]
60 pub expires_at: Option<DateTime<Utc>>,
61 #[serde(skip_serializing_if = "Option::is_none")]
62 pub metadata: Option<Value>,
63}
64
65#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
66#[serde(rename_all = "camelCase")]
67pub struct OutgoingPayment {
68 pub id: String,
69 pub wallet_address: String,
70 #[serde(skip_serializing_if = "Option::is_none")]
71 pub quote_id: Option<String>,
72 pub failed: bool,
73 pub receiver: Receiver,
74 pub receive_amount: Amount,
75 pub debit_amount: Amount,
76 pub sent_amount: Amount,
77 #[serde(skip_serializing_if = "Option::is_none")]
78 pub grant_spent_debit_amount: Option<Amount>,
79 #[serde(skip_serializing_if = "Option::is_none")]
80 pub grant_spent_receive_amount: Option<Amount>,
81 #[serde(skip_serializing_if = "Option::is_none")]
82 pub metadata: Option<Value>,
83 pub created_at: DateTime<Utc>,
84 #[serde(skip_serializing_if = "Option::is_none")]
85 pub updated_at: Option<DateTime<Utc>>,
86}
87
88#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
89#[serde(untagged)]
90pub enum CreateQuoteRequest {
91 FixedReceiveAmountQuote {
92 #[serde(rename = "walletAddress")]
93 wallet_address: String,
94 receiver: Receiver,
95 method: PaymentMethodType,
96 #[serde(rename = "receiveAmount")]
97 receive_amount: Amount,
98 },
99 FixedSendAmountQuote {
100 #[serde(rename = "walletAddress")]
101 wallet_address: String,
102 receiver: Receiver,
103 method: PaymentMethodType,
104 #[serde(rename = "debitAmount")]
105 debit_amount: Amount,
106 },
107 NoAmountQuote {
108 #[serde(rename = "walletAddress")]
109 wallet_address: String,
110 receiver: Receiver,
111 method: PaymentMethodType,
112 },
113}
114
115#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
116#[serde(untagged)]
117pub enum CreateOutgoingPaymentRequest {
118 FromQuote {
119 #[serde(rename = "walletAddress")]
120 wallet_address: String,
121 #[serde(rename = "quoteId")]
122 quote_id: String,
123 #[serde(skip_serializing_if = "Option::is_none")]
124 metadata: Option<Value>,
125 },
126 FromIncomingPayment {
127 #[serde(rename = "walletAddress")]
128 wallet_address: String,
129 #[serde(rename = "incomingPayment")]
130 incoming_payment_id: String,
131 #[serde(rename = "debitAmount")]
132 debit_amount: Amount,
133 #[serde(skip_serializing_if = "Option::is_none")]
134 metadata: Option<Value>,
135 },
136}
137
138#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
139#[serde(rename_all = "camelCase")]
140pub struct Quote {
141 pub id: String,
142 pub wallet_address: String,
143 pub receiver: Receiver,
144 pub receive_amount: Amount,
145 pub debit_amount: Amount,
146 pub method: PaymentMethodType,
147 #[serde(skip_serializing_if = "Option::is_none")]
148 pub expires_at: Option<DateTime<Utc>>,
149 pub created_at: DateTime<Utc>,
150}
151
152#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
153#[serde(rename_all = "lowercase")]
154pub enum PaymentMethodType {
155 Ilp,
156}
157
158#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
159#[serde(rename_all = "camelCase")]
160pub struct PageInfo {
161 #[serde(skip_serializing_if = "Option::is_none")]
162 pub start_cursor: Option<String>,
163 #[serde(skip_serializing_if = "Option::is_none")]
164 pub end_cursor: Option<String>,
165 pub has_next_page: bool,
166 pub has_previous_page: bool,
167}
168
169#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
170pub struct PaginatedResponse<T> {
171 pub pagination: PageInfo,
172 pub result: Vec<T>,
173}
174
175pub type ListIncomingPaymentsResponse = PaginatedResponse<IncomingPayment>;
176pub type ListOutgoingPaymentsResponse = PaginatedResponse<OutgoingPayment>;
177
178#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
182#[serde(rename_all = "camelCase")]
183pub struct OutgoingPaymentGrantSpentAmounts {
184 pub spent_receive_amount: Option<Amount>,
185 pub spent_debit_amount: Option<Amount>,
186}