use super::{DateTime, PgPool, Utc, Uuid}; #[derive(sqlx::FromRow)] pub struct AdminCommunityRow { pub id: Uuid, pub name: String, pub slug: String, pub suspended_at: Option>, pub suspension_reason: Option, } /// List all communities for the admin dashboard (capped at 500). #[tracing::instrument(skip_all)] pub async fn list_all_communities( pool: &PgPool, limit: i64, ) -> Result, sqlx::Error> { sqlx::query_as!( AdminCommunityRow, r#"SELECT id, name, slug, suspended_at AS "suspended_at: chrono::DateTime", suspension_reason FROM communities ORDER BY name LIMIT $1"#, limit, ) .fetch_all(pool) .await } #[derive(sqlx::FromRow)] pub struct AdminUserRow { pub id: Uuid, pub username: String, pub display_name: Option, pub suspended_at: Option>, pub suspension_reason: Option, } /// Search users by username prefix for the admin dashboard. #[tracing::instrument(skip_all)] pub async fn search_users(pool: &PgPool, query: &str) -> Result, sqlx::Error> { let escaped = query .replace('\\', "\\\\") .replace('%', "\\%") .replace('_', "\\_"); sqlx::query_as!( AdminUserRow, r#"SELECT mnw_account_id AS id, username, display_name, suspended_at AS "suspended_at: chrono::DateTime", suspension_reason FROM users WHERE username ILIKE $1 ESCAPE '\' ORDER BY username LIMIT 50"#, format!("{escaped}%"), ) .fetch_all(pool) .await }