use crate::AppState; use crate::error::XrpcError; use atproto_identity::key::{did_method_key_value, to_public}; use axum::extract::State; use axum::routing::get; use axum::{Json, Router}; use serde_json::{Value, json}; pub fn routes() -> Router { Router::new().route("/.well-known/did.json", get(did_json)) } pub fn document(state: &AppState) -> anyhow::Result { let config = &state.config; let public = to_public(&config.signing_key)?.to_string(); Ok(json!({ "@context": ["https://www.w3.org/ns/did/v1", "https://w3id.org/security/multikey/v1"], "id": config.did, "verificationMethod": [{ "id": format!("{}#atproto", config.did), "type": "Multikey", "controller": config.did, "publicKeyMultibase": did_method_key_value(&public), }], "service": [{ "id": "#zkwid", "type": "ZkwidService", "serviceEndpoint": config.base_url, }], })) } async fn did_json(State(state): State) -> Result, XrpcError> { Ok(Json(document(&state)?)) }