this repo has no description
1use crate::auth::{extract_bearer_token_from_header, validate_bearer_token}; 2use crate::state::AppState; 3use axum::{ 4 Json, 5 extract::State, 6 http::{HeaderMap, StatusCode}, 7 response::{IntoResponse, Response}, 8}; 9use serde_json::json; 10 11pub async fn get_state(State(state): State<AppState>, headers: HeaderMap) -> Response { 12 let created_at = get_account_created_at(&state, &headers).await; 13 let now = chrono::Utc::now().to_rfc3339(); 14 15 ( 16 StatusCode::OK, 17 Json(json!({ 18 "state": { 19 "status": "assured", 20 "access": "full", 21 "lastInitiatedAt": now 22 }, 23 "metadata": { 24 "accountCreatedAt": created_at 25 } 26 })), 27 ) 28 .into_response() 29} 30 31pub async fn get_age_assurance_state() -> Response { 32 (StatusCode::OK, Json(json!({"status": "assured"}))).into_response() 33} 34 35async fn get_account_created_at(state: &AppState, headers: &HeaderMap) -> Option<String> { 36 let auth_header = headers.get("Authorization").and_then(|h| h.to_str().ok()); 37 tracing::debug!(?auth_header, "age assurance: extracting token"); 38 39 let token = extract_bearer_token_from_header(auth_header)?; 40 tracing::debug!("age assurance: got token, validating"); 41 42 let auth_user = match validate_bearer_token(&state.db, &token).await { 43 Ok(user) => { 44 tracing::debug!(did = %user.did, "age assurance: validated user"); 45 user 46 } 47 Err(e) => { 48 tracing::warn!(?e, "age assurance: token validation failed"); 49 return None; 50 } 51 }; 52 53 let row = match sqlx::query!("SELECT created_at FROM users WHERE did = $1", auth_user.did) 54 .fetch_optional(&state.db) 55 .await 56 { 57 Ok(r) => { 58 tracing::debug!(?r, "age assurance: query result"); 59 r 60 } 61 Err(e) => { 62 tracing::warn!(?e, "age assurance: query failed"); 63 return None; 64 } 65 }; 66 67 row.map(|r| r.created_at.to_rfc3339()) 68}