|
|
|
@ -1,17 +1,30 @@
|
|
|
|
|
extern crate gempress; |
|
|
|
|
extern crate dotenv; |
|
|
|
|
#[macro_use] extern crate diesel; |
|
|
|
|
|
|
|
|
|
use std::path::PathBuf; |
|
|
|
|
use std::env; |
|
|
|
|
|
|
|
|
|
use gempress::Gempress; |
|
|
|
|
use gempress::error::GempressResult; |
|
|
|
|
use gempress::gemini; |
|
|
|
|
use gempress::gemini::StatusCode; |
|
|
|
|
use std::path::PathBuf; |
|
|
|
|
use std::hash::{Hash, Hasher}; |
|
|
|
|
use std::collections::hash_map::DefaultHasher; |
|
|
|
|
|
|
|
|
|
fn calculate_hash<T: Hash>(t: &T) -> u64 { |
|
|
|
|
let mut s = DefaultHasher::new(); |
|
|
|
|
t.hash(&mut s); |
|
|
|
|
s.finish() |
|
|
|
|
use diesel::prelude::*; |
|
|
|
|
use diesel::sqlite::SqliteConnection; |
|
|
|
|
|
|
|
|
|
use self::models::*; |
|
|
|
|
|
|
|
|
|
pub mod models; |
|
|
|
|
pub mod schema; |
|
|
|
|
|
|
|
|
|
pub fn establish_connection() -> SqliteConnection { |
|
|
|
|
dotenv::dotenv().ok(); |
|
|
|
|
|
|
|
|
|
let database_url = env::var("DATABASE_URL") |
|
|
|
|
.expect("DATABASE_URL must be set"); |
|
|
|
|
SqliteConnection::establish(&database_url) |
|
|
|
|
.expect(&format!("Error connecting to {}", database_url)) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
fn index_handler(req: Box<gemini::Request>, mut res: Box<gemini::Response>) -> GempressResult<()>{ |
|
|
|
@ -20,7 +33,49 @@ fn index_handler(req: Box<gemini::Request>, mut res: Box<gemini::Response>) -> G
|
|
|
|
|
Hello, {} |
|
|
|
|
"#, "user"); |
|
|
|
|
|
|
|
|
|
println!("Index handler"); |
|
|
|
|
res.status(StatusCode::Success)?.send(response.as_bytes())?; |
|
|
|
|
Ok(()) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
fn add_user_handler(req: Box<gemini::Request>, mut res: Box<gemini::Response>) -> GempressResult<()>{ |
|
|
|
|
use self::schema::users::dsl::*; |
|
|
|
|
|
|
|
|
|
let conn = establish_connection(); |
|
|
|
|
|
|
|
|
|
let new_user = NewUser { |
|
|
|
|
name: "Foo".into(), |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
diesel::insert_into(users).values(new_user).execute(&conn); |
|
|
|
|
|
|
|
|
|
let user: User = users |
|
|
|
|
.order(id.desc()) |
|
|
|
|
.first(&conn) |
|
|
|
|
.expect("Error loading posts"); |
|
|
|
|
|
|
|
|
|
let response = format!(r#" |
|
|
|
|
# User inserted |
|
|
|
|
User "{}" created. ID: {} |
|
|
|
|
"#, user.name, user.id); |
|
|
|
|
|
|
|
|
|
res.status(StatusCode::Success)?.send(response.as_bytes())?; |
|
|
|
|
Ok(()) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
fn show_users_handler(req: Box<gemini::Request>, mut res: Box<gemini::Response>) -> GempressResult<()>{ |
|
|
|
|
use self::schema::users::dsl::*; |
|
|
|
|
|
|
|
|
|
let conn = establish_connection(); |
|
|
|
|
|
|
|
|
|
let results = users |
|
|
|
|
.load::<User>(&conn) |
|
|
|
|
.expect("Error loading posts"); |
|
|
|
|
|
|
|
|
|
let mut response = "# Users\n\n".to_string(); |
|
|
|
|
|
|
|
|
|
for user in results { |
|
|
|
|
response += &format!("{}: {}\n", user.id, user.name); |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
res.status(StatusCode::Success)?.send(response.as_bytes())?; |
|
|
|
|
Ok(()) |
|
|
|
@ -30,9 +85,12 @@ fn main() {
|
|
|
|
|
// Run make_cert.sh to generate a certificate
|
|
|
|
|
let config = gempress::Config::new(PathBuf::from("cert.pem"), PathBuf::from("key.pem")); |
|
|
|
|
|
|
|
|
|
let conn = establish_connection(); |
|
|
|
|
|
|
|
|
|
let mut app = Gempress::new(config); |
|
|
|
|
|
|
|
|
|
app.on("/", &index_handler); |
|
|
|
|
app.on("/", &show_users_handler); |
|
|
|
|
app.on("/add_user", &add_user_handler); |
|
|
|
|
|
|
|
|
|
app.listen(1965, || { |
|
|
|
|
println!("Listening on port 1965"); |
|
|
|
|