Skip to content
This repository was archived by the owner on Sep 8, 2019. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
71 commits
Select commit Hold shift + click to select a range
900378d
Added README.md
thurstonian Feb 4, 2019
8a8f13f
Fixed formatting on headers
thurstonian Feb 4, 2019
d0ad4fa
Changed header formatting
thurstonian Feb 4, 2019
9faf1ba
Changed header formatting
thurstonian Feb 5, 2019
409a626
Backend Readme Initial Push
thurstonian Feb 5, 2019
b2b7c9a
Merge branch 'initial-docs' of https://github.com/Rowan-ECE-Resource-…
thurstonian Feb 5, 2019
d3828dd
Test form for AJAX calls
thurstonian Feb 5, 2019
e963b00
Merge pull request #1 from Rowan-ECE-Resource-Center/initial-docs
thurstonian Feb 5, 2019
19b82d7
Update README.md
thurstonian Feb 5, 2019
1dff388
Merge remote-tracking branch 'origin/master'
timothyhollabaugh Feb 8, 2019
64844ff
Added a user import from csv.
Feb 11, 2019
2602177
Cleaned up and commented csv_user_import.
Feb 11, 2019
8c3b936
Deleted Duplicate Files
kluzynskn6 Feb 12, 2019
4f37f4e
Cleaned csv_import and renamed it.
Feb 12, 2019
bd47a23
Merge branch 'master' of https://github.com/kluzynskn6/main-server
Feb 12, 2019
216673e
Merge pull request #2 from kluzynskn6/master
timothyhollabaugh Feb 13, 2019
dbdcb41
Added very basic search.
Feb 15, 2019
1e48693
Better user searching
timothyhollabaugh Feb 16, 2019
bddc8ea
Search can do partial or exact
timothyhollabaugh Feb 16, 2019
175c199
Merge remote-tracking branch 'upstream/search' into search
timothyhollabaugh Feb 16, 2019
9331f51
Add files via upload
amorye7 Feb 19, 2019
2bb2057
Can now add, edit, and remove from users
Feb 21, 2019
476aa80
Moved Mockups to folder
amorye7 Feb 22, 2019
acda28e
Fixed static IP problem
Feb 22, 2019
20de24d
Merge remote-tracking branch 'nick/master' into upstream_dev
timothyhollabaugh Feb 25, 2019
480c3c4
Moved to correct folder
amorye7 Feb 26, 2019
ea5586e
Moved mockups to folders
amorye7 Feb 26, 2019
6cb6faf
Add files via upload
amorye7 Feb 26, 2019
d8b8f57
Moved PNG files to correct folder
amorye7 Feb 26, 2019
33a58b6
Add files via upload
amorye7 Feb 26, 2019
f4b2af6
Add files via upload
amorye7 Feb 26, 2019
58c28f3
Delete incorrect files
amorye7 Feb 26, 2019
c9f5323
Deleted wrong files
amorye7 Feb 26, 2019
edea4bf
Add files via upload
amorye7 Feb 26, 2019
4a4dcd7
Add files via upload
amorye7 Feb 26, 2019
9a3f96b
Merge remote-tracking branch 'lizzie/master' into upstream_dev
timothyhollabaugh Feb 27, 2019
5bb0f4e
Added header and styling
Feb 28, 2019
29ed584
Add Database_Relationship_Diagram
timothyhollabaugh Mar 1, 2019
42eb196
Change logging to SimpleLogger so it works in docker
timothyhollabaugh Mar 1, 2019
46722c7
Retry connecting to the database if it fails
timothyhollabaugh Mar 1, 2019
77e3eea
docker compose to start backend and mysql.
timothyhollabaugh Mar 1, 2019
5fd6e17
Run migrations when the server starts
timothyhollabaugh Mar 2, 2019
ca5db2f
Add dockerfile for frontend
timothyhollabaugh Mar 2, 2019
d9ab397
Remove volume from mysql. No longer needed
timothyhollabaugh Mar 2, 2019
68a822c
Merge remote-tracking branch 'nick/master' into docker
timothyhollabaugh Mar 2, 2019
f95cfa0
Include .html in all links
timothyhollabaugh Mar 2, 2019
a53faad
Add frontend to docker compose
timothyhollabaugh Mar 2, 2019
7fa4909
Remove :8000 from all ajax calls
timothyhollabaugh Mar 2, 2019
b5c98fe
Apache redirects /api/v1 to the backend
timothyhollabaugh Mar 2, 2019
013d701
Remove yet another :8000
timothyhollabaugh Mar 2, 2019
e55255c
Merge pull request #6 from timothyhollabaugh/docker
timothyhollabaugh Mar 2, 2019
ee8edb2
Initial framework for permissions system.
penatem1 Mar 9, 2019
182e27f
Initial framework for permissions system.
penatem1 Mar 9, 2019
734a530
Implemented http methods for authorization systems commands.
penatem1 Mar 13, 2019
a5edf93
Implemented http methods for authorization systems commands.
penatem1 Mar 13, 2019
1d940ca
Bug fixes and general optimizations in authorization systems.
penatem1 Mar 13, 2019
1e834f3
Bug fixes and general optimizations in authorization systems.
penatem1 Mar 13, 2019
e6ce81e
Brought project back to original layout. Fixed user_access search.
penatem1 Mar 26, 2019
ea07c94
Brought project back to original layout. Fixed user_access search.
penatem1 Mar 26, 2019
7ee6596
Switch back to SERIAL. (u64 support)
penatem1 Mar 26, 2019
425d26e
Switch back to SERIAL. (u64 support)
penatem1 Mar 26, 2019
55847cf
Implemented chemicals backend.
penatem1 Apr 15, 2019
19a5e6c
Implemented more fields for chemicals and chemical_inventory. Bug fixes
penatem1 Apr 15, 2019
b111454
Add semicolons to the end of migration sql commands
timothyhollabaugh Apr 16, 2019
e4cc0e8
Log a warning if migrations failed
timothyhollabaugh Apr 16, 2019
1066add
cargo fmt the backend
timothyhollabaugh Apr 16, 2019
02f4b36
Add Option to Partial fields
timothyhollabaugh Apr 16, 2019
06821cc
Merge pull request #1 from timothyhollabaugh/chemical
penatem1 Apr 16, 2019
cc20ecb
Order of operations bug fix.
penatem1 Apr 16, 2019
87a6136
Merge branch 'master' into chemical
penatem1 Apr 19, 2019
20cfc8f
Removed double import from previous merge conflict resolution.
penatem1 Apr 20, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion backend/migrations/2019-01-13-203149_create_users/down.sql
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
-- This file should undo anything in `up.sql`
DROP TABLE users
DROP TABLE users;
2 changes: 1 addition & 1 deletion backend/migrations/2019-01-13-203149_create_users/up.sql
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,4 @@ CREATE TABLE users (
last_name VARCHAR(255) NOT NULL,
banner_id INT(9) UNSIGNED NOT NULL,
email VARCHAR(255)
)
);
3 changes: 3 additions & 0 deletions backend/migrations/2019-03-08-171503_create_access/down.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
-- This file should undo anything in `up.sql`
DROP TABLE user_access;
DROP TABLE access;
27 changes: 27 additions & 0 deletions backend/migrations/2019-03-08-171503_create_access/up.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
-- Your SQL goes here
CREATE TABLE access (
id SERIAL PRIMARY KEY,
access_name VARCHAR(255) NOT NULL
);

