this repo has no description
1use crate::auth::BearerAuthAdmin;
2use crate::state::AppState;
3use axum::{
4 Json,
5 extract::{Query, State},
6 http::StatusCode,
7 response::{IntoResponse, Response},
8};
9use serde::{Deserialize, Serialize};
10use serde_json::json;
11use tracing::error;
12
13#[derive(Deserialize)]
14pub struct GetAccountInfoParams {
15 pub did: String,
16}
17
18#[derive(Serialize)]
19#[serde(rename_all = "camelCase")]
20pub struct AccountInfo {
21 pub did: String,
22 pub handle: String,
23 pub email: Option<String>,
24 pub indexed_at: String,
25 pub invite_note: Option<String>,
26 pub invites_disabled: bool,
27 pub email_confirmed_at: Option<String>,
28 pub deactivated_at: Option<String>,
29}
30
31#[derive(Serialize)]
32#[serde(rename_all = "camelCase")]
33pub struct GetAccountInfosOutput {
34 pub infos: Vec<AccountInfo>,
35}
36
37pub async fn get_account_info(
38 State(state): State<AppState>,
39 _auth: BearerAuthAdmin,
40 Query(params): Query<GetAccountInfoParams>,
41) -> Response {
42 let did = params.did.trim();
43 if did.is_empty() {
44 return (
45 StatusCode::BAD_REQUEST,
46 Json(json!({"error": "InvalidRequest", "message": "did is required"})),
47 )
48 .into_response();
49 }
50 let result = sqlx::query!(
51 r#"
52 SELECT did, handle, email, created_at
53 FROM users
54 WHERE did = $1
55 "#,
56 did
57 )
58 .fetch_optional(&state.db)
59 .await;
60 match result {
61 Ok(Some(row)) => (
62 StatusCode::OK,
63 Json(AccountInfo {
64 did: row.did,
65 handle: row.handle,
66 email: row.email,
67 indexed_at: row.created_at.to_rfc3339(),
68 invite_note: None,
69 invites_disabled: false,
70 email_confirmed_at: None,
71 deactivated_at: None,
72 }),
73 )
74 .into_response(),
75 Ok(None) => (
76 StatusCode::NOT_FOUND,
77 Json(json!({"error": "AccountNotFound", "message": "Account not found"})),
78 )
79 .into_response(),
80 Err(e) => {
81 error!("DB error in get_account_info: {:?}", e);
82 (
83 StatusCode::INTERNAL_SERVER_ERROR,
84 Json(json!({"error": "InternalError"})),
85 )
86 .into_response()
87 }
88 }
89}
90
91#[derive(Deserialize)]
92pub struct GetAccountInfosParams {
93 pub dids: String,
94}
95
96pub async fn get_account_infos(
97 State(state): State<AppState>,
98 _auth: BearerAuthAdmin,
99 Query(params): Query<GetAccountInfosParams>,
100) -> Response {
101 let dids: Vec<&str> = params.dids.split(',').map(|s| s.trim()).collect();
102 if dids.is_empty() {
103 return (
104 StatusCode::BAD_REQUEST,
105 Json(json!({"error": "InvalidRequest", "message": "dids is required"})),
106 )
107 .into_response();
108 }
109 let mut infos = Vec::new();
110 for did in dids {
111 if did.is_empty() {
112 continue;
113 }
114 let result = sqlx::query!(
115 r#"
116 SELECT did, handle, email, created_at
117 FROM users
118 WHERE did = $1
119 "#,
120 did
121 )
122 .fetch_optional(&state.db)
123 .await;
124 if let Ok(Some(row)) = result {
125 infos.push(AccountInfo {
126 did: row.did,
127 handle: row.handle,
128 email: row.email,
129 indexed_at: row.created_at.to_rfc3339(),
130 invite_note: None,
131 invites_disabled: false,
132 email_confirmed_at: None,
133 deactivated_at: None,
134 });
135 }
136 }
137 (StatusCode::OK, Json(GetAccountInfosOutput { infos })).into_response()
138}