1717// along with this program. If not, see <https://www.gnu.org/licenses/>.
1818
1919#![ deny( warnings) ]
20+ use crate :: ai:: api_stream;
21+ use crate :: auth:: { create_jwt, AuthQuery , AuthQueryLimit , Payload } ;
22+ use crate :: cli:: COMMAND ;
23+ use crate :: contracts:: check_agreement_and_consumer;
24+ use crate :: graphql:: { exchange_rate_query, PAYG_QUERY } ;
25+ use crate :: metrics:: { get_owner_metrics, MetricsNetwork , MetricsQuery } ;
26+ use crate :: payg:: {
27+ extend_channel, fetch_channel_cache, merket_price, merket_price_with_exchange_rate_price,
28+ open_state, pay_channel, query_multiple_state, query_single_state, AuthPayg ,
29+ } ;
30+ use crate :: project:: get_project;
31+ use crate :: sentry_log:: make_sentry_message;
32+ use crate :: websocket:: { connect_to_project_ws, handle_websocket, validate_project, QueryType } ;
33+ use crate :: {
34+ account:: { get_indexer, indexer_healthy} ,
35+ auth:: AuthWhitelistQuery ,
36+ } ;
2037use axum:: extract:: ws:: WebSocket ;
2138use axum:: {
22- extract:: { ConnectInfo , Path , WebSocketUpgrade } ,
39+ extract:: { ConnectInfo , Path , Query , WebSocketUpgrade } ,
2340 http:: {
2441 header:: { self , HeaderMap , HeaderValue } ,
2542 Method , Response , StatusCode ,
@@ -34,7 +51,10 @@ use base64::{engine::general_purpose, Engine as _};
3451use ethers:: prelude:: U256 ;
3552use serde:: { Deserialize , Serialize } ;
3653use serde_json:: { json, Value } ;
37- use std:: net:: { IpAddr , Ipv4Addr , SocketAddr } ;
54+ use std:: {
55+ collections:: HashMap ,
56+ net:: { IpAddr , Ipv4Addr , SocketAddr } ,
57+ } ;
3858use subql_indexer_utils:: {
3959 eip712:: { recover_consumer_token_payload, recover_indexer_token_payload} ,
4060 error:: Error ,
@@ -44,23 +64,6 @@ use subql_indexer_utils::{
4464} ;
4565use tower_http:: cors:: { Any , CorsLayer } ;
4666
47- use crate :: ai:: api_stream;
48- use crate :: auth:: { create_jwt, AuthQuery , AuthQueryLimit , Payload } ;
49- use crate :: cli:: COMMAND ;
50- use crate :: contracts:: check_agreement_and_consumer;
51- use crate :: metrics:: { get_owner_metrics, MetricsNetwork , MetricsQuery } ;
52- use crate :: payg:: {
53- extend_channel, fetch_channel_cache, merket_price, open_state, pay_channel,
54- query_multiple_state, query_single_state, AuthPayg ,
55- } ;
56- use crate :: project:: get_project;
57- use crate :: sentry_log:: make_sentry_message;
58- use crate :: websocket:: { connect_to_project_ws, handle_websocket, validate_project, QueryType } ;
59- use crate :: {
60- account:: { get_indexer, indexer_healthy} ,
61- auth:: AuthWhitelistQuery ,
62- } ;
63-
6467#[ derive( Serialize ) ]
6568pub struct QueryUri {
6669 /// the url refer to specific project
@@ -413,7 +416,36 @@ async fn query_limit_handler(
413416 } ) ) )
414417}
415418
416- async fn payg_price ( ) -> Result < Json < Value > , Error > {
419+ #[ derive( Serialize , Deserialize , Debug ) ]
420+ pub struct RawPaygPriceItem {
421+ pub id : String ,
422+ pub price : String ,
423+ pub token : String ,
424+ pub expiration : u64 ,
425+ pub overflow : u64 ,
426+ }
427+
428+ // http://localhost/payg-price?exchange_price=19000000000000000000
429+ async fn payg_price (
430+ Query ( query_map) : Query < HashMap < String , String > > ,
431+ ) -> Result < Json < Value > , Error > {
432+ let query = if let Some ( exchange_price) = query_map. get ( "exchange_price" ) {
433+ GraphQLQuery :: query ( & exchange_rate_query ( exchange_price) )
434+ } else {
435+ GraphQLQuery :: query ( PAYG_QUERY )
436+ } ;
437+ let url = COMMAND . graphql_url ( ) ;
438+ if let Ok ( value) = graphql_request ( & url, & query) . await {
439+ if let Some ( item) = value. pointer ( "/data/getAlivePaygs" ) {
440+ let price_items: Vec < RawPaygPriceItem > =
441+ serde_json:: from_str ( item. to_string ( ) . as_str ( ) )
442+ . map_err ( |_e| Error :: Serialize ( 1120 ) ) ?;
443+ // warn!("price_items: {:?}", price_items);
444+ let projects = merket_price_with_exchange_rate_price ( & price_items) . await ?;
445+ return Ok ( Json ( projects) ) ;
446+ }
447+ }
448+
417449 let projects = merket_price ( None ) . await ?;
418450 Ok ( Json ( projects) )
419451}
0 commit comments