Skip to main content

open_payments/types/
resource.rs

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/// Spent amounts for the current outgoing-payment grant (`GET /outgoing-payment-grant`).
179///
180/// Both fields are always present in the JSON; values may be `null`.
181#[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}