@@ -7,6 +7,7 @@ use interledger_errors::*;
7
7
use interledger_http:: { deserialize_json, HttpAccount , HttpStore } ;
8
8
use interledger_ildcp:: IldcpRequest ;
9
9
use interledger_ildcp:: IldcpResponse ;
10
+ use interledger_packet:: Address ;
10
11
use interledger_rates:: ExchangeRateStore ;
11
12
use interledger_router:: RouterStore ;
12
13
use interledger_service:: {
@@ -22,6 +23,7 @@ use serde::{Deserialize, Serialize};
22
23
use serde_json:: json;
23
24
use std:: convert:: TryFrom ;
24
25
use std:: fmt:: Debug ;
26
+ use std:: str:: FromStr ;
25
27
use tracing:: { debug, error, trace} ;
26
28
use uuid:: Uuid ;
27
29
use warp:: { self , reply:: Json , Filter , Rejection } ;
@@ -423,7 +425,7 @@ where
423
425
let server_secret_clone = server_secret. clone ( ) ;
424
426
let get_spsp = warp:: get ( )
425
427
. and ( warp:: path ( "accounts" ) )
426
- . and ( account_username_to_id)
428
+ . and ( account_username_to_id. clone ( ) )
427
429
. and ( warp:: path ( "spsp" ) )
428
430
. and ( warp:: path:: end ( ) )
429
431
. and ( with_store. clone ( ) )
@@ -442,6 +444,46 @@ where
442
444
}
443
445
} ) ;
444
446
447
+ // GET /accounts/:username/spsp/tracking_info
448
+ let server_secret_clone = server_secret. clone ( ) ;
449
+ let get_spsp_with_tracking = warp:: get ( )
450
+ . and ( warp:: path ( "accounts" ) )
451
+ . and ( account_username_to_id)
452
+ . and ( warp:: path ( "spsp" ) )
453
+ . and ( warp:: path:: param :: < String > ( ) )
454
+ . and ( warp:: path:: end ( ) )
455
+ . and ( with_store. clone ( ) )
456
+ . and_then ( move |id : Uuid , tracking_info : String , store : S | {
457
+ let server_secret_clone = server_secret_clone. clone ( ) ;
458
+ async move {
459
+ let accounts = store. get_accounts ( vec ! [ id] ) . await ?;
460
+ // TODO return the response without instantiating an SpspResponder (use a simple fn)
461
+
462
+ let with_tracking = format ! ( "{}.{}" , accounts[ 0 ] . ilp_address( ) , tracking_info) ;
463
+ match Address :: from_str ( & with_tracking) {
464
+ Ok ( addr) => {
465
+ trace ! (
466
+ account_id = %id,
467
+ "Appended tracking info: {}" ,
468
+ addr,
469
+ ) ;
470
+ Ok :: < _ , Rejection > (
471
+ SpspResponder :: new ( addr, server_secret_clone. clone ( ) )
472
+ . generate_http_response ( ) ,
473
+ )
474
+ }
475
+ Err ( err) => {
476
+ let msg = format ! ( "Error appending tracking info: {}" , err) ;
477
+ error ! ( address_with_tracking = ?with_tracking, "{}" , msg) ;
478
+ // TODO give a different error message depending on what type of error it is
479
+ Err ( Rejection :: from (
480
+ ApiError :: internal_server_error ( ) . detail ( msg) ,
481
+ ) )
482
+ }
483
+ }
484
+ }
485
+ } ) ;
486
+
445
487
// GET /.well-known/pay
446
488
// This is the endpoint a [Payment Pointer](https://github.com/interledger/rfcs/blob/master/0026-payment-pointers/0026-payment-pointers.md)
447
489
// with no path resolves to
@@ -483,6 +525,7 @@ where
483
525
// See `combine!` docs for more details.
484
526
combine ! (
485
527
get_spsp,
528
+ get_spsp_with_tracking,
486
529
get_spsp_well_known,
487
530
post_accounts,
488
531
get_accounts,
0 commit comments