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

Commit 734a530

Browse files
committed
Implemented http methods for authorization systems commands.
1 parent ee8edb2 commit 734a530

File tree

12 files changed

+483
-45
lines changed

12 files changed

+483
-45
lines changed
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
-- Your SQL goes here
22
CREATE TABLE users (
3-
id SERIAL PRIMARY KEY,
3+
id BIGINT SIGNED NOT NULL AUTO_INCREMENT UNIQUE PRIMARY KEY,
44
first_name VARCHAR(255) NOT NULL,
55
last_name VARCHAR(255) NOT NULL,
66
banner_id INT(9) UNSIGNED NOT NULL,
77
email VARCHAR(255)
8-
)
8+
)
Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
-- Your SQL goes here
22
CREATE TABLE access (
3-
id SERIAL PRIMARY KEY,
3+
id BIGINT SIGNED NOT NULL AUTO_INCREMENT UNIQUE PRIMARY KEY,
44
access_name VARCHAR(255) NOT NULL
55
);
66

@@ -12,14 +12,16 @@ INSERT INTO access (access_name) VALUES
1212
("DeleteUser");
1313

1414
CREATE TABLE user_access (
15-
permission_id SERIAL PRIMARY KEY,
16-
access_id BIGINT UNSIGNED NOT NULL,
17-
user_id BIGINT UNSIGNED NOT NULL,
15+
permission_id BIGINT SIGNED NOT NULL AUTO_INCREMENT UNIQUE PRIMARY KEY,
16+
access_id BIGINT SIGNED NOT NULL,
17+
user_id BIGINT SIGNED NOT NULL,
1818
FOREIGN KEY (access_id)
1919
REFERENCES access(id)
20-
ON DELETE CASCADE,
20+
ON DELETE CASCADE
21+
ON UPDATE CASCADE,
2122
FOREIGN KEY (user_id)
2223
REFERENCES users(id)
23-
ON DELETE CASCADE,
24+
ON DELETE CASCADE
25+
ON UPDATE CASCADE,
2426
permission_level VARCHAR(255)
2527
);

backend/src/access/mod.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
pub mod models;
2+
pub mod requests;
3+
pub mod schema;

backend/src/access/models.rs

Lines changed: 154 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,24 @@
11
use diesel::Queryable;
2+
3+
use rouille::router;
4+
25
use serde::Deserialize;
36
use serde::Serialize;
47

5-
use super::schema::{access, user_access};
8+
use url::form_urlencoded;
9+
10+
use log::{trace, warn};
611

712
use crate::errors::{WebdevError, WebdevErrorKind};
813

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};
1018

1119
#[derive(Queryable, Serialize, Deserialize)]
1220
pub struct Access {
13-
pub id: u64,
21+
pub id: i64,
1422
pub access_name: String,
1523
}
1624

@@ -20,55 +28,182 @@ pub struct NewAccess {
2028
pub access_name: String,
2129
}
2230

31+
#[derive(AsChangeset, Serialize, Deserialize)]
32+
#[table_name = "access"]
33+
pub struct PartialAccess {
34+
pub access_name: String,
35+
}
36+
2337
pub enum AccessRequest {
38+
GetAccess(i64), //id of access name searched
2439
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
2842
}
2943

3044
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)?;
3263

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+
}
3391
}
3492
}
3593

3694

3795

3896
#[derive(Queryable, Serialize, Deserialize)]
3997
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,
43101
pub permission_level: Option<String>,
44102
}
45103

46104
#[derive(Insertable, Serialize, Deserialize)]
47105
#[table_name = "user_access"]
48106
pub struct NewUserAccess {
49-
pub access_id: u64,
50-
pub user_id: u64,
107+
pub access_id: i64,
108+
pub user_id: i64,
51109
pub permission_level: Option<String>,
52110
}
53111

54112
#[derive(AsChangeset, Serialize, Deserialize)]
55113
#[table_name = "user_access"]
56114
pub struct PartialUserAccess {
57-
pub access_id: u64,
58-
pub user_id: u64,
115+
pub access_id: i64,
116+
pub user_id: i64,
59117
pub permission_level: Option<Option<String>>,
60118
}
61119

120+
pub struct SearchUserAccess {
121+
pub access_id: Search<i64>,
122+
pub user_id: Search<i64>,
123+
pub permission_level: NullableSearch<String>,
124+
}
125+
62126
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
65129
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
68132
}
69133

70134
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+
}
72199

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+
}
73208
}
74209
}

0 commit comments

Comments
 (0)