Add filtering support in the backend
This commit is contained in:
parent
30d66d66f7
commit
c3d5dd363b
20
src/main.rs
20
src/main.rs
|
@ -5,6 +5,7 @@ mod tasks;
|
|||
mod users;
|
||||
|
||||
use axum::extract::Extension;
|
||||
use axum::extract::Query;
|
||||
use axum::http::StatusCode;
|
||||
use axum::response::Html;
|
||||
use axum::response::IntoResponse;
|
||||
|
@ -234,10 +235,16 @@ macro_rules! assert_or {
|
|||
};
|
||||
}
|
||||
|
||||
#[derive(Deserialize)]
|
||||
struct FilterParam {
|
||||
filter: Option<u8>,
|
||||
}
|
||||
|
||||
async fn homepage(
|
||||
session: ReadableSession,
|
||||
Extension(tera): Extension<Arc<Tera>>,
|
||||
Extension(pool): Extension<Arc<Pool<Postgres>>>,
|
||||
Query(FilterParam { filter }): Query<FilterParam>,
|
||||
) -> Result<Html<String>, Error> {
|
||||
let username = login_or_redirect!(session, "/login");
|
||||
|
||||
|
@ -248,13 +255,19 @@ async fn homepage(
|
|||
.await?;
|
||||
|
||||
info!("Getting tasks");
|
||||
let tasks: Vec<RawTask> =
|
||||
let mut tasks: Vec<RawTask> =
|
||||
sqlx::query_as("select id,title,description,status from tasks where owner=$1")
|
||||
.bind(id)
|
||||
.fetch_all(&*pool)
|
||||
.await?;
|
||||
|
||||
info!("Sorting tasks");
|
||||
info!("Sorting and filtering tasks");
|
||||
// TODO: refactor this when let_chains is finally stable
|
||||
if let Some(filter) = filter {
|
||||
if filter != 0 {
|
||||
tasks.retain(|rt| rt.status == (filter as i32) - 1);
|
||||
}
|
||||
}
|
||||
let mut tasks: Vec<Task> = tasks.into_iter().map(Task::from).collect();
|
||||
tasks.sort_unstable();
|
||||
tasks.reverse();
|
||||
|
@ -263,7 +276,8 @@ async fn homepage(
|
|||
let rendered = tera.render(
|
||||
"home.html",
|
||||
&ctx! {
|
||||
"tasks" => tasks
|
||||
"tasks" => tasks,
|
||||
"filter" => filter.unwrap_or(255) // placeholder that won't match anything
|
||||
},
|
||||
)?;
|
||||
|
||||
|
|
Loading…
Reference in a new issue