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