Skip to main content

open_payments/client/
api.rs

1use crate::client::{AuthenticatedOpenPaymentsClient, BaseClient};
2use crate::types::{
3    AccessTokenResponse, ContinueResponse, GrantRequest, GrantResponse, IncomingPayment,
4    IncomingPaymentRequest, JsonWebKey, JsonWebKeySet, ListIncomingPaymentsResponse,
5    ListOutgoingPaymentsResponse, OutgoingPayment, OutgoingPaymentGrantSpentAmounts,
6    OutgoingPaymentRequest, PublicIncomingPayment, Quote, QuoteRequest, WalletAddress,
7};
8use crate::{
9    grant::{cancel_grant, continue_grant, request_grant},
10    payments::{
11        complete_incoming_payment, create_incoming_payment, create_outgoing_payment,
12        get_grant_spent_amounts, get_incoming_payment, get_outgoing_payment,
13        get_public_incoming_payment, list_incoming_payments, list_outgoing_payments,
14    },
15    quotes::{create_quote, get_quote},
16    token::{revoke_access_token, rotate_access_token},
17    wallet_address::{get_keys, get_wallet_address},
18    Result,
19};
20pub mod authenticated {
21    use super::*;
22
23    pub struct QuoteResource<'a> {
24        client: &'a AuthenticatedOpenPaymentsClient,
25    }
26
27    impl<'a> QuoteResource<'a> {
28        pub(crate) fn new(client: &'a AuthenticatedOpenPaymentsClient) -> Self {
29            Self { client }
30        }
31
32        pub async fn create(
33            &self,
34            resource_server_url: &str,
35            req_body: &QuoteRequest,
36            access_token: Option<&str>,
37        ) -> Result<Quote> {
38            create_quote(self.client, resource_server_url, req_body, access_token).await
39        }
40
41        pub async fn get(&self, quote_url: &str, access_token: Option<&str>) -> Result<Quote> {
42            get_quote(self.client, quote_url, access_token).await
43        }
44    }
45    pub struct IncomingPaymentResource<'a> {
46        client: &'a AuthenticatedOpenPaymentsClient,
47    }
48
49    impl<'a> IncomingPaymentResource<'a> {
50        pub(crate) fn new(client: &'a AuthenticatedOpenPaymentsClient) -> Self {
51            Self { client }
52        }
53
54        pub async fn create(
55            &self,
56            resource_server_url: &str,
57            req_body: &IncomingPaymentRequest,
58            access_token: Option<&str>,
59        ) -> Result<IncomingPayment> {
60            create_incoming_payment(self.client, resource_server_url, req_body, access_token).await
61        }
62
63        pub async fn get(
64            &self,
65            payment_url: &str,
66            access_token: Option<&str>,
67        ) -> Result<IncomingPayment> {
68            get_incoming_payment(self.client, payment_url, access_token).await
69        }
70
71        pub async fn complete(
72            &self,
73            payment_url: &str,
74            access_token: Option<&str>,
75        ) -> Result<IncomingPayment> {
76            complete_incoming_payment(self.client, payment_url, access_token).await
77        }
78
79        pub async fn list(
80            &self,
81            resource_server_url: &str,
82            wallet_address: &str,
83            cursor: Option<&str>,
84            first: Option<u32>,
85            last: Option<u32>,
86            access_token: Option<&str>,
87        ) -> Result<ListIncomingPaymentsResponse> {
88            list_incoming_payments(
89                self.client,
90                resource_server_url,
91                wallet_address,
92                cursor,
93                first,
94                last,
95                access_token,
96            )
97            .await
98        }
99    }
100
101    pub struct OutgoingPaymentResource<'a> {
102        client: &'a AuthenticatedOpenPaymentsClient,
103    }
104
105    impl<'a> OutgoingPaymentResource<'a> {
106        pub(crate) fn new(client: &'a AuthenticatedOpenPaymentsClient) -> Self {
107            Self { client }
108        }
109
110        pub async fn create(
111            &self,
112            resource_server_url: &str,
113            req_body: &OutgoingPaymentRequest,
114            access_token: Option<&str>,
115        ) -> Result<OutgoingPayment> {
116            create_outgoing_payment(self.client, resource_server_url, req_body, access_token).await
117        }
118
119        pub async fn list(
120            &self,
121            resource_server_url: &str,
122            wallet_address: &str,
123            cursor: Option<&str>,
124            first: Option<u32>,
125            last: Option<u32>,
126            access_token: Option<&str>,
127        ) -> Result<ListOutgoingPaymentsResponse> {
128            list_outgoing_payments(
129                self.client,
130                resource_server_url,
131                wallet_address,
132                cursor,
133                first,
134                last,
135                access_token,
136            )
137            .await
138        }
139
140        pub async fn get(
141            &self,
142            payment_url: &str,
143            access_token: Option<&str>,
144        ) -> Result<OutgoingPayment> {
145            get_outgoing_payment(self.client, payment_url, access_token).await
146        }
147
148        /// Returns spent amounts for the outgoing-payment grant bound to `access_token`.
149        ///
150        /// Maps to `GET /outgoing-payment-grant` on the resource server.
151        pub async fn get_grant_spent_amounts(
152            &self,
153            resource_server_url: &str,
154            access_token: Option<&str>,
155        ) -> Result<OutgoingPaymentGrantSpentAmounts> {
156            get_grant_spent_amounts(self.client, resource_server_url, access_token).await
157        }
158    }
159
160    pub struct Grant<'a> {
161        client: &'a AuthenticatedOpenPaymentsClient,
162    }
163
164    impl<'a> Grant<'a> {
165        pub(crate) fn new(client: &'a AuthenticatedOpenPaymentsClient) -> Self {
166            Self { client }
167        }
168
169        /// Requests a grant from the authorization server.
170        ///
171        /// By default the client's configured wallet address is sent as `client`.
172        /// Pass `client_override` with a [`JsonWebKey`] to use directed identity instead
173        /// (non-interactive grants only).
174        pub async fn request(
175            &self,
176            auth_url: &str,
177            grant: &GrantRequest,
178            client_override: Option<&JsonWebKey>,
179        ) -> Result<GrantResponse> {
180            request_grant(self.client, auth_url, grant, client_override).await
181        }
182
183        pub async fn continue_grant(
184            &self,
185            continue_uri: &str,
186            interact_ref: &str,
187            access_token: Option<&str>,
188        ) -> Result<ContinueResponse> {
189            continue_grant(self.client, continue_uri, interact_ref, access_token).await
190        }
191
192        pub async fn cancel(&self, continue_uri: &str, access_token: Option<&str>) -> Result<()> {
193            cancel_grant(self.client, continue_uri, access_token).await
194        }
195    }
196
197    pub struct Token<'a> {
198        client: &'a AuthenticatedOpenPaymentsClient,
199    }
200
201    impl<'a> Token<'a> {
202        pub(crate) fn new(client: &'a AuthenticatedOpenPaymentsClient) -> Self {
203            Self { client }
204        }
205
206        pub async fn rotate(
207            &self,
208            auth_url: &str,
209            access_token: Option<&str>,
210        ) -> Result<AccessTokenResponse> {
211            rotate_access_token(self.client, auth_url, access_token).await
212        }
213
214        pub async fn revoke(&self, auth_url: &str, access_token: Option<&str>) -> Result<()> {
215            revoke_access_token(self.client, auth_url, access_token).await
216        }
217    }
218}
219
220pub mod unauthenticated {
221    use super::*;
222
223    pub struct WalletAddressResource<'a, C: BaseClient> {
224        client: &'a C,
225    }
226
227    impl<'a, C: BaseClient> WalletAddressResource<'a, C> {
228        pub(crate) fn new(client: &'a C) -> Self {
229            Self { client }
230        }
231
232        pub async fn get(&self, wallet_address_url: &str) -> Result<WalletAddress> {
233            get_wallet_address(self.client.http_client(), wallet_address_url).await
234        }
235
236        pub async fn get_keys(&self, wallet: &WalletAddress) -> Result<JsonWebKeySet> {
237            get_keys(self.client.http_client(), wallet).await
238        }
239
240        pub async fn get_did_document(&self, _wallet: &WalletAddress) -> Result<()> {
241            unimplemented!()
242        }
243    }
244
245    pub struct IncomingPaymentResource<'a, C: BaseClient> {
246        client: &'a C,
247    }
248
249    impl<'a, C: BaseClient> IncomingPaymentResource<'a, C> {
250        pub(crate) fn new(client: &'a C) -> Self {
251            Self { client }
252        }
253
254        pub async fn get(&self, payment_url: &str) -> Result<PublicIncomingPayment> {
255            get_public_incoming_payment(self.client, payment_url).await
256        }
257    }
258}
259
260pub trait AuthenticatedResources {
261    fn quotes(&self) -> authenticated::QuoteResource<'_>;
262    fn incoming_payments(&self) -> authenticated::IncomingPaymentResource<'_>;
263    fn outgoing_payments(&self) -> authenticated::OutgoingPaymentResource<'_>;
264    fn grant(&self) -> authenticated::Grant<'_>;
265    fn token(&self) -> authenticated::Token<'_>;
266}
267
268/// Extension trait for any client (authenticated or not)
269pub trait UnauthenticatedResources: BaseClient + Sized {
270    fn wallet_address(&self) -> unauthenticated::WalletAddressResource<'_, Self>;
271    fn public_incoming_payments(&self) -> unauthenticated::IncomingPaymentResource<'_, Self>;
272}
273
274impl AuthenticatedResources for AuthenticatedOpenPaymentsClient {
275    fn quotes(&self) -> authenticated::QuoteResource<'_> {
276        authenticated::QuoteResource::new(self)
277    }
278
279    fn incoming_payments(&self) -> authenticated::IncomingPaymentResource<'_> {
280        authenticated::IncomingPaymentResource::new(self)
281    }
282
283    fn outgoing_payments(&self) -> authenticated::OutgoingPaymentResource<'_> {
284        authenticated::OutgoingPaymentResource::new(self)
285    }
286
287    fn grant(&self) -> authenticated::Grant<'_> {
288        authenticated::Grant::new(self)
289    }
290
291    fn token(&self) -> authenticated::Token<'_> {
292        authenticated::Token::new(self)
293    }
294}
295
296impl<C: BaseClient> UnauthenticatedResources for C {
297    fn wallet_address(&self) -> unauthenticated::WalletAddressResource<'_, Self> {
298        unauthenticated::WalletAddressResource::new(self)
299    }
300
301    fn public_incoming_payments(&self) -> unauthenticated::IncomingPaymentResource<'_, Self> {
302        unauthenticated::IncomingPaymentResource::new(self)
303    }
304}