-use std::io::prelude::*;
-use std::{fs::File, env::args};
+use std::fs::File;
+use std::sync::Mutex;
use actix_files as fs;
-use actix_web::{get, web, Responder, middleware, App, HttpServer, HttpResponse, HttpRequest, web::Query};
-
-use askama::Template;
-use listenfd::ListenFd;
+use actix_web::{get, web, Responder, middleware, App, HttpServer, HttpRequest};
+use askama_actix::Template;
+use chrono::prelude::*;
+use clap::Parser;
use ron::de::from_reader;
use serde::Deserialize;
-use itertools::Itertools;
-
mod consts;
mod db;
+mod hash;
+mod model;
#[derive(Template)]
#[template(path = "home.html")]
struct HomeTemplate {
- recipes: Vec<db::Recipe>
+ recipes: Vec<(i32, String)>,
}
#[derive(Template)]
#[template(path = "view_recipe.html")]
struct ViewRecipeTemplate {
- recipes: Vec<db::Recipe>,
- current_recipe: db::Recipe
+ recipes: Vec<(i32, String)>,
+ current_recipe: model::Recipe,
}
#[derive(Deserialize)]
}
#[get("/")]
-async fn home_page(req: HttpRequest) -> impl Responder {
- HomeTemplate { recipes: vec![ db::Recipe { title: String::from("Saumon en croûte feuilletée"), id: 1 }, db::Recipe { title: String::from("Croissant au jambon"), id: 2 } ] }
+async fn home_page(req: HttpRequest, connection: web::Data<db::Connection>) -> impl Responder {
+ HomeTemplate { recipes: connection.get_all_recipe_titles().unwrap() } // TODO: unwrap.
}
#[get("/recipe/view/{id}")]
-async fn view_page(req: HttpRequest, path: web::Path<(i32,)>) -> impl Responder {
- ViewRecipeTemplate { recipes: vec![ db::Recipe { title: String::from("Saumon en croûte feuilletée"), id: 1 }, db::Recipe { title: String::from("Croissant au jambon"), id: 2 } ], current_recipe: db::Recipe { title: String::from("Saumon en croûte feuilletée"), id: 1 } }
+async fn view_recipe(req: HttpRequest, path: web::Path<(i32,)>, connection: web::Data<db::Connection>) -> impl Responder {
+ ViewRecipeTemplate {
+ recipes: connection.get_all_recipe_titles().unwrap(),
+ current_recipe: connection.get_recipe(path.0).unwrap(),
+ }
}
#[derive(Debug, Deserialize)]
first_arg[first_arg.rfind(sep).unwrap()+1..].to_string()
}
-#[actix_rt::main]
+#[actix_web::main]
async fn main() -> std::io::Result<()> {
if process_args() { return Ok(()) }
+ std::env::set_var("RUST_LOG", "actix_web=debug");
+ env_logger::init();
+
println!("Starting Recipes as web server...");
let config: Config = {
println!("Configuration: {:?}", config);
- // let database_connection = db::create_or_update();
+ let db_connection = web::Data::new(db::Connection::new().unwrap()); // TODO: remove unwrap.
std::env::set_var("RUST_LOG", "actix_web=info");
- let mut listenfd = ListenFd::from_env();
let mut server =
HttpServer::new(
- || {
+ move || {
App::new()
+ .wrap(middleware::Logger::default())
.wrap(middleware::Compress::default())
+ .app_data(db_connection.clone())
.service(home_page)
- .service(view_page)
+ .service(view_recipe)
.service(fs::Files::new("/static", "static").show_files_listing())
}
);
- server =
- if let Some(l) = listenfd.take_tcp_listener(0).unwrap() {
- server.listen(l).unwrap()
- } else {
- server.bind(&format!("0.0.0.0:{}", config.port)).unwrap()
- };
+ server = server.bind(&format!("0.0.0.0:{}", config.port)).unwrap();
server.run().await
}
+#[derive(Parser, Debug)]
+struct Args {
+ #[arg(long)]
+ dbtest: bool
+}
+
fn process_args() -> bool {
+ let args = Args::parse();
+
+ if args.dbtest {
+ match db::Connection::new() {
+ Ok(con) => {
+ if let Err(error) = con.execute_file("sql/data_test.sql") {
+ println!("Error: {:?}", error);
+ }
+ // Set the creation datetime to 'now'.
+ con.execute_sql("UPDATE [User] SET [creation_datetime] = ?1 WHERE [email] = 'paul@test.org'", [Utc::now()]).unwrap();
+ },
+ Err(error) => {
+ println!("Error: {:?}", error)
+ },
+ }
+
+ return true;
+ }
+
+ false
+
+ /*
+
+
fn print_usage() {
println!("Usage:");
println!(" {} [--help] [--test]", get_exe_name());
}
return true
}
-
false
+ */
}