@@ -6,7 +6,7 @@ use crate::http_server::routes::router::RouterState;
6
6
pub fn routes (
7
7
router_state : & RouterState ,
8
8
) -> impl Filter < Extract = ( impl warp:: Reply , ) , Error = warp:: Rejection > + Clone {
9
- post_statistics ( router_state)
9
+ post_statistics ( router_state) . or ( post_cardano_database_immutable_files_restored ( router_state ) )
10
10
}
11
11
12
12
/// POST /statistics/snapshot
@@ -22,12 +22,27 @@ fn post_statistics(
22
22
. and_then ( handlers:: post_snapshot_statistics)
23
23
}
24
24
25
+ /// POST /statistics/cardano-database/immutable-files-restored
26
+ fn post_cardano_database_immutable_files_restored (
27
+ router_state : & RouterState ,
28
+ ) -> impl Filter < Extract = ( impl warp:: Reply , ) , Error = warp:: Rejection > + Clone {
29
+ warp:: path!( "statistics" / "cardano-database" / "immutable-files-restored" )
30
+ . and ( warp:: post ( ) )
31
+ . and ( warp:: body:: json ( ) )
32
+ . and ( middlewares:: with_logger ( router_state) )
33
+ . and ( middlewares:: with_event_transmitter ( router_state) )
34
+ . and ( middlewares:: with_metrics_service ( router_state) )
35
+ . and_then ( handlers:: post_cardano_database_immutable_files_restored)
36
+ }
37
+
25
38
mod handlers {
26
39
use slog:: warn;
27
40
use std:: { convert:: Infallible , sync:: Arc } ;
28
41
use warp:: http:: StatusCode ;
29
42
30
- use mithril_common:: messages:: SnapshotDownloadMessage ;
43
+ use mithril_common:: messages:: {
44
+ CardanoDatabaseImmutableFilesRestoredMessage , SnapshotDownloadMessage ,
45
+ } ;
31
46
32
47
use crate :: event_store:: { EventMessage , TransmitterService } ;
33
48
use crate :: http_server:: routes:: reply;
@@ -60,13 +75,53 @@ mod handlers {
60
75
Ok ( _) => Ok ( reply:: empty ( StatusCode :: CREATED ) ) ,
61
76
}
62
77
}
78
+
79
+ pub async fn post_cardano_database_immutable_files_restored (
80
+ message : CardanoDatabaseImmutableFilesRestoredMessage ,
81
+ logger : slog:: Logger ,
82
+ event_transmitter : Arc < TransmitterService < EventMessage > > ,
83
+ metrics_service : Arc < MetricsService > ,
84
+ ) -> Result < impl warp:: Reply , Infallible > {
85
+ metrics_service
86
+ . get_cardano_database_immutable_files_restored ( )
87
+ . increment ( ) ;
88
+
89
+ transmit_event_message (
90
+ message,
91
+ logger,
92
+ event_transmitter,
93
+ "cardano_database_immutable_files_restored" ,
94
+ )
95
+ . await
96
+ }
97
+
98
+ async fn transmit_event_message (
99
+ message : CardanoDatabaseImmutableFilesRestoredMessage ,
100
+ logger : slog:: Logger ,
101
+ event_transmitter : Arc < TransmitterService < EventMessage > > ,
102
+ action : & str ,
103
+ ) -> Result < impl warp:: Reply , Infallible > {
104
+ let headers: Vec < ( & str , & str ) > = Vec :: new ( ) ;
105
+
106
+ let message = EventMessage :: new ( "HTTP::statistics" , action, & message, headers) ;
107
+
108
+ match event_transmitter. try_send ( message. clone ( ) ) {
109
+ Err ( e) => {
110
+ warn ! ( logger, "Event message error" ; "error" => ?e) ;
111
+ Ok ( reply:: internal_server_error ( e) )
112
+ }
113
+ Ok ( _) => Ok ( reply:: empty ( StatusCode :: CREATED ) ) ,
114
+ }
115
+ }
63
116
}
64
117
65
118
#[ cfg( test) ]
66
119
mod tests {
67
120
use super :: * ;
68
121
69
- use mithril_common:: messages:: SnapshotDownloadMessage ;
122
+ use mithril_common:: messages:: {
123
+ CardanoDatabaseImmutableFilesRestoredMessage , SnapshotDownloadMessage ,
124
+ } ;
70
125
use mithril_common:: test_utils:: apispec:: APISpec ;
71
126
72
127
use std:: sync:: Arc ;
@@ -151,4 +206,124 @@ mod tests {
151
206
. get( )
152
207
) ;
153
208
}
209
+
210
+ mod post_cardano_database_immutable_files_restored {
211
+ use tokio:: sync:: mpsc:: UnboundedReceiver ;
212
+ use warp:: hyper:: body:: Bytes ;
213
+
214
+ use crate :: { event_store:: EventMessage , DependencyContainer } ;
215
+
216
+ use super :: * ;
217
+
218
+ const HTTP_METHOD : Method = Method :: POST ;
219
+ const PATH : & str = "/statistics/cardano-database/immutable-files-restored" ;
220
+
221
+ async fn setup_dependencies ( ) -> ( Arc < DependencyContainer > , UnboundedReceiver < EventMessage > )
222
+ {
223
+ let config = Configuration :: new_sample ( ) ;
224
+ let mut builder = DependenciesBuilder :: new_with_stdout_logger ( config) ;
225
+ let rx = builder. get_event_transmitter_receiver ( ) . await . unwrap ( ) ;
226
+ let dependency_manager = Arc :: new ( builder. build_dependency_container ( ) . await . unwrap ( ) ) ;
227
+ ( dependency_manager, rx)
228
+ }
229
+
230
+ async fn send_request (
231
+ dependency_manager : & Arc < DependencyContainer > ,
232
+ message : & CardanoDatabaseImmutableFilesRestoredMessage ,
233
+ ) -> warp:: http:: Response < Bytes > {
234
+ request ( )
235
+ . method ( HTTP_METHOD . as_str ( ) )
236
+ . json ( message)
237
+ . path ( PATH )
238
+ . reply ( & setup_router ( RouterState :: new_with_dummy_config (
239
+ dependency_manager. clone ( ) ,
240
+ ) ) )
241
+ . await
242
+ }
243
+
244
+ #[ tokio:: test]
245
+ async fn conform_to_open_api_when_created ( ) {
246
+ let ( dependency_manager, _rx) = setup_dependencies ( ) . await ;
247
+
248
+ let message = CardanoDatabaseImmutableFilesRestoredMessage :: dummy ( ) ;
249
+
250
+ let response = send_request ( & dependency_manager, & message) . await ;
251
+
252
+ let result = APISpec :: verify_conformity (
253
+ APISpec :: get_all_spec_files ( ) ,
254
+ HTTP_METHOD . as_str ( ) ,
255
+ PATH ,
256
+ "application/json" ,
257
+ & message,
258
+ & response,
259
+ & StatusCode :: CREATED ,
260
+ ) ;
261
+
262
+ result. unwrap ( ) ;
263
+ }
264
+
265
+ #[ tokio:: test]
266
+ async fn conform_to_open_api_when_server_error ( ) {
267
+ let ( dependency_manager, mut rx) = setup_dependencies ( ) . await ;
268
+ rx. close ( ) ;
269
+
270
+ let message = CardanoDatabaseImmutableFilesRestoredMessage :: dummy ( ) ;
271
+ let response = request ( )
272
+ . method ( HTTP_METHOD . as_str ( ) )
273
+ . json ( & message)
274
+ . path ( PATH )
275
+ . reply ( & setup_router ( RouterState :: new_with_dummy_config (
276
+ dependency_manager. clone ( ) ,
277
+ ) ) )
278
+ . await ;
279
+
280
+ APISpec :: verify_conformity (
281
+ APISpec :: get_all_spec_files ( ) ,
282
+ HTTP_METHOD . as_str ( ) ,
283
+ PATH ,
284
+ "application/json" ,
285
+ & message,
286
+ & response,
287
+ & StatusCode :: INTERNAL_SERVER_ERROR ,
288
+ )
289
+ . unwrap ( ) ;
290
+ }
291
+
292
+ #[ tokio:: test]
293
+ async fn should_send_event ( ) {
294
+ let ( dependency_manager, mut rx) = setup_dependencies ( ) . await ;
295
+
296
+ send_request (
297
+ & dependency_manager,
298
+ & CardanoDatabaseImmutableFilesRestoredMessage :: dummy ( ) ,
299
+ )
300
+ . await ;
301
+
302
+ let _ = rx. try_recv ( ) . unwrap ( ) ;
303
+ }
304
+
305
+ #[ tokio:: test]
306
+ async fn increments_metric ( ) {
307
+ let ( dependency_manager, _rx) = setup_dependencies ( ) . await ;
308
+
309
+ let initial_counter_value = dependency_manager
310
+ . metrics_service
311
+ . get_cardano_database_immutable_files_restored ( )
312
+ . get ( ) ;
313
+
314
+ send_request (
315
+ & dependency_manager,
316
+ & CardanoDatabaseImmutableFilesRestoredMessage :: dummy ( ) ,
317
+ )
318
+ . await ;
319
+
320
+ assert_eq ! (
321
+ initial_counter_value + 1 ,
322
+ dependency_manager
323
+ . metrics_service
324
+ . get_cardano_database_immutable_files_restored( )
325
+ . get( )
326
+ ) ;
327
+ }
328
+ }
154
329
}
0 commit comments