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>;