Skip to content

Commit 74f8ac2

Browse files
committed
Support pagination in ListPayments API.
1 parent bfea65c commit 74f8ac2

2 files changed

Lines changed: 77 additions & 42 deletions

File tree

Lines changed: 43 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,54 @@
11
use crate::api::error::LdkServerError;
2+
use crate::api::error::LdkServerErrorCode::InternalServerError;
3+
use crate::io::{PAYMENTS_PERSISTENCE_PRIMARY_NAMESPACE, PAYMENTS_PERSISTENCE_SECONDARY_NAMESPACE};
24
use crate::service::Context;
3-
use crate::util::proto_adapter::payment_to_proto;
5+
use bytes::Bytes;
46
use ldk_server_protos::api::{ListPaymentsRequest, ListPaymentsResponse};
7+
use ldk_server_protos::types::{PageToken, Payment};
8+
use prost::Message;
59

610
pub(crate) const LIST_PAYMENTS_PATH: &str = "ListPayments";
711

812
pub(crate) fn handle_list_payments_request(
9-
context: Context, _request: ListPaymentsRequest,
13+
context: Context, request: ListPaymentsRequest,
1014
) -> Result<ListPaymentsResponse, LdkServerError> {
11-
let payments = context.node.list_payments().into_iter().map(|p| payment_to_proto(p)).collect();
15+
let page_token = request.page_token.map(|p| (p.token, p.index));
16+
let list_response = context
17+
.paginated_kv_store
18+
.list(
19+
PAYMENTS_PERSISTENCE_PRIMARY_NAMESPACE,
20+
PAYMENTS_PERSISTENCE_SECONDARY_NAMESPACE,
21+
page_token,
22+
)
23+
.map_err(|e| {
24+
LdkServerError::new(InternalServerError, format!("Failed to list payments: {}", e))
25+
})?;
1226

13-
let response = ListPaymentsResponse { payments };
27+
let mut payments: Vec<Payment> = Vec::with_capacity(list_response.keys.len());
28+
for key in list_response.keys {
29+
let payment_bytes = context
30+
.paginated_kv_store
31+
.read(
32+
PAYMENTS_PERSISTENCE_PRIMARY_NAMESPACE,
33+
PAYMENTS_PERSISTENCE_SECONDARY_NAMESPACE,
34+
&key,
35+
)
36+
.map_err(|e| {
37+
LdkServerError::new(
38+
InternalServerError,
39+
format!("Failed to read payment data: {}", e),
40+
)
41+
})?;
42+
let payment = Payment::decode(Bytes::from(payment_bytes)).map_err(|e| {
43+
LdkServerError::new(InternalServerError, format!("Failed to decode payment: {}", e))
44+
})?;
45+
payments.push(payment);
46+
}
47+
let response = ListPaymentsResponse {
48+
payments,
49+
next_page_token: list_response
50+
.next_page_token
51+
.map(|(token, index)| PageToken { token, index }),
52+
};
1453
Ok(response)
1554
}

ldk-server/src/main.rs

Lines changed: 34 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ mod util;
55

66
use crate::service::NodeService;
77

8-
use ldk_node::{Builder, Event};
8+
use ldk_node::{Builder, Event, Node};
99

1010
use tokio::net::TcpListener;
1111
use tokio::signal::unix::SignalKind;
@@ -24,7 +24,7 @@ use crate::util::config::load_config;
2424
use crate::util::proto_adapter::{forwarded_payment_to_proto, payment_to_proto};
2525
use hex::DisplayHex;
2626
use ldk_node::config::Config;
27-
use ldk_node::lightning::util::persist::KVStore;
27+
use ldk_node::lightning::ln::channelmanager::PaymentId;
2828
use ldk_node::logger::LogLevel;
2929
use prost::Message;
3030
use rand::Rng;
@@ -35,38 +35,6 @@ use std::time::{SystemTime, UNIX_EPOCH};
3535

3636
const USAGE_GUIDE: &str = "Usage: ldk-server <config_path>";
3737

