diff options
| author | Santo Cariotti <santo@dcariotti.me> | 2022-09-20 14:43:18 +0000 |
|---|---|---|
| committer | Santo Cariotti <santo@dcariotti.me> | 2022-09-20 14:43:18 +0000 |
| commit | e010223224b28df4b53e763b2a4f2a4fb37cc339 (patch) | |
| tree | 1c216db47ab74f4e024ed63bb097263a9bb2a773 /src/routes | |
| parent | f7c2f950a5077a44036da9d0757e2d26fec93b3f (diff) | |
Create warning app
Diffstat (limited to 'src/routes')
| -rw-r--r-- | src/routes/mod.rs | 1 | ||||
| -rw-r--r-- | src/routes/warning.rs | 64 |
2 files changed, 65 insertions, 0 deletions
diff --git a/src/routes/mod.rs b/src/routes/mod.rs index c69f18e..a0e8031 100644 --- a/src/routes/mod.rs +++ b/src/routes/mod.rs @@ -1,6 +1,7 @@ pub mod auth; pub mod model; pub mod user; +pub mod warning; use crate::errors::AppError; use axum::{ diff --git a/src/routes/warning.rs b/src/routes/warning.rs new file mode 100644 index 0000000..87ca514 --- /dev/null +++ b/src/routes/warning.rs @@ -0,0 +1,64 @@ +use crate::{ + errors::AppError, + models::{ + auth::Claims, + model::Model, + user::User, + warning::{Warning, WarningCreate}, + }, + pagination::Pagination, + routes::JsonCreate, +}; +use axum::{extract::Query, routing::get, Json, Router}; +use serde::Serialize; + +/// 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>, +} + +/// List warnings. A staffer can see everything. +async fn list_warnings( + 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::list(page, None).await?, + Warning::count(None).await?, + ), + false => ( + Warning::list(page, Some(user.id)).await?, + Warning::count(Some(user.id)).await?, + ), + }; + + Ok(Json(WarningPagination { count, results })) +} + +/// Create a warning. Checks Authorization token +async fn create_warning( + Json(payload): Json<WarningCreate>, + claims: Claims, +) -> Result<JsonCreate<Warning>, AppError> { + let model = match Model::find_by_id(payload.model_id).await { + Ok(model) => model, + Err(_) => return Err(AppError::NotFound("Model not found".to_string())), + }; + + let warning = Warning::new(claims.user_id, model.id, payload.note); + + let warning_new = Warning::create(warning).await?; + + Ok(JsonCreate(warning_new)) +} |
