summaryrefslogtreecommitdiffstats
path: root/src/routes
diff options
context:
space:
mode:
Diffstat (limited to 'src/routes')
-rw-r--r--src/routes/mod.rs1
-rw-r--r--src/routes/warning.rs64
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))
+}