INSERT INTO access (access_name) VALUES
("SearchUser"),
("GetUser"),
("CreateUser"),
("UpdateUser"),
("DeleteUser");

CREATE TABLE user_access (
permission_id SERIAL PRIMARY KEY,
access_id BIGINT UNSIGNED NOT NULL,
user_id BIGINT UNSIGNED NOT NULL,
FOREIGN KEY (access_id)
REFERENCES access(id)
ON DELETE CASCADE
ON UPDATE CASCADE,
FOREIGN KEY (user_id)
REFERENCES users(id)
ON DELETE CASCADE
ON UPDATE CASCADE,
permission_level VARCHAR(255)
);
3 changes: 3 additions & 0 deletions backend/migrations/2019-04-15-150025_chemicals/down.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
-- This file should undo anything in `up.sql`
DROP chemical_inventory;
DROP chemical;
30 changes: 30 additions & 0 deletions backend/migrations/2019-04-15-150025_chemicals/up.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
-- Your SQL goes here
CREATE TABLE chemical (
id SERIAL PRIMARY KEY,
name VARCHAR(255) NOT NULL,
purpose VARCHAR(1023) NOT NULL,
company_name VARCHAR(255) NOT NULL,
ingredients VARCHAR(1023) NOT NULL,
manual_link VARCHAR(1023) NOT NULL
);

