Add admin user export count queries

This commit is contained in:
RWDai
2026-05-20 16:51:46 +08:00
parent ed75ae6d56
commit 831554f11d
5 changed files with 202 additions and 47 deletions
@@ -1015,6 +1015,57 @@ WHERE user_group_members.user_id IN (
collect_query_rows(query.fetch(&self.pool), map_user_export_row).await
}
pub async fn count_export_users(
&self,
query: &UserExportListQuery,
) -> Result<u64, DataLayerError> {
let mut builder =
QueryBuilder::<Postgres>::new("SELECT COUNT(*)::BIGINT AS total FROM users");
builder.push(" WHERE is_deleted IS FALSE");
if let Some(role) = query.role.as_deref() {
builder
.push(" AND LOWER(role::text) = ")
.push_bind(role.trim().to_ascii_lowercase());
}
if let Some(is_active) = query.is_active {
builder.push(" AND is_active = ").push_bind(is_active);
}
if let Some(group_id) = query
.group_id
.as_deref()
.map(str::trim)
.filter(|value| !value.is_empty())
{
builder.push(" AND id IN (SELECT user_id FROM user_group_members WHERE group_id = ");
builder.push_bind(group_id);
builder.push(")");
}
if let Some(search) = query
.search
.as_deref()
.map(str::trim)
.filter(|value| !value.is_empty())
{
let pattern = format!("%{}%", search.to_ascii_lowercase());
builder
.push(" AND (LOWER(id) LIKE ")
.push_bind(pattern.clone())
.push(" OR LOWER(username) LIKE ")
.push_bind(pattern.clone())
.push(" OR LOWER(COALESCE(email, '')) LIKE ")
.push_bind(pattern)
.push(")");
}
let row = builder
.build()
.fetch_one(&self.pool)
.await
.map_postgres_err()?;
Ok(row.try_get::<i64, _>("total").map_postgres_err()?.max(0) as u64)
}
pub async fn summarize_export_users(&self) -> Result<UserExportSummary, DataLayerError> {
let row = sqlx::query(SUMMARIZE_EXPORT_USERS_SQL)
.fetch_one(&self.pool)
@@ -2306,6 +2357,10 @@ impl UserReadRepository for SqlxUserReadRepository {
self.list_export_users_page(query).await
}
async fn count_export_users(&self, query: &UserExportListQuery) -> Result<u64, DataLayerError> {
self.count_export_users(query).await
}
async fn summarize_export_users(&self) -> Result<UserExportSummary, DataLayerError> {
self.summarize_export_users().await
}