summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/models/warning.rs78
-rw-r--r--src/routes/warning.rs4
2 files changed, 63 insertions, 19 deletions
diff --git a/src/models/warning.rs b/src/models/warning.rs
index 5f92752..c001fc0 100644
--- a/src/models/warning.rs
+++ b/src/models/warning.rs
@@ -64,12 +64,15 @@ pub struct WarningEdit {
/// Payload used for warning filtering
#[derive(Deserialize)]
pub struct WarningFilterPayload {
- pub model_id: i32,
+ pub model_id: Option<i32>,
+ pub resolved_by: Option<i32>,
}
/// Struct used as argument for filtering by the backend
+#[derive(Debug)]
pub struct WarningFilter {
- pub model_id: i32,
+ pub model_id: Option<i32>,
+ pub resolved_by: Option<i32>,
pub user_id: Option<i32>,
}
@@ -201,11 +204,12 @@ impl Warning {
Ok(rec)
}
- /// Filter warnings. Pass a `WarningFilter` argument
+ /// Filter warnings. Pass a `WarningFilter` argument. You can filter only by model_id or (not
+ /// both) resolved by
pub async fn filter(page: i64, args: WarningFilter) -> Result<Vec<WarningUser>, AppError> {
let pool = unsafe { get_client() };
- let query = r#"
+ let mut query = r#"
SELECT
warnings.*,
json_build_object('id', users.id, 'name', users.name, 'email', users.email, 'username', users.username, 'is_staff', users.is_staff, 'avatar', users.avatar) as user,
@@ -216,26 +220,62 @@ impl Warning {
SELECT id, json_build_object('id', r.id, 'name', r.name, 'email', r.email, 'username', r.username, 'is_staff', r.is_staff, 'avatar', r.avatar) as data
FROM users r
) r ON r.id = warnings.resolved_by
- WHERE model_id = $1
- "#;
+ "#.to_string();
+
+ if args.model_id.is_some() {
+ query += r#"WHERE model_id = $1"#;
+ } else {
+ match args.resolved_by {
+ Some(_) => {
+ query += r#" WHERE warnings.resolved_by = $1"#;
+ }
+ None => {
+ query += r#" WHERE warnings.resolved_by = NULL"#;
+ }
+ };
+ }
let rows: Vec<WarningUser> = match args.user_id {
Some(id) => {
- sqlx::query_as(&format!(
- r#"{} AND user_id = $2 ORDER BY id DESC LIMIT $3 OFFSET $4"#,
- query
- ))
- .bind(args.model_id)
- .bind(id)
- .bind(CONFIG.page_limit)
- .bind(CONFIG.page_limit * page)
- .fetch_all(pool)
- .await?
+ let q = if args.model_id.is_some() {
+ query = format!(
+ r#"{} AND user_id = $2 ORDER BY id DESC LIMIT $3 OFFSET $4"#,
+ query
+ );
+ sqlx::query_as(&query).bind(args.model_id.unwrap())
+ } else if args.resolved_by.is_some() {
+ query = format!(
+ r#"{} AND user_id = $2 ORDER BY id DESC LIMIT $3 OFFSET $4"#,
+ query
+ );
+ sqlx::query_as(&query).bind(args.resolved_by.unwrap())
+ } else {
+ query = format!(
+ r#"{} AND user_id = $1 ORDER BY id DESC LIMIT $2 OFFSET $3"#,
+ query
+ );
+ sqlx::query_as(&query)
+ };
+
+ q.bind(id)
+ .bind(CONFIG.page_limit)
+ .bind(CONFIG.page_limit * page)
+ .fetch_all(pool)
+ .await?
}
None => {
- sqlx::query_as(&format!(r#"{} ORDER BY id DESC LIMIT $2 OFFSET $3"#, query))
- .bind(args.model_id)
- .bind(CONFIG.page_limit)
+ let q = if args.model_id.is_some() {
+ query = format!(r#"{} ORDER BY id DESC LIMIT $2 OFFSET $3"#, query);
+ sqlx::query_as(&query).bind(args.model_id.unwrap())
+ } else if args.resolved_by.is_some() {
+ query = format!(r#"{} ORDER BY id DESC LIMIT $2 OFFSET $3"#, query);
+ sqlx::query_as(&query).bind(args.resolved_by.unwrap())
+ } else {
+ query = format!(r#"{} ORDER BY id DESC LIMIT $1 OFFSET $2"#, query);
+ sqlx::query_as(&query)
+ };
+
+ q.bind(CONFIG.page_limit)
.bind(CONFIG.page_limit * page)
.fetch_all(pool)
.await?
diff --git a/src/routes/warning.rs b/src/routes/warning.rs
index bb1306e..42b750b 100644
--- a/src/routes/warning.rs
+++ b/src/routes/warning.rs
@@ -103,12 +103,14 @@ async fn filter_warnings(
page,
WarningFilter {
model_id: payload.model_id,
+ resolved_by: payload.resolved_by,
user_id: None,
},
)
.await?,
Warning::count_by_model_id(WarningFilter {
model_id: payload.model_id,
+ resolved_by: payload.resolved_by,
user_id: None,
})
.await?,
@@ -118,12 +120,14 @@ async fn filter_warnings(
page,
WarningFilter {
model_id: payload.model_id,
+ resolved_by: payload.resolved_by,
user_id: Some(user.id),
},
)
.await?,
Warning::count_by_model_id(WarningFilter {
model_id: payload.model_id,
+ resolved_by: payload.resolved_by,
user_id: Some(user.id),
})
.await?,