CREATE TABLE chemical_inventory (
id SERIAL PRIMARY KEY,
purchaser_id BIGINT UNSIGNED NOT NULL,
custodian_id BIGINT UNSIGNED NOT NULL,
chemical_id BIGINT UNSIGNED NOT NULL,
storage_location VARCHAR(255) NOT NULL,
amount VARCHAR(255) NOT NULL,
FOREIGN KEY (purchaser_id)
REFERENCES users(id)
ON DELETE CASCADE
ON UPDATE CASCADE,
FOREIGN KEY (custodian_id)
REFERENCES users(id)
ON DELETE CASCADE
ON UPDATE CASCADE,
FOREIGN KEY (chemical_id)
REFERENCES chemical(id)
ON DELETE CASCADE
ON UPDATE CASCADE
);
3 changes: 3 additions & 0 deletions backend/src/access.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
pub mod models;
pub mod requests;
pub mod schema;
238 changes: 238 additions & 0 deletions backend/src/access/models.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,238 @@
use diesel::Queryable;

use rouille::router;

use serde::Deserialize;
use serde::Serialize;

use url::form_urlencoded;

use log::{trace, warn};

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

use crate::search::{NullableSearch, Search};

use super::schema::{access, user_access};

#[derive(Queryable, Serialize, Deserialize)]
pub struct Access {
pub id: u64,
pub access_name: String,
}

#[derive(Insertable, Serialize, Deserialize)]
#[table_name = "access"]
pub struct NewAccess {
pub access_name: String,
}

#[derive(AsChangeset, Serialize, Deserialize)]
#[table_name = "access"]
pub struct PartialAccess {
pub access_name: String,
}

pub enum AccessRequest {
GetAccess(u64), //id of access name searched
CreateAccess(NewAccess), //new access type of some name to be created
UpdateAccess(u64, PartialAccess), //Contains id to be changed to new access_name
DeleteAccess(u64), //if of access to be deleted
}

impl AccessRequest {
pub fn from_rouille(
request: &rouille::Request,
) -> Result<AccessRequest, WebdevError> {
trace!("Creating AccessRequest from {:#?}", request);

router!(request,
(GET) (/{id: u64}) => {
Ok(AccessRequest::GetAccess(id))
},

(POST) (/) => {
let request_body = request.data().ok_or(WebdevError::new(WebdevErrorKind::Format))?;
let new_access: NewAccess = serde_json::from_reader(request_body)?;

Ok(AccessRequest::CreateAccess(new_access))
},

(POST) (/{id: u64}) => {
let request_body = request.data().ok_or(WebdevError::new(WebdevErrorKind::Format))?;
let update_access: PartialAccess = serde_json::from_reader(request_body)?;

Ok(AccessRequest::UpdateAccess(id, update_access))
},

(DELETE) (/{id: u64}) => {
Ok(AccessRequest::DeleteAccess(id))
},

_ => {
warn!("Could not create an access request for the given rouille request");
Err(WebdevError::new(WebdevErrorKind::NotFound))
}
) //end router
}
}

pub enum AccessResponse {
OneAccess(Access),
NoResponse,
}

impl AccessResponse {
pub fn to_rouille(self) -> rouille::Response {
match self {
AccessResponse::OneAccess(access) => {
rouille::Response::json(&access)
}
AccessResponse::NoResponse => rouille::Response::empty_204(),
}
}
}

#[derive(Queryable, Serialize, Deserialize)]
pub struct UserAccess {
pub permission_id: u64,
pub access_id: u64,
pub user_id: u64,
pub permission_level: Option<String>,
}