38-
macro_rules! upsert_payment_details {
39-
($event_node:expr, $paginated_store:expr, $payment_id:expr) => {{
40-
if let Some(payment_details) = $event_node.payment($payment_id) {
41-
let payment = payment_to_proto(payment_details);
42-
let time = SystemTime::now()
43-
.duration_since(UNIX_EPOCH)
44-
.expect("Time must be > 1970")
45-
.as_secs() as i64;
46-
47-
match $paginated_store.write(
48-
PAYMENTS_PERSISTENCE_PRIMARY_NAMESPACE,
49-
PAYMENTS_PERSISTENCE_SECONDARY_NAMESPACE,
50-
&$payment_id.0.to_lower_hex_string(),
51-
time,
52-
&payment.encode_to_vec(),
53-
) {
54-
Ok(_) => {
55-
$event_node.event_handled();
56-
},
57-
Err(e) => {
58-
eprintln!("Failed to write payment to persistence: {}", e);
59-
},
60-
}
61-
} else {
62-
eprintln!(
63-
"Unable to find payment with paymentId: {}",
64-
$payment_id.0.to_lower_hex_string()
65-
);
66-
}
67-
}};
68-
}
69-
7038
fn main() {
7139
let args: Vec<String> = std::env::args().collect();
7240

@@ -181,18 +149,18 @@ fn main() {
181149
payment_id, payment_hash, amount_msat
182150
);
183151
let payment_id = payment_id.expect("PaymentId expected for ldk-server >=0.1");
184-
upsert_payment_details!(event_node, &paginated_store, &payment_id);
152+
upsert_payment_details(&event_node, Arc::clone(&paginated_store) as Arc<dyn PaginatedKVStore>, &payment_id);
185153
},
186154
Event::PaymentSuccessful {payment_id, ..} => {
187155
let payment_id = payment_id.expect("PaymentId expected for ldk-server >=0.1");
188-
upsert_payment_details!(event_node, &paginated_store, &payment_id);
156+
upsert_payment_details(&event_node, Arc::clone(&paginated_store) as Arc<dyn PaginatedKVStore>, &payment_id);
189157
},
190158
Event::PaymentFailed {payment_id, ..} => {
191159
let payment_id = payment_id.expect("PaymentId expected for ldk-server >=0.1");
192-
upsert_payment_details!(event_node, &paginated_store, &payment_id);
160+
upsert_payment_details(&event_node, Arc::clone(&paginated_store) as Arc<dyn PaginatedKVStore>, &payment_id);
193161
},
194162
Event::PaymentClaimable {payment_id, ..} => {
195-
upsert_payment_details!(event_node, &paginated_store, &payment_id);
163+
upsert_payment_details(&event_node, Arc::clone(&paginated_store) as Arc<dyn PaginatedKVStore>, &payment_id);
196164
},
197165
Event::PaymentForwarded {
198166
prev_channel_id,
@@ -280,3 +248,31 @@ fn main() {
280248
node.stop().expect("Shutdown should always succeed.");
281249
println!("Shutdown complete..");
282250
}
251+
252+
fn upsert_payment_details(
253+
event_node: &Node, paginated_store: Arc<dyn PaginatedKVStore>, payment_id: &PaymentId,
254+
) {
255+
if let Some(payment_details) = event_node.payment(payment_id) {
256+
let payment = payment_to_proto(payment_details);
257+
let time =
258+
SystemTime::now().duration_since(UNIX_EPOCH).expect("Time must be > 1970").as_secs()
259+
as i64;
260+
261+
match paginated_store.write(
262+
PAYMENTS_PERSISTENCE_PRIMARY_NAMESPACE,
263+
PAYMENTS_PERSISTENCE_SECONDARY_NAMESPACE,
264+
&payment_id.0.to_lower_hex_string(),
265+
time,
266+
&payment.encode_to_vec(),
267+
) {
268+
Ok(_) => {
269+
event_node.event_handled();
270+
},
271+
Err(e) => {
272+
eprintln!("Failed to write payment to persistence: {}", e);
273+
},
274+
}
275+
} else {
276+
eprintln!("Unable to find payment with paymentId: {}", payment_id.0.to_lower_hex_string());
277+
}
278+
}

0 commit comments

Comments
 (0)