@@ -20,19 +20,19 @@ use crate::{
20
20
handlers:: { http:: ingest:: PostError , STREAM_NAME_HEADER_KEY } ,
21
21
option:: CONFIG ,
22
22
storage:: { object_storage:: filter_path, ObjectStorageError } ,
23
- users:: filters:: { Filter , FILTERS } ,
23
+ users:: filters:: { Filter , CURRENT_FILTER_VERSION , FILTERS } ,
24
24
} ;
25
25
use actix_web:: { http:: header:: ContentType , web, HttpRequest , HttpResponse , Responder } ;
26
26
use bytes:: Bytes ;
27
27
use http:: StatusCode ;
28
- use serde_json:: { Error as SerdeError , Value as JsonValue } ;
28
+ use rand:: distributions:: DistString ;
29
+ use serde_json:: Error as SerdeError ;
29
30
30
31
pub async fn list ( req : HttpRequest ) -> Result < impl Responder , FiltersError > {
31
32
let user_id = req
32
33
. match_info ( )
33
34
. get ( "user_id" )
34
35
. ok_or ( FiltersError :: Metadata ( "No User Id Provided" ) ) ?;
35
-
36
36
let stream_name = req
37
37
. headers ( )
38
38
. iter ( )
@@ -41,117 +41,85 @@ pub async fn list(req: HttpRequest) -> Result<impl Responder, FiltersError> {
41
41
. 1
42
42
. to_str ( )
43
43
. map_err ( |_| FiltersError :: Metadata ( "Non ASCII Stream Name Provided" ) ) ?;
44
+ let filters = FILTERS . list_filters_by_user_and_stream ( user_id, stream_name) ;
44
45
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 ) )
62
47
}
63
48
64
49
pub 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
71
51
. match_info ( )
72
52
. get ( "filter_id" )
73
53
. ok_or ( FiltersError :: Metadata ( "No Filter Id Provided" ) ) ?;
74
54
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) {
85
56
return Ok ( ( web:: Json ( filter) , StatusCode :: OK ) ) ;
86
57
}
87
58
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
+ }
95
61
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) ;
97
71
98
- Ok ( ( web:: Json ( resource) , StatusCode :: OK ) )
99
- }
72
+ let path = filter_path ( user_id, stream_name, & format ! ( "{}.json" , filter_id) ) ;
100
73
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 ?;
106
77
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
108
83
. match_info ( )
109
84
. get ( "filter_id" )
110
85
. 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 ;
111
91
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) ;
120
96
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) ) ;
124
98
125
99
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 ?;
127
102
128
103
Ok ( HttpResponse :: Ok ( ) . finish ( ) )
129
104
}
130
105
131
106
pub 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
138
108
. match_info ( )
139
109
. get ( "filter_id" )
140
110
. 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 ;
141
116
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) ) ;
152
118
let store = CONFIG . storage ( ) . get_object_store ( ) ;
153
119
store. delete_object ( & path) . await ?;
154
120
121
+ FILTERS . delete_filter ( filter_id) ;
122
+
155
123
Ok ( HttpResponse :: Ok ( ) . finish ( ) )
156
124
}
157
125
@@ -161,7 +129,7 @@ pub enum FiltersError {
161
129
ObjectStorage ( #[ from] ObjectStorageError ) ,
162
130
#[ error( "Serde Error: {0}" ) ]
163
131
Serde ( #[ from] SerdeError ) ,
164
- #[ error( "Cannot perform this operation : {0}" ) ]
132
+ #[ error( "Operation cannot be performed : {0}" ) ]
165
133
Metadata ( & ' static str ) ,
166
134
}
167
135
0 commit comments