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!(
54 "SELECT created_at FROM users WHERE did = $1",
55 &auth_user.did
56 )
57 .fetch_optional(&state.db)
58 .await
59 {
60 Ok(r) => {
61 tracing::debug!(?r, "age assurance: query result");
62 r
63 }
64 Err(e) => {
65 tracing::warn!(?e, "age assurance: query failed");
66 return None;
67 }
68 };
69
70 row.map(|r| r.created_at.to_rfc3339())
71}