Skip to main content

max / makenotwork

1.8 KB · 62 lines History Blame Raw
1 //! platform-admin reads spanning every community, deliberately outside the C1 community scope
2
3 use super::{DateTime, PgPool, Utc, Uuid};
4
5 #[derive(sqlx::FromRow)]
6 pub struct AdminCommunityRow {
7 pub id: Uuid,
8 pub name: String,
9 pub slug: String,
10 pub suspended_at: Option<DateTime<Utc>>,
11 pub suspension_reason: Option<String>,
12 }
13
14 /// List all communities for the admin dashboard (capped at 500).
15 #[tracing::instrument(skip_all)]
16 pub async fn list_all_communities(
17 pool: &PgPool,
18 limit: i64,
19 ) -> Result<Vec<AdminCommunityRow>, sqlx::Error> {
20 sqlx::query_as!(
21 AdminCommunityRow,
22 r#"SELECT id, name, slug,
23 suspended_at AS "suspended_at: chrono::DateTime<chrono::Utc>",
24 suspension_reason
25 FROM communities ORDER BY name LIMIT $1"#,
26 limit,
27 )
28 .fetch_all(pool)
29 .await
30 }
31
32 #[derive(sqlx::FromRow)]
33 pub struct AdminUserRow {
34 pub id: Uuid,
35 pub username: String,
36 pub display_name: Option<String>,
37 pub suspended_at: Option<DateTime<Utc>>,
38 pub suspension_reason: Option<String>,
39 }
40
41 /// Search users by username prefix for the admin dashboard.
42 #[tracing::instrument(skip_all)]
43 pub async fn search_users(pool: &PgPool, query: &str) -> Result<Vec<AdminUserRow>, sqlx::Error> {
44 let escaped = query
45 .replace('\\', "\\\\")
46 .replace('%', "\\%")
47 .replace('_', "\\_");
48 sqlx::query_as!(
49 AdminUserRow,
50 r#"SELECT mnw_account_id AS id, username, display_name,
51 suspended_at AS "suspended_at: chrono::DateTime<chrono::Utc>",
52 suspension_reason
53 FROM users
54 WHERE username ILIKE $1 ESCAPE '\'
55 ORDER BY username
56 LIMIT 50"#,
57 format!("{escaped}%"),
58 )
59 .fetch_all(pool)
60 .await
61 }
62