+ }
+ .to_response())
+}
+
+///// EDIT/NEW RECIPE /////
+
+#[derive(Template)]
+#[template(path = "edit_recipe.html")]
+struct EditRecipeTemplate {
+ user: Option<model::User>,
+ recipes: Vec<(i64, String)>,
+ current_recipe_id: Option<i64>,
+
+ current_recipe: model::Recipe,
+}
+
+#[get("/recipe/edit/{id}")]
+pub async fn edit_recipe(
+ req: HttpRequest,
+ path: web::Path<(i64,)>,
+ connection: web::Data<db::Connection>,
+) -> Result<HttpResponse> {
+ let (id,) = path.into_inner();
+ 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: 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())