#[derive(Insertable, Serialize, Deserialize)]
#[table_name = "user_access"]
pub struct NewUserAccess {
pub access_id: u64,
pub user_id: u64,
pub permission_level: Option<String>,
}

#[derive(AsChangeset, Serialize, Deserialize)]
#[table_name = "user_access"]
pub struct PartialUserAccess {
pub access_id: u64,
pub user_id: u64,
pub permission_level: Option<Option<String>>,
}

pub struct SearchUserAccess {
pub access_id: Search<u64>,
pub user_id: Search<u64>,
pub permission_level: NullableSearch<String>,
}

pub enum UserAccessRequest {
SearchAccess(SearchUserAccess), //list of users with access id or (?) name
GetAccess(u64), //get individual access entry from its id
CheckAccess(u64, u64), //entry allowing user of user_id to perform action of action_id
CreateAccess(NewUserAccess), //entry to add to database
UpdateAccess(u64, PartialUserAccess), //entry to update with new information
DeleteAccess(u64), //entry to delete from database
}

impl UserAccessRequest {
pub fn from_rouille(
request: &rouille::Request,
) -> Result<UserAccessRequest, WebdevError> {
trace!("Creating UserAccessRequest from {:#?}", request);

let url_queries =
form_urlencoded::parse(request.raw_query_string().as_bytes());

router!(request,
(GET) (/) => {

let mut access_id_search = Search::NoSearch;
let mut user_id_search = Search::NoSearch;
let mut permission_level_search = NullableSearch::NoSearch;

for (field, query) in url_queries {
match field.as_ref() as &str {
"access_id" => access_id_search = Search::from_query(query.as_ref())?,
"user_id" => user_id_search = Search::from_query(query.as_ref())?,
"permission_level" => permission_level_search = NullableSearch::from_query(query.as_ref())?,
_ => return Err(WebdevError::new(WebdevErrorKind::Format)),
}
}

Ok(UserAccessRequest::SearchAccess(SearchUserAccess {
access_id: access_id_search,
user_id: user_id_search,
permission_level: permission_level_search,
}))
},

(GET) (/{permission_id: u64}) => {
Ok(UserAccessRequest::GetAccess(permission_id))
},

(GET) (/{user_id:u64}/{access_id: u64}) => {
Ok(UserAccessRequest::CheckAccess(user_id, access_id))
},

(POST) (/) => {
let request_body = request.data().ok_or(WebdevError::new(WebdevErrorKind::Format))?;
let new_user_access: NewUserAccess = serde_json::from_reader(request_body)?;

Ok(UserAccessRequest::CreateAccess(new_user_access))
},

(POST) (/{id: u64}) => {
let request_body = request.data().ok_or(WebdevError::new(WebdevErrorKind::Format))?;
let update_user_access: PartialUserAccess = serde_json::from_reader(request_body)?;

Ok(UserAccessRequest::UpdateAccess(id, update_user_access))
},

(DELETE) (/{id: u64}) => {
Ok(UserAccessRequest::DeleteAccess(id))
},

_ => {
warn!("Could not create a user access request for the given rouille request");
Err(WebdevError::new(WebdevErrorKind::NotFound))
}
) //end router
}
}

pub enum UserAccessResponse {
AccessState(bool),
ManyUserAccess(JoinedUserAccessList),
OneUserAccess(UserAccess),
NoResponse,
}

impl UserAccessResponse {
pub fn to_rouille(self) -> rouille::Response {
match self {
UserAccessResponse::AccessState(state) => {
rouille::Response::text(if state { "true" } else { "false" })
}
UserAccessResponse::ManyUserAccess(user_accesses) => {
rouille::Response::json(&user_accesses)
}
UserAccessResponse::OneUserAccess(user_access) => {
rouille::Response::json(&user_access)
}
UserAccessResponse::NoResponse => rouille::Response::empty_204(),
}
}
}

#[derive(Queryable, Serialize, Deserialize)]
pub struct JoinedUserAccess {
pub permission_id: u64,
pub user_id: u64,
pub access_id: u64,
pub first_name: String,
pub last_name: String,
pub banner_id: u32,
}

#[derive(Serialize, Deserialize)]
pub struct JoinedUserAccessList {
pub entries: Vec<JoinedUserAccess>,
}
Loading