11use axum:: {
22 extract:: { Path , Query } ,
33 routing:: get,
4- Router ,
4+ Json , Router ,
5+ } ;
6+ use log:: debug;
7+ use serde:: { Deserialize , Serialize } ;
8+
9+ use crate :: {
10+ api_paged_response:: ApiPagedResponse ,
11+ api_query:: PaginationQuery ,
12+ model:: { BlockContext , PoolSwap } ,
13+ repository:: RepositoryOps ,
14+ Result , SERVICES ,
515} ;
6- use serde:: Deserialize ;
716
817#[ derive( Deserialize ) ]
918struct PoolPair {
@@ -32,6 +41,57 @@ struct DexPrices {
3241 denomination : Option < String > ,
3342}
3443
44+ #[ derive( Serialize , Deserialize , Debug , Clone ) ]
45+ #[ serde( rename_all = "camelCase" ) ]
46+ pub struct PoolSwapFromToData {
47+ address : String ,
48+ amount : String ,
49+ // symbol: String,
50+ // display_symbol: String,
51+ }
52+
53+ #[ derive( Serialize , Deserialize , Debug , Clone ) ]
54+ #[ serde( rename_all = "camelCase" ) ]
55+ pub struct PoolSwapData {
56+ id : String ,
57+ sort : String ,
58+ txid : String ,
59+ txno : usize ,
60+ pool_pair_id : String ,
61+ from_amount : String ,
62+ from_token_id : u64 ,
63+ block : BlockContext ,
64+ from : PoolSwapFromToData ,
65+ to : PoolSwapFromToData ,
66+ }
67+
68+ impl From < PoolSwap > for PoolSwapData {
69+ fn from ( v : PoolSwap ) -> Self {
70+ Self {
71+ id : v. id ,
72+ sort : v. sort ,
73+ txid : v. txid . to_string ( ) ,
74+ txno : v. txno ,
75+ pool_pair_id : v. pool_id . to_string ( ) ,
76+ from_amount : v. from_amount . to_string ( ) ,
77+ from_token_id : v. from_token_id ,
78+ from : PoolSwapFromToData {
79+ address : v. from . to_hex_string ( ) ,
80+ amount : v. from_amount . to_string ( ) ,
81+ // symbol: todo!(),
82+ // display_symbol: todo!(),
83+ } ,
84+ to : PoolSwapFromToData {
85+ address : v. to . to_hex_string ( ) ,
86+ amount : v. to_amount . to_string ( ) ,
87+ // symbol: todo!(),
88+ // display_symbol: todo!(),
89+ } ,
90+ block : v. block ,
91+ }
92+ }
93+ }
94+
3595async fn list_poolpairs ( ) -> String {
3696 "List of poolpairs" . to_string ( )
3797}
@@ -40,12 +100,55 @@ async fn get_poolpair(Path(PoolPair { id }): Path<PoolPair>) -> String {
40100 format ! ( "Details of poolpair with id {}" , id)
41101}
42102
43- async fn list_pool_swaps ( Path ( PoolPair { id } ) : Path < PoolPair > ) -> String {
44- format ! ( "List of swaps for poolpair {}" , id)
45- }
103+ // Use single method for now since additional verbose keys are indexed
104+ // TODO: assess need for additional verbose method
105+ async fn list_pool_swaps (
106+ Path ( id) : Path < u32 > ,
107+ Query ( query) : Query < PaginationQuery > ,
108+ ) -> Result < Json < ApiPagedResponse < PoolSwapData > > > {
109+ debug ! ( "list_pool_swaps for id {id}" , ) ;
110+ let next = query
111+ . next
112+ . map ( |q| {
113+ let parts: Vec < & str > = q. split ( '-' ) . collect ( ) ;
114+ if parts. len ( ) != 2 {
115+ return Err ( "Invalid query format" ) ;
116+ }
117+
118+ let height = parts[ 0 ] . parse :: < u32 > ( ) . map_err ( |_| "Invalid height" ) ?;
119+ let txno = parts[ 1 ] . parse :: < usize > ( ) . map_err ( |_| "Invalid txno" ) ?;
120+
121+ Ok ( ( height, txno) )
122+ } )
123+ . transpose ( ) ?
124+ . unwrap_or_default ( ) ;
125+
126+ debug ! ( "next : {:?}" , next) ;
127+
128+ let size = if query. size > 0 && query. size < 20 {
129+ query. size
130+ } else {
131+ 20
132+ } ;
133+
134+ let swaps = SERVICES
135+ . pool
136+ . by_id
137+ . list ( Some ( ( id, next. 0 , next. 1 ) ) ) ?
138+ . take ( size)
139+ . take_while ( |item| match item {
140+ Ok ( ( k, _) ) => k. 0 == id,
141+ _ => true ,
142+ } )
143+ . map ( |item| {
144+ let ( _, swap) = item?;
145+ Ok ( PoolSwapData :: from ( swap) )
146+ } )
147+ . collect :: < Result < Vec < _ > > > ( ) ?;
46148
47- async fn list_pool_swaps_verbose ( Path ( PoolPair { id } ) : Path < PoolPair > ) -> String {
48- format ! ( "Verbose list of swaps for poolpair {}" , id)
149+ Ok ( Json ( ApiPagedResponse :: of ( swaps, query. size , |swap| {
150+ swap. sort . to_string ( )
151+ } ) ) )
49152}
50153
51154async fn list_pool_swap_aggregates (
@@ -94,7 +197,7 @@ pub fn router() -> Router {
94197 . route ( "/" , get ( list_poolpairs) )
95198 . route ( "/:id" , get ( get_poolpair) )
96199 . route ( "/:id/swaps" , get ( list_pool_swaps) )
97- . route ( "/:id/swaps/verbose" , get ( list_pool_swaps_verbose ) )
200+ . route ( "/:id/swaps/verbose" , get ( list_pool_swaps ) )
98201 . route (
99202 "/:id/swaps/aggregate/:interval" ,
100203 get ( list_pool_swap_aggregates) ,
0 commit comments