use log::{debug, error, info, log_enabled, Level};
use serde::Deserialize;
-use crate::config::Config;
-use crate::consts;
-use crate::data::{asynchronous, db};
-use crate::email;
-use crate::model;
-use crate::user::User;
-use crate::utils;
+use crate::{
+ config::Config,
+ consts,
+ data::{asynchronous, db},
+ email,
+ model,
+ utils,
+};
mod api;
async fn get_current_user(
req: &HttpRequest,
connection: web::Data<db::Connection>,
-) -> Option<User> {
+) -> Option<model::User> {
let (client_ip, client_user_agent) = get_ip_and_user_agent(req);
match req.cookie(consts::COOKIE_AUTH_TOKEN_NAME) {
#[derive(Template)]
#[template(path = "home.html")]
struct HomeTemplate {
- user: Option<User>,
+ user: Option<model::User>,
recipes: Vec<(i64, String)>,
current_recipe_id: Option<i64>,
}
#[derive(Template)]
#[template(path = "view_recipe.html")]
struct ViewRecipeTemplate {
- user: Option<User>,
+ user: Option<model::User>,
recipes: Vec<(i64, String)>,
current_recipe_id: Option<i64>,
+
current_recipe: model::Recipe,
}
.to_response())
}
-///// EDIT RECIPE /////
+///// EDIT/NEW RECIPE /////
#[derive(Template)]
#[template(path = "edit_recipe.html")]
struct EditRecipeTemplate {
- user: Option<User>,
+ user: Option<model::User>,
recipes: Vec<(i64, String)>,
current_recipe_id: Option<i64>,
+
current_recipe: model::Recipe,
}
connection: web::Data<db::Connection>,
) -> Result<HttpResponse> {
let (id,) = path.into_inner();
- let user = get_current_user(&req, connection.clone()).await;
- let recipes = connection.get_all_recipe_titles_async().await?;
+ let user = match get_current_user(&req, connection.clone()).await {
+ Some(u) => u,
+ None =>
+ return Ok(MessageTemplate {
+ user: None,
+ message: "Cannot edit a recipe without being logged in",
+ }.to_response())
+ };
+
let recipe = connection.get_recipe_async(id).await?;
+ if recipe.user_id != user.id {
+ return Ok(MessageTemplate {
+ message: "Cannot edit a recipe you don't own",
+ user: Some(user)
+ }.to_response())
+ }
+
+ let recipes = connection.get_all_recipe_titles_async().await?;
+
Ok(EditRecipeTemplate {
- user,
+ user: Some(user),
current_recipe_id: Some(recipe.id),
recipes,
current_recipe: recipe,
.to_response())
}
+#[get("/recipe/new")]
+pub async fn new_recipe(
+ req: HttpRequest,
+ path: web::Path<(i64,)>,
+ connection: web::Data<db::Connection>,
+) -> Result<HttpResponse> {
+ let user = match get_current_user(&req, connection.clone()).await {
+ Some(u) => u,
+ None =>
+ return Ok(MessageTemplate {
+ message: "Cannot create a recipe without being logged in",
+ user: None
+ }.to_response())
+ };
+
+ let recipe_id = connection.create_recipe_async(user.id).await?;
+ let recipes = connection.get_all_recipe_titles_async().await?;
+ let user_id = user.id;
+
+ Ok(EditRecipeTemplate {
+ user: Some(user),
+ current_recipe_id: Some(recipe_id),
+ recipes,
+ current_recipe: model::Recipe::empty(recipe_id, user_id),
+ }
+ .to_response())
+}
+
///// MESSAGE /////
#[derive(Template)]
#[derive(Template)]
#[template(path = "message.html")]
struct MessageTemplate<'a> {
- user: Option<User>,
+ user: Option<model::User>,
message: &'a str,
}
#[derive(Template)]
#[template(path = "sign_up_form.html")]
struct SignUpFormTemplate {
- user: Option<User>,
+ user: Option<model::User>,
email: String,
message: String,
message_email: String,
fn error_response(
error: SignUpError,
form: &web::Form<SignUpFormData>,
- user: Option<User>,
+ user: Option<model::User>,
) -> Result<HttpResponse> {
Ok(SignUpFormTemplate {
user,
#[derive(Template)]
#[template(path = "sign_in_form.html")]
struct SignInFormTemplate {
- user: Option<User>,
+ user: Option<model::User>,
email: String,
message: String,
}
fn error_response(
error: SignInError,
form: &web::Form<SignInFormData>,
- user: Option<User>,
+ user: Option<model::User>,
) -> Result<HttpResponse> {
Ok(SignInFormTemplate {
user,