This commit is contained in:
2023-09-17 16:00:42 +02:00
parent 8c0a4c53b8
commit 96523ad870
3 changed files with 216 additions and 226 deletions

View File

@@ -8,7 +8,6 @@ use axum::{
use crate::components;
use crate::components::crud::*;
use crate::components::trips::todos;
use crate::components::view::*;
use crate::view::Component;
@@ -1268,215 +1267,3 @@ pub async fn trip_item_packagelist_set_unready_htmx(
trip_id, &item,
))
}
#[tracing::instrument]
pub async fn trip_todo_done_htmx(
Extension(current_user): Extension<models::user::User>,
State(state): State<AppState>,
Path((trip_id, todo_id)): Path<(Uuid, Uuid)>,
) -> Result<impl IntoResponse, Error> {
let ctx = Context::build(current_user);
components::trips::todos::Todo::update(
&ctx,
&state.database_pool,
todos::Filter { trip_id },
todo_id,
todos::UpdateElement::State(components::trips::todos::State::Done),
)
.await?;
let todo_item = components::trips::todos::Todo::find(
&ctx,
&state.database_pool,
todos::Filter { trip_id },
todo_id,
)
.await?
.ok_or_else(|| {
Error::Request(RequestError::NotFound {
message: format!("todo with id {todo_id} not found"),
})
})?;
Ok(todo_item.build(todos::BuildInput {
trip_id,
state: components::trips::todos::UiState::Default,
}))
}
#[tracing::instrument]
pub async fn trip_todo_done(
Extension(current_user): Extension<models::user::User>,
State(state): State<AppState>,
Path((trip_id, todo_id)): Path<(Uuid, Uuid)>,
headers: HeaderMap,
) -> Result<impl IntoResponse, Error> {
let ctx = Context::build(current_user);
components::trips::todos::Todo::update(
&ctx,
&state.database_pool,
todos::Filter { trip_id },
todo_id,
todos::UpdateElement::State(components::trips::todos::State::Done),
)
.await?;
Ok(Redirect::to(get_referer(&headers)?))
}
#[tracing::instrument]
pub async fn trip_todo_undone_htmx(
Extension(current_user): Extension<models::user::User>,
State(state): State<AppState>,
Path((trip_id, todo_id)): Path<(Uuid, Uuid)>,
) -> Result<impl IntoResponse, Error> {
let ctx = Context::build(current_user);
components::trips::todos::Todo::update(
&ctx,
&state.database_pool,
todos::Filter { trip_id },
todo_id,
todos::UpdateElement::State(components::trips::todos::State::Todo),
)
.await?;
let todo_item = components::trips::todos::Todo::find(
&ctx,
&state.database_pool,
todos::Filter { trip_id },
todo_id,
)
.await?
.ok_or_else(|| {
Error::Request(RequestError::NotFound {
message: format!("todo with id {todo_id} not found"),
})
})?;
Ok(todo_item.build(todos::BuildInput {
trip_id,
state: components::trips::todos::UiState::Default,
}))
}
#[tracing::instrument]
pub async fn trip_todo_undone(
Extension(current_user): Extension<models::user::User>,
State(state): State<AppState>,
Path((trip_id, todo_id)): Path<(Uuid, Uuid)>,
headers: HeaderMap,
) -> Result<impl IntoResponse, Error> {
let ctx = Context::build(current_user);
components::trips::todos::Todo::update(
&ctx,
&state.database_pool,
todos::Filter { trip_id },
todo_id,
todos::UpdateElement::State(components::trips::todos::State::Todo),
)
.await?;
Ok(Redirect::to(get_referer(&headers)?))
}
#[derive(Deserialize, Debug)]
#[serde(deny_unknown_fields)]
pub struct TripTodoDescription {
#[serde(rename = "todo-description")]
description: String,
}
#[tracing::instrument]
pub async fn trip_todo_edit(
Extension(current_user): Extension<models::user::User>,
State(state): State<AppState>,
headers: HeaderMap,
Path((trip_id, todo_id)): Path<(Uuid, Uuid)>,
) -> Result<impl IntoResponse, Error> {
let ctx = Context::build(current_user);
let todo_item = components::trips::todos::Todo::find(
&ctx,
&state.database_pool,
todos::Filter { trip_id },
todo_id,
)
.await?;
match todo_item {
None => Err(Error::Request(RequestError::NotFound {
message: format!("todo with id {todo_id} not found"),
})),
Some(todo_item) => Ok(todo_item
.build(todos::BuildInput {
trip_id,
state: components::trips::todos::UiState::Edit,
})
.into_response()),
}
}
#[tracing::instrument]
pub async fn trip_todo_edit_save(
Extension(current_user): Extension<models::user::User>,
State(state): State<AppState>,
headers: HeaderMap,
Path((trip_id, todo_id)): Path<(Uuid, Uuid)>,
Form(form): Form<TripTodoDescription>,
) -> Result<impl IntoResponse, Error> {
let ctx = Context::build(current_user);
let todo_item = components::trips::todos::Todo::update(
&ctx,
&state.database_pool,
todos::Filter { trip_id },
todo_id,
todos::UpdateElement::Description(form.description),
)
.await?;
match todo_item {
None => Err(Error::Request(RequestError::NotFound {
message: format!("todo with id {todo_id} not found"),
})),
Some(todo_item) => {
if htmx::is_htmx(&headers) {
Ok(todo_item
.build(todos::BuildInput {
trip_id,
state: components::trips::todos::UiState::Default,
})
.into_response())
} else {
Ok(Redirect::to(&format!("/trips/{trip_id}/")).into_response())
}
}
}
}
#[tracing::instrument]
pub async fn trip_todo_edit_cancel(
Extension(current_user): Extension<models::user::User>,
State(state): State<AppState>,
headers: HeaderMap,
Path((trip_id, todo_id)): Path<(Uuid, Uuid)>,
) -> Result<impl IntoResponse, Error> {
let ctx = Context::build(current_user);
let todo_item = components::trips::todos::Todo::find(
&ctx,
&state.database_pool,
todos::Filter { trip_id },
todo_id,
)
.await?;
match todo_item {
None => Err(Error::Request(RequestError::NotFound {
message: format!("todo with id {todo_id} not found"),
})),
Some(todo_item) => Ok(todo_item
.build(todos::BuildInput {
trip_id,
state: components::trips::todos::UiState::Default,
})
.into_response()),
}
}