@@ -2,14 +2,14 @@ use rocket::{futures::StreamExt, get, post, serde::json::Json, Route, State};
22use rocket_okapi:: { okapi:: openapi3:: OpenApi , openapi, openapi_get_routes_spec} ;
33use schemars:: JsonSchema ;
44use serde:: { Deserialize , Serialize } ;
5- use time:: ext:: NumericalDuration ;
5+ use time:: { ext:: NumericalDuration , format_description :: well_known , UtcDateTime } ;
66
77use crate :: {
88 auth:: { create_client_token, ApiKeyAuth , Crypto } ,
99 config:: AppConfig ,
1010 data:: JsonStream ,
1111 errors:: ApiError ,
12- redis:: { stream_sse_url , RedisClient , StreamStatus , DATA_KEY , EVENT_KEY } ,
12+ redis:: * ,
1313} ;
1414
1515pub fn get_routes ( ) -> ( Vec < Route > , OpenApi ) {
@@ -18,6 +18,7 @@ pub fn get_routes() -> (Vec<Route>, OpenApi) {
1818 create_stream,
1919 create_token,
2020 get_stream_info,
21+ get_stream_events,
2122 add_events,
2223 add_events_json_stream,
2324 cancel_stream,
@@ -64,6 +65,35 @@ async fn get_stream_info(
6465 } ) )
6566}
6667
68+ /// # Get stream events
69+ /// Get all events so far in a stream
70+ #[ openapi( tag = "Stream" ) ]
71+ #[ get( "/events?<key>" ) ]
72+ async fn get_stream_events (
73+ _api_key : ApiKeyAuth ,
74+ key : & str ,
75+ reader : RedisReader ,
76+ ) -> Result < Json < Vec < StreamEvent > > , ApiError > {
77+ let ( prev_events, _, _) = reader. get_prev_events ( key, None ) . await ?;
78+ let events = prev_events
79+ . into_iter ( )
80+ . filter_map ( |( id, mut data) | {
81+ let unix_millis: i64 = id. split ( '-' ) . next ( ) . unwrap_or_default ( ) . parse ( ) . ok ( ) ?;
82+ let date_time = UtcDateTime :: from_unix_timestamp ( unix_millis / 1000 ) . ok ( ) ?;
83+ let iso_time = date_time. format ( & well_known:: Rfc3339 ) . ok ( ) ?;
84+ let event = StreamEvent {
85+ id : ( * id) . to_owned ( ) ,
86+ time : iso_time,
87+ event : data. remove ( EVENT_KEY ) . as_deref ( ) . map ( |e| e. to_owned ( ) ) ?,
88+ data : data. remove ( DATA_KEY ) . as_deref ( ) . map ( |d| d. to_owned ( ) ) ,
89+ } ;
90+ Some ( event)
91+ } )
92+ . collect ( ) ;
93+
94+ Ok ( Json ( events) )
95+ }
96+
6797/// # Create stream
6898/// Create a new stream, and get a client URL and token to connect to the stream
6999#[ openapi( tag = "Stream" ) ]
@@ -217,6 +247,19 @@ pub struct StreamInfo {
217247 ttl : i64 ,
218248}
219249
250+ #[ derive( JsonSchema , Serialize ) ]
251+ pub struct StreamEvent {
252+ /// ID of the event
253+ id : String ,
254+ /// Time of the event (ISO 8601 format)
255+ time : String ,
256+ /// Name/type of the event
257+ event : String ,
258+ /// Event data
259+ #[ serde( skip_serializing_if = "Option::is_none" ) ]
260+ data : Option < String > ,
261+ }
262+
220263#[ derive( JsonSchema , Deserialize ) ]
221264struct StreamRequest {
222265 key : String ,
0 commit comments