chore: normalize code

This commit is contained in:
Maulana Sodiqin
2025-05-17 02:08:59 +07:00
parent 874f25aa80
commit a43ef8ec04
104 changed files with 691 additions and 655 deletions
+31 -45
View File
@@ -1,8 +1,8 @@
use super::bind_filter_value;
use super::{ListQueryBuilder, bind_filter_value};
use crate::{CountResult, MetaRequestDto, MetaResponseDto, ResponseListSuccessDto};
use anyhow::{bail, Result};
use serde::{de::DeserializeOwned, Serialize};
use surrealdb::{engine::remote::ws::Client, Surreal};
use anyhow::Result;
use serde::{Serialize, de::DeserializeOwned};
use surrealdb::{Surreal, engine::remote::ws::Client};
pub async fn query_list_with_meta<T>(
db: &Surreal<Client>,
@@ -10,75 +10,61 @@ pub async fn query_list_with_meta<T>(
meta: &MetaRequestDto,
conditions: Vec<String>,
custom_select: Option<String>,
search_field: &str,
select_fields: Option<Vec<&str>>,
) -> Result<ResponseListSuccessDto<Vec<T>>>
where
T: DeserializeOwned + Serialize,
{
let page = meta.page.unwrap_or(1);
let per_page = meta.per_page.unwrap_or(10);
if page < 1 || per_page < 1 {
bail!("Invalid pagination: page and per_page must be greater than 0");
}
let page = meta.page.unwrap_or(1).max(1);
let per_page = meta.per_page.unwrap_or(10).max(1);
let start = (page - 1) * per_page;
let sql = custom_select.unwrap_or_else(|| {
let mut s = format!("SELECT * FROM {}", table);
if !conditions.is_empty() {
s.push_str(" WHERE ");
s.push_str(&conditions.join(" AND "));
}
if let Some(sort_by) = &meta.sort_by {
let order = match meta
.order
.clone()
.unwrap_or_default()
.to_uppercase()
.as_str()
{
"DESC" => "DESC",
_ => "ASC",
};
s.push_str(&format!(" ORDER BY {} {}", sort_by, order));
}
s.push_str(" LIMIT $per_page START $start");
s
ListQueryBuilder::from_meta(table, meta, search_field, select_fields).build()
});
let mut query_exec = db.query(sql);
if let Some(search) = &meta.search {
if !search.is_empty() {
query_exec = query_exec.bind(("search", search.clone()));
}
}
if let Some(filter_val) = meta.filter.clone() {
query_exec = bind_filter_value(query_exec, filter_val);
if let Some(filter_val) = &meta.filter {
query_exec = bind_filter_value(query_exec, filter_val.clone());
}
query_exec = query_exec
.bind(("per_page", per_page))
.bind(("start", start));
let raw: Vec<T> = query_exec.await?.take(0)?;
let mut count_sql = format!("SELECT count() FROM {}", table);
if !conditions.is_empty() {
count_sql.push_str(" WHERE ");
count_sql.push_str(&conditions.join(" AND "));
}
let mut count_query = db.query(count_sql);
let mut count_query = db.query(format!(
"SELECT count() FROM {} {}",
table,
if conditions.is_empty() {
String::new()
} else {
format!("WHERE {}", conditions.join(" AND "))
}
));
if let Some(search) = &meta.search {
if !search.is_empty() {
count_query = count_query.bind(("search", search.clone()));
}
}
if let Some(filter_val) = meta.filter.clone() {
count_query = bind_filter_value(count_query, filter_val);
if let Some(filter_val) = &meta.filter {
count_query = bind_filter_value(count_query, filter_val.clone());
}
let count_result: Vec<CountResult> = count_query.await?.take(0)?;
let total = count_result.first().map(|c| c.count);
let meta = MetaResponseDto {
page: Some(page),
per_page: Some(per_page),
total,
};
Ok(ResponseListSuccessDto {
data: raw,
meta: Some(meta),
meta: Some(MetaResponseDto {
page: Some(page),
per_page: Some(per_page),
total,
}),
})
}