diff options
| author | Santo Cariotti <santo@dcariotti.me> | 2022-09-26 15:42:08 +0000 |
|---|---|---|
| committer | Santo Cariotti <santo@dcariotti.me> | 2022-09-26 15:42:08 +0000 |
| commit | ac985c0a5e269ec82329868bbdfc3d15afb6b055 (patch) | |
| tree | ae069fb8c65e2b14f5d359b69fb4e79a6c89a3d6 /src/routes/warning.rs | |
| parent | dfbee1cebc8c6ca6b09c55f9c576c15a4f7b9979 (diff) | |
Filter warnings by model_id
Diffstat (limited to 'src/routes/warning.rs')
| -rw-r--r-- | src/routes/warning.rs | 65 |
1 files changed, 55 insertions, 10 deletions
diff --git a/src/routes/warning.rs b/src/routes/warning.rs index 1870843..3a8573e 100644 --- a/src/routes/warning.rs +++ b/src/routes/warning.rs @@ -4,23 +4,22 @@ use crate::{ auth::Claims, model::Model, user::User, - warning::{Warning, WarningCreate}, + warning::{Warning, WarningCreate, WarningFilter, WarningFilterPayload}, }, pagination::{Pagination, WarningPagination}, routes::JsonCreate, }; -use axum::{extract::Query, routing::get, Json, Router}; -use serde::Serialize; +use axum::{ + extract::Query, + routing::{get, post}, + Json, Router, +}; /// Create routes for `/v1/warnings/` namespace pub fn create_route() -> Router { - Router::new().route("/", get(list_warnings).post(create_warning)) -} - -#[derive(Serialize)] -struct WarningPagination { - count: i64, - results: Vec<Warning>, + Router::new() + .route("/", get(list_warnings).post(create_warning)) + .route("/filter", post(filter_warnings)) } /// List warnings. A staffer can see everything. @@ -62,3 +61,49 @@ async fn create_warning( Ok(JsonCreate(warning_new)) } + +/// Apply a filter to warnings list +async fn filter_warnings( + Json(payload): Json<WarningFilterPayload>, + pagination: Query<Pagination>, + claims: Claims, +) -> Result<Json<WarningPagination>, AppError> { + let page = pagination.0.page.unwrap_or_default(); + + let user = User::find_by_id(claims.user_id).await?; + + let (results, count) = match user.is_staff.unwrap() { + true => ( + Warning::filter( + page, + WarningFilter { + model_id: payload.model_id, + user_id: None, + }, + ) + .await?, + Warning::count_by_model_id(WarningFilter { + model_id: payload.model_id, + user_id: None, + }) + .await?, + ), + false => ( + Warning::filter( + page, + WarningFilter { + model_id: payload.model_id, + user_id: Some(user.id), + }, + ) + .await?, + Warning::count_by_model_id(WarningFilter { + model_id: payload.model_id, + user_id: Some(user.id), + }) + .await?, + ), + }; + + Ok(Json(WarningPagination { count, results })) +} |
