record meals that were added to list, allow delete with ingredients
This commit is contained in:
+53
-13
@@ -14,6 +14,7 @@ use axum::{
|
||||
routing::{get, post},
|
||||
};
|
||||
use futures_util::{SinkExt, StreamExt};
|
||||
use maud::PreEscaped;
|
||||
use serde::{Deserialize, de::DeserializeOwned};
|
||||
use thiserror::Error;
|
||||
use tower_http::trace::{DefaultMakeSpan, DefaultOnResponse, TraceLayer};
|
||||
@@ -122,6 +123,10 @@ pub fn build_router(state: AppState) -> Router {
|
||||
post(delete_ingredient),
|
||||
)
|
||||
.route("/lists/{list_id}/add-meal", post(add_meal_to_list))
|
||||
.route(
|
||||
"/lists/{list_id}/meals/{list_meal_id}/remove",
|
||||
post(remove_meal_from_list),
|
||||
)
|
||||
.route("/lists/{list_id}/stream", get(list_stream))
|
||||
.route("/invite/{token}", get(invitation_page))
|
||||
.route("/invite/{token}/accept", post(accept_invitation))
|
||||
@@ -589,9 +594,11 @@ async fn lists_page(
|
||||
user: CurrentUser,
|
||||
) -> Result<Response, AppError> {
|
||||
let lists = state.lists.list_summaries().await?;
|
||||
let categories = state.lists.categories().await?;
|
||||
Ok(html_response(views::lists_page(
|
||||
&user.session.user,
|
||||
&lists,
|
||||
&categories,
|
||||
&user.session.csrf_token,
|
||||
)))
|
||||
}
|
||||
@@ -620,12 +627,14 @@ async fn list_page(
|
||||
let access = require_list(&state, list_id).await?;
|
||||
let items = state.lists.items(list_id).await?;
|
||||
let categories = state.lists.categories().await?;
|
||||
let list_meals = state.meals.list_meals_on_list(list_id).await?;
|
||||
let presence = state.realtime.presence(list_id).await;
|
||||
Ok(html_response(views::list_page(
|
||||
&user.session.user,
|
||||
&access,
|
||||
&items,
|
||||
&categories,
|
||||
&list_meals,
|
||||
&presence,
|
||||
&user.session.csrf_token,
|
||||
)))
|
||||
@@ -953,6 +962,21 @@ async fn add_meal_to_list(
|
||||
list_fragment_response(&state, &user, list_id).await
|
||||
}
|
||||
|
||||
async fn remove_meal_from_list(
|
||||
State(state): State<AppState>,
|
||||
user: CurrentUser,
|
||||
Path((list_id, list_meal_id)): Path<(i64, i64)>,
|
||||
LoggedForm(form): LoggedForm<CsrfForm>,
|
||||
) -> Result<Response, AppError> {
|
||||
verify_csrf(&user, &form.csrf)?;
|
||||
require_list(&state, list_id).await?;
|
||||
state
|
||||
.meals
|
||||
.remove_meal_from_list(list_id, list_meal_id)
|
||||
.await?;
|
||||
list_fragment_response(&state, &user, list_id).await
|
||||
}
|
||||
|
||||
async fn create_invitation(
|
||||
State(state): State<AppState>,
|
||||
user: CurrentUser,
|
||||
@@ -1117,11 +1141,16 @@ async fn websocket_snapshot(
|
||||
let access = require_list(state, list_id).await?;
|
||||
let items = state.lists.items(list_id).await?;
|
||||
let categories = state.lists.categories().await?;
|
||||
Ok(
|
||||
views::live_list_fragments(&access, &items, &categories, &user.session.csrf_token)
|
||||
.into_string()
|
||||
+ &views::presence_panel(presence, true).into_string(),
|
||||
let list_meals = state.meals.list_meals_on_list(list_id).await?;
|
||||
Ok(views::live_list_fragments(
|
||||
&access,
|
||||
&items,
|
||||
&categories,
|
||||
&list_meals,
|
||||
&user.session.csrf_token,
|
||||
)
|
||||
.into_string()
|
||||
+ &views::presence_panel(presence, true).into_string())
|
||||
}
|
||||
|
||||
async fn websocket_list_update(
|
||||
@@ -1132,10 +1161,15 @@ async fn websocket_list_update(
|
||||
let access = require_list(state, list_id).await?;
|
||||
let items = state.lists.items(list_id).await?;
|
||||
let categories = state.lists.categories().await?;
|
||||
Ok(
|
||||
views::live_list_fragments(&access, &items, &categories, &user.session.csrf_token)
|
||||
.into_string(),
|
||||
let list_meals = state.meals.list_meals_on_list(list_id).await?;
|
||||
Ok(views::live_list_fragments(
|
||||
&access,
|
||||
&items,
|
||||
&categories,
|
||||
&list_meals,
|
||||
&user.session.csrf_token,
|
||||
)
|
||||
.into_string())
|
||||
}
|
||||
|
||||
async fn list_fragment_response(
|
||||
@@ -1146,12 +1180,18 @@ async fn list_fragment_response(
|
||||
let access = require_list(state, list_id).await?;
|
||||
let items = state.lists.items(list_id).await?;
|
||||
let categories = state.lists.categories().await?;
|
||||
Ok(html_response(views::list_items_fragment(
|
||||
&access,
|
||||
&items,
|
||||
&categories,
|
||||
&user.session.csrf_token,
|
||||
false,
|
||||
let list_meals = state.meals.list_meals_on_list(list_id).await?;
|
||||
Ok(html_response(PreEscaped(
|
||||
views::list_items_fragment(
|
||||
&access,
|
||||
&items,
|
||||
&categories,
|
||||
&user.session.csrf_token,
|
||||
false,
|
||||
)
|
||||
.into_string()
|
||||
+ &views::list_meals_panel(&list_meals, list_id, &user.session.csrf_token, true)
|
||||
.into_string(),
|
||||
)))
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user