@@ -8,7 +8,9 @@ const MITHRIL_SIGNER_VERSION_HEADER: &str = "signer-node-version";
8
8
pub fn routes (
9
9
dependency_manager : Arc < DependencyContainer > ,
10
10
) -> impl Filter < Extract = ( impl warp:: Reply , ) , Error = warp:: Rejection > + Clone {
11
- register_signer ( dependency_manager. clone ( ) ) . or ( registered_signers ( dependency_manager) )
11
+ register_signer ( dependency_manager. clone ( ) )
12
+ . or ( registered_signers ( dependency_manager. clone ( ) ) )
13
+ . or ( signers_tickers ( dependency_manager) )
12
14
}
13
15
14
16
/// POST /register-signer
@@ -31,6 +33,16 @@ fn register_signer(
31
33
. and_then ( handlers:: register_signer)
32
34
}
33
35
36
+ /// Get /signers/tickers
37
+ fn signers_tickers (
38
+ dependency_manager : Arc < DependencyContainer > ,
39
+ ) -> impl Filter < Extract = ( impl warp:: Reply , ) , Error = warp:: Rejection > + Clone {
40
+ warp:: path!( "signers" / "tickers" )
41
+ . and ( warp:: get ( ) )
42
+ . and ( middlewares:: with_signer_getter ( dependency_manager) )
43
+ . and_then ( handlers:: signers_tickers)
44
+ }
45
+
34
46
/// Get /signers/registered/:epoch
35
47
fn registered_signers (
36
48
dependency_manager : Arc < DependencyContainer > ,
@@ -42,7 +54,8 @@ fn registered_signers(
42
54
}
43
55
44
56
mod handlers {
45
- use crate :: entities:: SignerRegistrationsMessage ;
57
+ use crate :: database:: provider:: SignerGetter ;
58
+ use crate :: entities:: { SignerRegistrationsMessage , SignerTickerMessage } ;
46
59
use crate :: event_store:: { EventMessage , TransmitterService } ;
47
60
use crate :: { http_server:: routes:: reply, SignerRegisterer , SignerRegistrationError } ;
48
61
use crate :: { FromRegisterSignerAdapter , VerificationKeyStorer } ;
@@ -187,6 +200,30 @@ mod handlers {
187
200
}
188
201
}
189
202
}
203
+
204
+ pub async fn signers_tickers (
205
+ signer_getter : Arc < dyn SignerGetter > ,
206
+ ) -> Result < impl warp:: Reply , Infallible > {
207
+ debug ! ( "⇄ HTTP SERVER: signers/tickers" ) ;
208
+
209
+ match signer_getter. get_all ( ) . await {
210
+ Ok ( signers) => {
211
+ let message: Vec < _ > = signers
212
+ . into_iter ( )
213
+ . map ( |s| SignerTickerMessage {
214
+ party_id : s. signer_id ,
215
+ pool_ticker : s. pool_ticker ,
216
+ has_registered : s. registered_at . is_some ( ) ,
217
+ } )
218
+ . collect ( ) ;
219
+ Ok ( reply:: json ( & message, StatusCode :: OK ) )
220
+ }
221
+ Err ( err) => {
222
+ warn ! ( "registered_signers::error" ; "error" => ?err) ;
223
+ Ok ( reply:: internal_server_error ( err. to_string ( ) ) )
224
+ }
225
+ }
226
+ }
190
227
}
191
228
192
229
#[ cfg( test) ]
@@ -204,6 +241,7 @@ mod tests {
204
241
use serde_json:: Value :: Null ;
205
242
use warp:: { http:: Method , test:: request} ;
206
243
244
+ use crate :: database:: provider:: { MockSignerGetter , SignerRecord } ;
207
245
use crate :: {
208
246
http_server:: SERVER_BASE_PATH , initialize_dependencies,
209
247
signer_registerer:: MockSignerRegisterer , store:: MockVerificationKeyStorer ,
@@ -497,4 +535,79 @@ mod tests {
497
535
& response,
498
536
) ;
499
537
}
538
+
539
+ #[ tokio:: test]
540
+ async fn test_signers_tickers_get_ok ( ) {
541
+ let mut mock_signer_getter = MockSignerGetter :: new ( ) ;
542
+ mock_signer_getter
543
+ . expect_get_all ( )
544
+ . return_once ( || {
545
+ Ok ( vec ! [
546
+ SignerRecord {
547
+ signer_id: "pool_without_ticker" . to_string( ) ,
548
+ pool_ticker: None ,
549
+ created_at: Default :: default ( ) ,
550
+ updated_at: Default :: default ( ) ,
551
+ registered_at: None ,
552
+ } ,
553
+ SignerRecord {
554
+ signer_id: "pool_with_ticker" . to_string( ) ,
555
+ pool_ticker: Some ( "pool_ticker" . to_string( ) ) ,
556
+ created_at: Default :: default ( ) ,
557
+ updated_at: Default :: default ( ) ,
558
+ registered_at: None ,
559
+ } ,
560
+ ] )
561
+ } )
562
+ . once ( ) ;
563
+ let mut dependency_manager = initialize_dependencies ( ) . await ;
564
+ dependency_manager. signer_getter = Arc :: new ( mock_signer_getter) ;
565
+
566
+ let method = Method :: GET . as_str ( ) ;
567
+ let path = "/signers/tickers" ;
568
+
569
+ let response = request ( )
570
+ . method ( method)
571
+ . path ( & format ! ( "/{SERVER_BASE_PATH}{path}" ) )
572
+ . reply ( & setup_router ( Arc :: new ( dependency_manager) ) )
573
+ . await ;
574
+
575
+ APISpec :: verify_conformity (
576
+ APISpec :: get_all_spec_files ( ) ,
577
+ method,
578
+ path,
579
+ "application/json" ,
580
+ & Null ,
581
+ & response,
582
+ ) ;
583
+ }
584
+
585
+ #[ tokio:: test]
586
+ async fn test_signers_tickers_get_ko ( ) {
587
+ let mut mock_signer_getter = MockSignerGetter :: new ( ) ;
588
+ mock_signer_getter
589
+ . expect_get_all ( )
590
+ . return_once ( || Err ( anyhow ! ( "an error" ) ) )
591
+ . once ( ) ;
592
+ let mut dependency_manager = initialize_dependencies ( ) . await ;
593
+ dependency_manager. signer_getter = Arc :: new ( mock_signer_getter) ;
594
+
595
+ let method = Method :: GET . as_str ( ) ;
596
+ let path = "/signers/tickers" ;
597
+
598
+ let response = request ( )
599
+ . method ( method)
600
+ . path ( & format ! ( "/{SERVER_BASE_PATH}{path}" ) )
601
+ . reply ( & setup_router ( Arc :: new ( dependency_manager) ) )
602
+ . await ;
603
+
604
+ APISpec :: verify_conformity (
605
+ APISpec :: get_all_spec_files ( ) ,
606
+ method,
607
+ path,
608
+ "application/json" ,
609
+ & Null ,
610
+ & response,
611
+ ) ;
612
+ }
500
613
}
0 commit comments