Skip to content
This repository was archived by the owner on Sep 8, 2019. It is now read-only.

Commit 1d940ca

Browse files
committed
Bug fixes and general optimizations in authorization systems.
1 parent 734a530 commit 1d940ca

File tree

3 files changed

+57
-39
lines changed

3 files changed

+57
-39
lines changed

backend/src/access/models.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ pub struct SearchUserAccess {
125125

126126
pub enum UserAccessRequest {
127127
SearchAccess(SearchUserAccess), //list of users with access id or (?) name
128+
GetAccess(i64), //get individual access entry from its id
128129
CheckAccess(i64, i64), //entry allowing user of user_id to perform action of action_id
129130
CreateAccess(NewUserAccess), //entry to add to database
130131
UpdateAccess(i64, PartialUserAccess), //entry to update with new information
@@ -160,6 +161,10 @@ impl UserAccessRequest {
160161
}))
161162
},
162163

164+
(GET) (/{permission_id: i64}) => {
165+
Ok(UserAccessRequest::GetAccess(permission_id))
166+
},
167+
163168
(GET) (/{user_id:i64}/{access_id: i64}) => {
164169
Ok(UserAccessRequest::CheckAccess(user_id, access_id))
165170
},

backend/src/access/requests.rs

Lines changed: 52 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use diesel;
2+
use diesel::types;
23
use diesel::mysql::MysqlConnection;
34
use diesel::query_builder::AsQuery;
45
use diesel::QueryDsl;
@@ -30,13 +31,13 @@ pub fn handle_access(
3031
match request {
3132
AccessRequest::GetAccess(id) => {
3233
get_access(id, database_connection).map(|a| AccessResponse::OneAccess(a))
33-
}
34+
},
3435
AccessRequest::CreateAccess(access) => {
3536
create_access(access, database_connection).map(|a| AccessResponse::OneAccess(a))
36-
}
37+
},
3738
AccessRequest::UpdateAccess(id, access) => {
3839
update_access(id, access, database_connection).map(|_| AccessResponse::NoResponse)
39-
}
40+
},
4041
AccessRequest::DeleteAccess(id) => {
4142
delete_access(id, database_connection).map(|_| AccessResponse::NoResponse)
4243
}
@@ -59,8 +60,11 @@ fn create_access(access: NewAccess, database_connection: &MysqlConnection) -> Re
5960
.values(access)
6061
.execute(database_connection)?;
6162

63+
no_arg_sql_function!(last_insert_id, types::Bigint);
64+
6265
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()"))
6468
.load::<Access>(database_connection)?;
6569

6670
if let Some(inserted_access) = inserted_accesses.pop() {
@@ -94,16 +98,19 @@ pub fn handle_user_access(
9498
match request {
9599
UserAccessRequest::SearchAccess(user_access) => {
96100
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+
},
98105
UserAccessRequest::CheckAccess(user_id, access_id) => {
99106
check_user_access(user_id, access_id, database_connection).map(|s| UserAccessResponse::AccessState(s))
100-
}
107+
},
101108
UserAccessRequest::CreateAccess(user_access) => {
102109
create_user_access(user_access, database_connection).map(|a| UserAccessResponse::OneUserAccess(a))
103-
}
110+
},
104111
UserAccessRequest::UpdateAccess(id, user_access) => {
105112
update_user_access(id, user_access, database_connection).map(|_| UserAccessResponse::NoResponse)
106-
}
113+
},
107114
UserAccessRequest::DeleteAccess(id) => {
108115
delete_user_access(id, database_connection).map(|_| UserAccessResponse::NoResponse)
109116
}
@@ -196,54 +203,62 @@ fn search_user_access(
196203
Ok(user_list)
197204
}
198205

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+
199220
fn check_user_access(
200221
user_id: i64,
201222
access_id: i64,
202223
database_connection: &MysqlConnection
203224
) -> Result<bool, WebdevError> {
204-
let mut found_user_accesses = user_access_schema::table
225+
let found_user_accesses = user_access_schema::table
205226
.filter(user_access_schema::user_id.eq(user_id))
206227
.filter(user_access_schema::access_id.eq(access_id))
207-
.load::<UserAccess>(database_connection)?;
228+
.execute(database_connection)?;
208229

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) }
213231
}
214232

215233
fn create_user_access(
216234
user_access: NewUserAccess,
217235
database_connection: &MysqlConnection
218236
) -> Result<UserAccess, WebdevError> {
219237
//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
221239
.filter(user_access_schema::user_id.eq(user_access.user_id))
222240
.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()"))
223256
.load::<UserAccess>(database_connection)?;
224257

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))
247262
}
248263
}
249264

backend/src/access/schema.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
use diesel::table;
2-
31
use crate::users::schema::users;
42

53
table! {

0 commit comments

Comments
 (0)