@@ -20,19 +20,19 @@ use crate::{
2020 handlers:: { http:: ingest:: PostError , STREAM_NAME_HEADER_KEY } ,
2121 option:: CONFIG ,
2222 storage:: { object_storage:: filter_path, ObjectStorageError } ,
23- users:: filters:: { Filter , FILTERS } ,
23+ users:: filters:: { Filter , CURRENT_FILTER_VERSION , FILTERS } ,
2424} ;
2525use actix_web:: { http:: header:: ContentType , web, HttpRequest , HttpResponse , Responder } ;
2626use bytes:: Bytes ;
2727use http:: StatusCode ;
28- use serde_json:: { Error as SerdeError , Value as JsonValue } ;
28+ use rand:: distributions:: DistString ;
29+ use serde_json:: Error as SerdeError ;
2930
3031pub async fn list ( req : HttpRequest ) -> Result < impl Responder , FiltersError > {
3132 let user_id = req
3233 . match_info ( )
3334 . get ( "user_id" )
3435 . ok_or ( FiltersError :: Metadata ( "No User Id Provided" ) ) ?;
35-
3636 let stream_name = req
3737 . headers ( )
3838 . iter ( )
@@ -41,117 +41,85 @@ pub async fn list(req: HttpRequest) -> Result<impl Responder, FiltersError> {
4141 . 1
4242 . to_str ( )
4343 . map_err ( |_| FiltersError :: Metadata ( "Non ASCII Stream Name Provided" ) ) ?;
44+ let filters = FILTERS . list_filters_by_user_and_stream ( user_id, stream_name) ;
4445
45- // .users/user_id/filters/stream_name/filter_id
46- let path = filter_path ( user_id, stream_name, "" ) ;
47-
48- let store = CONFIG . storage ( ) . get_object_store ( ) ;
49- let filters = store
50- . get_objects (
51- Some ( & path) ,
52- Box :: new ( |file_name : String | file_name. ends_with ( "json" ) ) ,
53- )
54- . await ?;
55-
56- let mut filt = vec ! [ ] ;
57- for filter in filters {
58- filt. push ( serde_json:: from_slice :: < JsonValue > ( & filter) ?)
59- }
60-
61- Ok ( ( web:: Json ( filt) , StatusCode :: OK ) )
46+ Ok ( ( web:: Json ( filters) , StatusCode :: OK ) )
6247}
6348
6449pub async fn get ( req : HttpRequest ) -> Result < impl Responder , FiltersError > {
65- let user_id = req
66- . match_info ( )
67- . get ( "user_id" )
68- . ok_or ( FiltersError :: Metadata ( "No User Id Provided" ) ) ?;
69-
70- let filt_id = req
50+ let filter_id = req
7151 . match_info ( )
7252 . get ( "filter_id" )
7353 . ok_or ( FiltersError :: Metadata ( "No Filter Id Provided" ) ) ?;
7454
75- let stream_name = req
76- . headers ( )
77- . iter ( )
78- . find ( |& ( key, _) | key == STREAM_NAME_HEADER_KEY )
79- . ok_or_else ( || FiltersError :: Metadata ( "Stream Name Not Provided" ) ) ?
80- . 1
81- . to_str ( )
82- . map_err ( |_| FiltersError :: Metadata ( "Non ASCII Stream Name Provided" ) ) ?;
83-
84- if let Some ( filter) = FILTERS . find ( filt_id) {
55+ if let Some ( filter) = FILTERS . get_filter ( filter_id) {
8556 return Ok ( ( web:: Json ( filter) , StatusCode :: OK ) ) ;
8657 }
8758
88- // if it is not in memory go to s3
89- let path = filter_path ( user_id, stream_name, & format ! ( "{}.json" , filt_id) ) ;
90- let resource = CONFIG
91- . storage ( )
92- . get_object_store ( )
93- . get_object ( & path)
94- . await ?;
59+ Err ( FiltersError :: Metadata ( "Filter Not Found" ) )
60+ }
9561
96- let resource = serde_json:: from_slice :: < Filter > ( & resource) ?;
62+ pub async fn post ( body : Bytes ) -> Result < HttpResponse , PostError > {
63+ let filter: Filter = serde_json:: from_slice ( & body) ?;
64+ let filter_id = rand:: distributions:: Alphanumeric . sample_string ( & mut rand:: thread_rng ( ) , 10 ) ;
65+ let user_id = & filter. user_id ;
66+ let stream_name = & filter. stream_name ;
67+ let mut cloned_filter = filter. clone ( ) ;
68+ cloned_filter. filter_id = Some ( filter_id. clone ( ) ) ;
69+ cloned_filter. version = Some ( CURRENT_FILTER_VERSION . to_string ( ) ) ;
70+ FILTERS . update ( & cloned_filter) ;
9771
98- Ok ( ( web:: Json ( resource) , StatusCode :: OK ) )
99- }
72+ let path = filter_path ( user_id, stream_name, & format ! ( "{}.json" , filter_id) ) ;
10073
101- pub async fn post ( req : HttpRequest , body : Bytes ) -> Result < HttpResponse , PostError > {
102- let user_id = req
103- . match_info ( )
104- . get ( "user_id" )
105- . ok_or ( FiltersError :: Metadata ( "No User Id Provided" ) ) ?;
74+ let store = CONFIG . storage ( ) . get_object_store ( ) ;
75+ let filter_bytes = serde_json:: to_vec ( & cloned_filter) ?;
76+ store. put_object ( & path, Bytes :: from ( filter_bytes) ) . await ?;
10677
107- let filt_id = req
78+ Ok ( HttpResponse :: Ok ( ) . finish ( ) )
79+ }
80+
81+ pub async fn update ( req : HttpRequest , body : Bytes ) -> Result < HttpResponse , PostError > {
82+ let filter_id = req
10883 . match_info ( )
10984 . get ( "filter_id" )
11085 . ok_or ( FiltersError :: Metadata ( "No Filter Id Provided" ) ) ?;
86+ let filter = FILTERS
87+ . get_filter ( filter_id)
88+ . ok_or ( FiltersError :: Metadata ( "Filter Not Found" ) ) ?;
89+ let user_id = & filter. user_id ;
90+ let stream_name = & filter. stream_name ;
11191
112- let stream_name = req
113- . headers ( )
114- . iter ( )
115- . find ( |& ( key, _) | key == STREAM_NAME_HEADER_KEY )
116- . ok_or_else ( || FiltersError :: Metadata ( "Stream Name Not Provided" ) ) ?
117- . 1
118- . to_str ( )
119- . map_err ( |_| FiltersError :: Metadata ( "Non ASCII Stream Name Provided" ) ) ?;
92+ let mut cloned_filter: Filter = serde_json:: from_slice ( & body) ?;
93+ cloned_filter. filter_id = Some ( filter_id. to_string ( ) ) ;
94+ cloned_filter. version = Some ( CURRENT_FILTER_VERSION . to_string ( ) ) ;
95+ FILTERS . update ( & cloned_filter) ;
12096
121- let path = filter_path ( user_id, stream_name, & format ! ( "{}.json" , filt_id) ) ;
122- let filter: Filter = serde_json:: from_slice ( & body) ?;
123- FILTERS . update ( filter) ;
97+ let path = filter_path ( user_id, stream_name, & format ! ( "{}.json" , filter_id) ) ;
12498
12599 let store = CONFIG . storage ( ) . get_object_store ( ) ;
126- store. put_object ( & path, body) . await ?;
100+ let filter_bytes = serde_json:: to_vec ( & cloned_filter) ?;
101+ store. put_object ( & path, Bytes :: from ( filter_bytes) ) . await ?;
127102
128103 Ok ( HttpResponse :: Ok ( ) . finish ( ) )
129104}
130105
131106pub async fn delete ( req : HttpRequest ) -> Result < HttpResponse , PostError > {
132- let user_id = req
133- . match_info ( )
134- . get ( "user_id" )
135- . ok_or ( FiltersError :: Metadata ( "No User Id Provided" ) ) ?;
136-
137- let filt_id = req
107+ let filter_id = req
138108 . match_info ( )
139109 . get ( "filter_id" )
140110 . ok_or ( FiltersError :: Metadata ( "No Filter Id Provided" ) ) ?;
111+ let filter = FILTERS
112+ . get_filter ( filter_id)
113+ . ok_or ( FiltersError :: Metadata ( "Filter Not Found" ) ) ?;
114+ let stream_name = & filter. stream_name ;
115+ let user_id = & filter. user_id ;
141116
142- let stream_name = req
143- . headers ( )
144- . iter ( )
145- . find ( |& ( key, _) | key == STREAM_NAME_HEADER_KEY )
146- . ok_or_else ( || FiltersError :: Metadata ( "Stream Name Not Provided" ) ) ?
147- . 1
148- . to_str ( )
149- . map_err ( |_| FiltersError :: Metadata ( "Non ASCII Stream Name Provided" ) ) ?;
150-
151- let path = filter_path ( user_id, stream_name, & format ! ( "{}.json" , filt_id) ) ;
117+ let path = filter_path ( user_id, stream_name, & format ! ( "{}.json" , filter_id) ) ;
152118 let store = CONFIG . storage ( ) . get_object_store ( ) ;
153119 store. delete_object ( & path) . await ?;
154120
121+ FILTERS . delete_filter ( filter_id) ;
122+
155123 Ok ( HttpResponse :: Ok ( ) . finish ( ) )
156124}
157125
@@ -161,7 +129,7 @@ pub enum FiltersError {
161129 ObjectStorage ( #[ from] ObjectStorageError ) ,
162130 #[ error( "Serde Error: {0}" ) ]
163131 Serde ( #[ from] SerdeError ) ,
164- #[ error( "Cannot perform this operation : {0}" ) ]
132+ #[ error( "Operation cannot be performed : {0}" ) ]
165133 Metadata ( & ' static str ) ,
166134}
167135
0 commit comments