1
1
use diesel;
2
+ use diesel:: types;
2
3
use diesel:: mysql:: MysqlConnection ;
3
4
use diesel:: query_builder:: AsQuery ;
4
5
use diesel:: QueryDsl ;
@@ -30,13 +31,13 @@ pub fn handle_access(
30
31
match request {
31
32
AccessRequest :: GetAccess ( id) => {
32
33
get_access ( id, database_connection) . map ( |a| AccessResponse :: OneAccess ( a) )
33
- }
34
+ } ,
34
35
AccessRequest :: CreateAccess ( access) => {
35
36
create_access ( access, database_connection) . map ( |a| AccessResponse :: OneAccess ( a) )
36
- }
37
+ } ,
37
38
AccessRequest :: UpdateAccess ( id, access) => {
38
39
update_access ( id, access, database_connection) . map ( |_| AccessResponse :: NoResponse )
39
- }
40
+ } ,
40
41
AccessRequest :: DeleteAccess ( id) => {
41
42
delete_access ( id, database_connection) . map ( |_| AccessResponse :: NoResponse )
42
43
}
@@ -59,8 +60,11 @@ fn create_access(access: NewAccess, database_connection: &MysqlConnection) -> Re
59
60
. values ( access)
60
61
. execute ( database_connection) ?;
61
62
63
+ no_arg_sql_function ! ( last_insert_id, types:: Bigint ) ;
64
+
62
65
let mut inserted_accesses = access_schema:: table
63
- . filter ( diesel:: dsl:: sql ( "id = LAST_INSERT_ID()" ) )
66
+ . filter ( access_schema:: id. eq ( last_insert_id) )
67
+ //.filter(diesel::dsl::sql("id = LAST_INSERT_ID()"))
64
68
. load :: < Access > ( database_connection) ?;
65
69
66
70
if let Some ( inserted_access) = inserted_accesses. pop ( ) {
@@ -94,16 +98,19 @@ pub fn handle_user_access(
94
98
match request {
95
99
UserAccessRequest :: SearchAccess ( user_access) => {
96
100
search_user_access ( user_access, database_connection) . map ( |u| UserAccessResponse :: ManyUsers ( u) )
97
- }
101
+ } ,
102
+ UserAccessRequest :: GetAccess ( permission_id) => {
103
+ get_user_access ( permission_id, database_connection) . map ( |a| UserAccessResponse :: OneUserAccess ( a) )
104
+ } ,
98
105
UserAccessRequest :: CheckAccess ( user_id, access_id) => {
99
106
check_user_access ( user_id, access_id, database_connection) . map ( |s| UserAccessResponse :: AccessState ( s) )
100
- }
107
+ } ,
101
108
UserAccessRequest :: CreateAccess ( user_access) => {
102
109
create_user_access ( user_access, database_connection) . map ( |a| UserAccessResponse :: OneUserAccess ( a) )
103
- }
110
+ } ,
104
111
UserAccessRequest :: UpdateAccess ( id, user_access) => {
105
112
update_user_access ( id, user_access, database_connection) . map ( |_| UserAccessResponse :: NoResponse )
106
- }
113
+ } ,
107
114
UserAccessRequest :: DeleteAccess ( id) => {
108
115
delete_user_access ( id, database_connection) . map ( |_| UserAccessResponse :: NoResponse )
109
116
}
@@ -196,54 +203,62 @@ fn search_user_access(
196
203
Ok ( user_list)
197
204
}
198
205
206
+ fn get_user_access (
207
+ permission_id : i64 ,
208
+ database_connection : & MysqlConnection
209
+ ) -> Result < UserAccess , WebdevError > {
210
+ let mut found_user_accesses = user_access_schema:: table
211
+ . filter ( user_access_schema:: permission_id. eq ( permission_id) )
212
+ . load :: < UserAccess > ( database_connection) ?;
213
+
214
+ match found_user_accesses. pop ( ) {
215
+ Some ( found_user_access) => Ok ( found_user_access) ,
216
+ None => Err ( WebdevError :: new ( WebdevErrorKind :: NotFound ) ) ,
217
+ }
218
+ }
219
+
199
220
fn check_user_access (
200
221
user_id : i64 ,
201
222
access_id : i64 ,
202
223
database_connection : & MysqlConnection
203
224
) -> Result < bool , WebdevError > {
204
- let mut found_user_accesses = user_access_schema:: table
225
+ let found_user_accesses = user_access_schema:: table
205
226
. filter ( user_access_schema:: user_id. eq ( user_id) )
206
227
. filter ( user_access_schema:: access_id. eq ( access_id) )
207
- . load :: < UserAccess > ( database_connection) ?;
228
+ . execute ( database_connection) ?;
208
229
209
- match found_user_accesses. pop ( ) {
210
- Some ( found_user_access) => Ok ( true ) ,
211
- None => Ok ( false ) ,
212
- }
230
+ if found_user_accesses != 0 { Ok ( true ) } else { Ok ( false ) }
213
231
}
214
232
215
233
fn create_user_access (
216
234
user_access : NewUserAccess ,
217
235
database_connection : & MysqlConnection
218
236
) -> Result < UserAccess , WebdevError > {
219
237
//find if permission currently exists, should not duplicate (user_id, access_id) pairs
220
- let mut found_user_accesses = user_access_schema:: table
238
+ let found_user_accesses = user_access_schema:: table
221
239
. filter ( user_access_schema:: user_id. eq ( user_access. user_id ) )
222
240
. filter ( user_access_schema:: access_id. eq ( user_access. access_id ) )
241
+ . execute ( database_connection) ?;
242
+
243
+ if found_user_accesses != 0 { return Err ( WebdevError :: new ( WebdevErrorKind :: Database ) ) }
244
+
245
+ //permission most definitely does not exist at this point
246
+
247
+ diesel:: insert_into ( user_access_schema:: table)
248
+ . values ( user_access)
249
+ . execute ( database_connection) ?;
250
+
251
+ no_arg_sql_function ! ( last_insert_id, types:: Bigint ) ;
252
+
253
+ let mut inserted_accesses = user_access_schema:: table
254
+ . filter ( user_access_schema:: permission_id. eq ( last_insert_id) )
255
+ //.filter(diesel::dsl::sql("permission_id = LAST_INSERT_ID()"))
223
256
. load :: < UserAccess > ( database_connection) ?;
224
257
225
- match found_user_accesses. pop ( ) {
226
- Some ( found_user_access) => Ok ( found_user_access) ,
227
- None => {
228
- //access most definitely does not exist at this point
229
-
230
- match diesel:: insert_into ( user_access_schema:: table)
231
- . values ( user_access)
232
- . execute ( database_connection) {
233
- Ok ( u_size) => { ( ) ; } , //cant return yet, we do not have the inserted access object
234
- Err ( e) => { ( ) ; } //No need for error correction, the following code checks for insertion
235
- } ;
236
-
237
- let mut inserted_accesses = user_access_schema:: table
238
- . filter ( diesel:: dsl:: sql ( "id = LAST_INSERT_ID()" ) )
239
- . load :: < UserAccess > ( database_connection) ?;
240
-
241
- if let Some ( inserted_access) = inserted_accesses. pop ( ) {
242
- Ok ( inserted_access)
243
- } else {
244
- Err ( WebdevError :: new ( WebdevErrorKind :: Database ) )
245
- }
246
- } ,
258
+ if let Some ( inserted_access) = inserted_accesses. pop ( ) {
259
+ Ok ( inserted_access)
260
+ } else {
261
+ Err ( WebdevError :: new ( WebdevErrorKind :: Database ) )
247
262
}
248
263
}
249
264
0 commit comments