|  | @ -19,13 +19,32 @@ struct OrgData { | 
			
		
	
		
		
			
				
					|  |  |     planType: String, |  |  |     planType: String, | 
			
		
	
		
		
			
				
					|  |  | } |  |  | } | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  | #[derive(Deserialize, Debug)] | 
			
		
	
		
		
			
				
					|  |  |  |  |  | #[allow(non_snake_case)] | 
			
		
	
		
		
			
				
					|  |  |  |  |  | struct OrganizationUpdateData { | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     billingEmail: String, | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     name: String, | 
			
		
	
		
		
			
				
					|  |  |  |  |  | } | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  | #[derive(Deserialize, Debug)] | 
			
		
	
		
		
			
				
					|  |  |  |  |  | #[allow(non_snake_case)] | 
			
		
	
		
		
			
				
					|  |  |  |  |  | struct NewCollectionData { | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     name: String, | 
			
		
	
		
		
			
				
					|  |  |  |  |  | } | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  | #[post("/organizations", data = "<data>")] |  |  | #[post("/organizations", data = "<data>")] | 
			
		
	
		
		
			
				
					|  |  | fn create_organization(headers: Headers, data: Json<OrgData>, conn: DbConn) -> JsonResult { |  |  | fn create_organization(headers: Headers, data: Json<OrgData>, conn: DbConn) -> JsonResult { | 
			
		
	
		
		
			
				
					|  |  |     let data: OrgData = data.into_inner(); |  |  |     let data: OrgData = data.into_inner(); | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |     let mut org = Organization::new(data.name, data.billingEmail); |  |  |     let mut org = Organization::new(data.name, data.billingEmail); | 
			
		
	
		
		
			
				
					|  |  |     let mut user_org = UserOrganization::new( |  |  |     let mut user_org = UserOrganization::new( | 
			
		
	
		
		
			
				
					
					|  |  |         headers.user.uuid, org.uuid.clone()); |  |  |         headers.user.uuid.clone(), org.uuid.clone()); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |  |  |  |     let mut collection = Collection::new( | 
			
		
	
		
		
			
				
					|  |  |  |  |  |         org.uuid.clone(), data.collectionName); | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     let mut collection_user = CollectionUsers::new( | 
			
		
	
		
		
			
				
					|  |  |  |  |  |         headers.user.uuid.clone(), | 
			
		
	
		
		
			
				
					|  |  |  |  |  |         collection.uuid.clone(), | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     ); | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |     user_org.key = data.key; |  |  |     user_org.key = data.key; | 
			
		
	
		
		
			
				
					|  |  |     user_org.access_all = true; |  |  |     user_org.access_all = true; | 
			
		
	
	
		
		
			
				
					|  | @ -34,6 +53,8 @@ fn create_organization(headers: Headers, data: Json<OrgData>, conn: DbConn) -> J | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |     org.save(&conn); |  |  |     org.save(&conn); | 
			
		
	
		
		
			
				
					|  |  |     user_org.save(&conn); |  |  |     user_org.save(&conn); | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     collection.save(&conn); | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     collection_user.save(&conn); | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |     Ok(Json(org.to_json())) |  |  |     Ok(Json(org.to_json())) | 
			
		
	
		
		
			
				
					|  |  | } |  |  | } | 
			
		
	
	
		
		
			
				
					|  | @ -46,30 +67,133 @@ fn delete_organization(org_id: String, data: Json<PasswordData>, headers: Header | 
			
		
	
		
		
			
				
					|  |  |     unimplemented!() |  |  |     unimplemented!() | 
			
		
	
		
		
			
				
					|  |  | } |  |  | } | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  | #[get("/organizations/<org_id>")] | 
			
		
	
		
		
			
				
					|  |  |  |  |  | fn get_organization(org_id: String, headers: Headers, conn: DbConn) -> JsonResult { | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     if UserOrganization::find_by_user_and_org( &headers.user.uuid, &org_id, &conn).is_none() { | 
			
		
	
		
		
			
				
					|  |  |  |  |  |         err!("User not in Organization or Organization doesn't exist") | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     } | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     match Organization::find_by_uuid(&org_id, &conn) { | 
			
		
	
		
		
			
				
					|  |  |  |  |  |         Some(organization) => Ok(Json(organization.to_json())), | 
			
		
	
		
		
			
				
					|  |  |  |  |  |         None => err!("Can't find organization details") | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     } | 
			
		
	
		
		
			
				
					|  |  |  |  |  | } | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  | #[post("/organizations/<org_id>", data = "<data>")] | 
			
		
	
		
		
			
				
					|  |  |  |  |  | fn post_organization(org_id: String, headers: Headers, data: Json<OrganizationUpdateData>, conn: DbConn) -> JsonResult { | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     let data: OrganizationUpdateData = data.into_inner(); | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     match UserOrganization::find_by_user_and_org( &headers.user.uuid, &org_id, &conn) { | 
			
		
	
		
		
			
				
					|  |  |  |  |  |         None => err!("User not in Organization or Organization doesn't exist"), | 
			
		
	
		
		
			
				
					|  |  |  |  |  |         Some(org_user) => if org_user.type_ != 0 { // not owner
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  |             err!("Only owner can change Organization details") | 
			
		
	
		
		
			
				
					|  |  |  |  |  |         } | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     }; | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     let mut org = match Organization::find_by_uuid(&org_id, &conn) { | 
			
		
	
		
		
			
				
					|  |  |  |  |  |         Some(organization) => organization, | 
			
		
	
		
		
			
				
					|  |  |  |  |  |         None => err!("Can't find organization details") | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     }; | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     org.name = data.name; | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     org.billing_email = data.billingEmail; | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     org.save(&conn); | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     Ok(Json(org.to_json())) | 
			
		
	
		
		
			
				
					|  |  |  |  |  | } | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  | // GET /api/collections?writeOnly=false
 |  |  | // GET /api/collections?writeOnly=false
 | 
			
		
	
		
		
			
				
					|  |  | #[get("/collections")] |  |  | #[get("/collections")] | 
			
		
	
		
		
			
				
					|  |  | fn get_user_collections(headers: Headers, conn: DbConn) -> JsonResult { |  |  | fn get_user_collections(headers: Headers, conn: DbConn) -> JsonResult { | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |     // let collections_json = get_user_collections().map(|c|c.to_json());
 |  |  |  | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  |  | 
			
		
	
		
		
			
				
					|  |  |     Ok(Json(json!({ |  |  |     Ok(Json(json!({ | 
			
		
	
		
		
			
				
					
					|  |  |         "Data": [], |  |  |         "Data": | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |  |  |  |             Collection::find_by_user_uuid(&headers.user.uuid, &conn) | 
			
		
	
		
		
			
				
					|  |  |  |  |  |             .iter() | 
			
		
	
		
		
			
				
					|  |  |  |  |  |             .map(|collection| { | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                 collection.to_json() | 
			
		
	
		
		
			
				
					|  |  |  |  |  |             }).collect::<Value>(), | 
			
		
	
		
		
			
				
					|  |  |         "Object": "list" |  |  |         "Object": "list" | 
			
		
	
		
		
			
				
					|  |  |     }))) |  |  |     }))) | 
			
		
	
		
		
			
				
					|  |  | } |  |  | } | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  | #[get("/organizations/<org_id>/collections")] |  |  | #[get("/organizations/<org_id>/collections")] | 
			
		
	
		
		
			
				
					|  |  | fn get_org_collections(org_id: String, headers: Headers, conn: DbConn) -> JsonResult { |  |  | fn get_org_collections(org_id: String, headers: Headers, conn: DbConn) -> JsonResult { | 
			
		
	
		
		
			
				
					|  |  |     // let org = get_org_by_id(org_id)
 |  |  |  | 
			
		
	
		
		
			
				
					|  |  |     // let collections_json = org.collections().map(|c|c.to_json());
 |  |  |  | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  |  | 
			
		
	
		
		
			
				
					|  |  |     Ok(Json(json!({ |  |  |     Ok(Json(json!({ | 
			
		
	
		
		
			
				
					
					|  |  |         "Data": [], |  |  |         "Data": | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |  |  |  |             Collection::find_by_user_uuid(&headers.user.uuid, &conn) | 
			
		
	
		
		
			
				
					|  |  |  |  |  |             .iter() | 
			
		
	
		
		
			
				
					|  |  |  |  |  |             .filter(|collection| { collection.org_uuid == org_id }) | 
			
		
	
		
		
			
				
					|  |  |  |  |  |             .map(|collection| { | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                 collection.to_json() | 
			
		
	
		
		
			
				
					|  |  |  |  |  |             }).collect::<Value>(), | 
			
		
	
		
		
			
				
					|  |  |         "Object": "list" |  |  |         "Object": "list" | 
			
		
	
		
		
			
				
					|  |  |     }))) |  |  |     }))) | 
			
		
	
		
		
			
				
					|  |  | } |  |  | } | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  | #[post("/organizations/<org_id>/collections", data = "<data>")] | 
			
		
	
		
		
			
				
					|  |  |  |  |  | fn post_organization_collections(org_id: String, headers: Headers, data: Json<NewCollectionData>, conn: DbConn) -> JsonResult { | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     let data: NewCollectionData = data.into_inner(); | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     match UserOrganization::find_by_user_and_org( &headers.user.uuid, &org_id, &conn) { | 
			
		
	
		
		
			
				
					|  |  |  |  |  |         None => err!("User not in Organization or Organization doesn't exist"), | 
			
		
	
		
		
			
				
					|  |  |  |  |  |         Some(org_user) => if org_user.type_ > 1 { // not owner or admin
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  |             err!("Only Organization owner and admin can add Collection") | 
			
		
	
		
		
			
				
					|  |  |  |  |  |         } | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     }; | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     let org = match Organization::find_by_uuid(&org_id, &conn) { | 
			
		
	
		
		
			
				
					|  |  |  |  |  |         Some(organization) => organization, | 
			
		
	
		
		
			
				
					|  |  |  |  |  |         None => err!("Can't find organization details") | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     }; | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     let mut collection = Collection::new(org.uuid.clone(), data.name); | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     let mut collection_user = CollectionUsers::new( | 
			
		
	
		
		
			
				
					|  |  |  |  |  |         headers.user.uuid.clone(), | 
			
		
	
		
		
			
				
					|  |  |  |  |  |         collection.uuid.clone(), | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     ); | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     collection.save(&conn); | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     collection_user.save(&conn); | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     Ok(Json(collection.to_json())) | 
			
		
	
		
		
			
				
					|  |  |  |  |  | } | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  | #[post("/organizations/<org_id>/collections/<col_id>", data = "<data>")] | 
			
		
	
		
		
			
				
					|  |  |  |  |  | fn post_organization_collection_update(org_id: String, col_id: String, headers: Headers, data: Json<NewCollectionData>, conn: DbConn) -> JsonResult { | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     let data: NewCollectionData = data.into_inner(); | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     match UserOrganization::find_by_user_and_org( &headers.user.uuid, &org_id, &conn) { | 
			
		
	
		
		
			
				
					|  |  |  |  |  |         None => err!("User not in Organization or Organization doesn't exist"), | 
			
		
	
		
		
			
				
					|  |  |  |  |  |         Some(org_user) => if org_user.type_ > 1 { // not owner or admin
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  |             err!("Only Organization owner and admin can update Collection") | 
			
		
	
		
		
			
				
					|  |  |  |  |  |         } | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     }; | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     let org = match Organization::find_by_uuid(&org_id, &conn) { | 
			
		
	
		
		
			
				
					|  |  |  |  |  |         Some(organization) => organization, | 
			
		
	
		
		
			
				
					|  |  |  |  |  |         None => err!("Can't find organization details") | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     }; | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     let mut collection = match Collection::find_by_uuid(&col_id, &conn) { | 
			
		
	
		
		
			
				
					|  |  |  |  |  |         Some(collection) => collection, | 
			
		
	
		
		
			
				
					|  |  |  |  |  |         None => err!("Collection not found") | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     }; | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     collection.name = data.name.clone(); | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     collection.save(&conn); | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     Ok(Json(collection.to_json())) | 
			
		
	
		
		
			
				
					|  |  |  |  |  | } | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  | #[get("/organizations/<org_id>/collections/<coll_id>/details")] | 
			
		
	
		
		
			
				
					|  |  |  |  |  | fn get_org_collection_detail(org_id: String, coll_id: String, headers: Headers, conn: DbConn) -> JsonResult { | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     match Collection::find_by_uuid_and_user(&coll_id, &headers.user.uuid, &conn) { | 
			
		
	
		
		
			
				
					|  |  |  |  |  |         None => err!("Collection not found"), | 
			
		
	
		
		
			
				
					|  |  |  |  |  |         Some(collection) => Ok(Json(collection.to_json())) | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     } | 
			
		
	
		
		
			
				
					|  |  |  |  |  | } | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  | #[get("/organizations/<org_id>/collections/<coll_id>/users")] |  |  | #[get("/organizations/<org_id>/collections/<coll_id>/users")] | 
			
		
	
		
		
			
				
					|  |  | fn get_collection_users(org_id: String, coll_id: String, headers: Headers, conn: DbConn) -> JsonResult { |  |  | fn get_collection_users(org_id: String, coll_id: String, headers: Headers, conn: DbConn) -> JsonResult { | 
			
		
	
		
		
			
				
					|  |  |     // Get org and collection, check that collection is from org
 |  |  |     // Get org and collection, check that collection is from org
 | 
			
		
	
	
		
		
			
				
					|  | 
 |