1
1
use diesel:: Queryable ;
2
+
3
+ use rouille:: router;
4
+
2
5
use serde:: Deserialize ;
3
6
use serde:: Serialize ;
4
7
5
- use super :: schema:: { access, user_access} ;
8
+ use url:: form_urlencoded;
9
+
10
+ use log:: { trace, warn} ;
6
11
7
12
use crate :: errors:: { WebdevError , WebdevErrorKind } ;
8
13
9
- use crate :: users:: models:: { User , UserList } ;
14
+ use crate :: search:: { NullableSearch , Search } ;
15
+
16
+ use crate :: users:: models:: UserList ;
17
+ use super :: schema:: { access, user_access} ;
10
18
11
19
#[ derive( Queryable , Serialize , Deserialize ) ]
12
20
pub struct Access {
13
- pub id : u64 ,
21
+ pub id : i64 ,
14
22
pub access_name : String ,
15
23
}
16
24
@@ -20,55 +28,182 @@ pub struct NewAccess {
20
28
pub access_name : String ,
21
29
}
22
30
31
+ #[ derive( AsChangeset , Serialize , Deserialize ) ]
32
+ #[ table_name = "access" ]
33
+ pub struct PartialAccess {
34
+ pub access_name : String ,
35
+ }
36
+
23
37
pub enum AccessRequest {
38
+ GetAccess ( i64 ) , //id of access name searched
24
39
CreateAccess ( NewAccess ) , //new access type of some name to be created
25
- GetAccess ( u64 ) , //id of access name searched
26
- DeleteAccess ( u64 ) , //if of access to be deleted
27
- RenameAccess ( Access ) , //Contains id to be changed to new access_name
40
+ UpdateAccess ( i64 , PartialAccess ) , //Contains id to be changed to new access_name
41
+ DeleteAccess ( i64 ) , //if of access to be deleted
28
42
}
29
43
30
44
impl AccessRequest {
31
- fn from_rouille ( request : & rouille:: Request ) -> Result < AccessRequest , WebdevError > {
45
+ pub fn from_rouille ( request : & rouille:: Request ) -> Result < AccessRequest , WebdevError > {
46
+ trace ! ( "Creating AccessRequest from {:#?}" , request) ;
47
+
48
+ router ! ( request,
49
+ ( GET ) ( /{ id: i64 } ) => {
50
+ Ok ( AccessRequest :: GetAccess ( id) )
51
+ } ,
52
+
53
+ ( POST ) ( /) => {
54
+ let request_body = request. data( ) . ok_or( WebdevError :: new( WebdevErrorKind :: Format ) ) ?;
55
+ let new_access: NewAccess = serde_json:: from_reader( request_body) ?;
56
+
57
+ Ok ( AccessRequest :: CreateAccess ( new_access) )
58
+ } ,
59
+
60
+ ( POST ) ( /{ id: i64 } ) => {
61
+ let request_body = request. data( ) . ok_or( WebdevError :: new( WebdevErrorKind :: Format ) ) ?;
62
+ let update_access: PartialAccess = serde_json:: from_reader( request_body) ?;
32
63
64
+ Ok ( AccessRequest :: UpdateAccess ( id, update_access) )
65
+ } ,
66
+
67
+ ( DELETE ) ( /{ id: i64 } ) => {
68
+ Ok ( AccessRequest :: DeleteAccess ( id) )
69
+ } ,
70
+
71
+ _ => {
72
+ warn!( "Could not create an access request for the given rouille request" ) ;
73
+ Err ( WebdevError :: new( WebdevErrorKind :: NotFound ) )
74
+ }
75
+ ) //end router
76
+
77
+ }
78
+ }
79
+
80
+ pub enum AccessResponse {
81
+ OneAccess ( Access ) ,
82
+ NoResponse ,
83
+ }
84
+
85
+ impl AccessResponse {
86
+ pub fn to_rouille ( self ) -> rouille:: Response {
87
+ match self {
88
+ AccessResponse :: OneAccess ( access) => rouille:: Response :: json ( & access) ,
89
+ AccessResponse :: NoResponse => rouille:: Response :: empty_204 ( ) ,
90
+ }
33
91
}
34
92
}
35
93
36
94
37
95
38
96
#[ derive( Queryable , Serialize , Deserialize ) ]
39
97
pub struct UserAccess {
40
- pub permission_id : u64 ,
41
- pub access_id : u64 ,
42
- pub user_id : u64 ,
98
+ pub permission_id : i64 ,
99
+ pub access_id : i64 ,
100
+ pub user_id : i64 ,
43
101
pub permission_level : Option < String > ,
44
102
}
45
103
46
104
#[ derive( Insertable , Serialize , Deserialize ) ]
47
105
#[ table_name = "user_access" ]
48
106
pub struct NewUserAccess {
49
- pub access_id : u64 ,
50
- pub user_id : u64 ,
107
+ pub access_id : i64 ,
108
+ pub user_id : i64 ,
51
109
pub permission_level : Option < String > ,
52
110
}
53
111
54
112
#[ derive( AsChangeset , Serialize , Deserialize ) ]
55
113
#[ table_name = "user_access" ]
56
114
pub struct PartialUserAccess {
57
- pub access_id : u64 ,
58
- pub user_id : u64 ,
115
+ pub access_id : i64 ,
116
+ pub user_id : i64 ,
59
117
pub permission_level : Option < Option < String > > ,
60
118
}
61
119
120
+ pub struct SearchUserAccess {
121
+ pub access_id : Search < i64 > ,
122
+ pub user_id : Search < i64 > ,
123
+ pub permission_level : NullableSearch < String > ,
124
+ }
125
+
62
126
pub enum UserAccessRequest {
63
- SearchAccess ( UserList ) , //list of users with access id or (?) name
64
- HasAccess ( UserAccess ) , //entry allowing user of user_id to perform action of action_id
127
+ SearchAccess ( SearchUserAccess ) , //list of users with access id or (?) name
128
+ CheckAccess ( i64 , i64 ) , //entry allowing user of user_id to perform action of action_id
65
129
CreateAccess ( NewUserAccess ) , //entry to add to database
66
- UpdateAccess ( u64 , PartialUserAccess ) , //entry to update with new information
67
- DeleteUserAccess ( u64 ) , //entry to delete from database
130
+ UpdateAccess ( i64 , PartialUserAccess ) , //entry to update with new information
131
+ DeleteAccess ( i64 ) , //entry to delete from database
68
132
}
69
133
70
134
impl UserAccessRequest {
71
- fn from_rouille ( request : & rouille:: Request ) -> Result < UserAccessRequest , WebdevError > {
135
+ pub fn from_rouille ( request : & rouille:: Request ) -> Result < UserAccessRequest , WebdevError > {
136
+ trace ! ( "Creating UserAccessRequest from {:#?}" , request) ;
137
+
138
+ let url_queries = form_urlencoded:: parse ( request. raw_query_string ( ) . as_bytes ( ) ) ;
139
+
140
+ router ! ( request,
141
+ ( GET ) ( /) => {
142
+
143
+ let mut access_id = Search :: NoSearch ;
144
+ let mut user_id = Search :: NoSearch ;
145
+ let mut permission_level = NullableSearch :: NoSearch ;
146
+
147
+ for ( field, query) in url_queries {
148
+ match field. as_ref( ) {
149
+ "access_id" => access_id = Search :: from_query( query. as_ref( ) ) ?,
150
+ "user_id" => user_id = Search :: from_query( query. as_ref( ) ) ?,
151
+ "permission_level" => permission_level = NullableSearch :: from_query( query. as_ref( ) ) ?,
152
+ _ => return Err ( WebdevError :: new( WebdevErrorKind :: Format ) ) ,
153
+ }
154
+ }
155
+
156
+ Ok ( UserAccessRequest :: SearchAccess ( SearchUserAccess {
157
+ access_id,
158
+ user_id,
159
+ permission_level,
160
+ } ) )
161
+ } ,
162
+
163
+ ( GET ) ( /{ user_id: i64 } /{ access_id: i64 } ) => {
164
+ Ok ( UserAccessRequest :: CheckAccess ( user_id, access_id) )
165
+ } ,
166
+
167
+ ( POST ) ( /) => {
168
+ let request_body = request. data( ) . ok_or( WebdevError :: new( WebdevErrorKind :: Format ) ) ?;
169
+ let new_user_access: NewUserAccess = serde_json:: from_reader( request_body) ?;
170
+
171
+ Ok ( UserAccessRequest :: CreateAccess ( new_user_access) )
172
+ } ,
173
+
174
+ ( POST ) ( /{ id: i64 } ) => {
175
+ let request_body = request. data( ) . ok_or( WebdevError :: new( WebdevErrorKind :: Format ) ) ?;
176
+ let update_user_access: PartialUserAccess = serde_json:: from_reader( request_body) ?;
177
+
178
+ Ok ( UserAccessRequest :: UpdateAccess ( id, update_user_access) )
179
+ } ,
180
+
181
+ ( DELETE ) ( /{ id: i64 } ) => {
182
+ Ok ( UserAccessRequest :: DeleteAccess ( id) )
183
+ } ,
184
+
185
+ _ => {
186
+ warn!( "Could not create a user access request for the given rouille request" ) ;
187
+ Err ( WebdevError :: new( WebdevErrorKind :: NotFound ) )
188
+ }
189
+ ) //end router
190
+ }
191
+ }
192
+
193
+ pub enum UserAccessResponse {
194
+ ManyUsers ( UserList ) ,
195
+ AccessState ( bool ) ,
196
+ OneUserAccess ( UserAccess ) ,
197
+ NoResponse ,
198
+ }
72
199
200
+ impl UserAccessResponse {
201
+ pub fn to_rouille ( self ) -> rouille:: Response {
202
+ match self {
203
+ UserAccessResponse :: ManyUsers ( users) => rouille:: Response :: json ( & users) ,
204
+ UserAccessResponse :: AccessState ( state) => rouille:: Response :: text ( if state { "true" } else { "false" } ) ,
205
+ UserAccessResponse :: OneUserAccess ( user_access) => rouille:: Response :: json ( & user_access) ,
206
+ UserAccessResponse :: NoResponse => rouille:: Response :: empty_204 ( ) ,
207
+ }
73
208
}
74
209
}
0 commit comments