~ knotless Search/
↑↓ move↵ open⇧↵ all results

johnandersen777.bsky.social/zkwid

0
0
main
35 lines · 1.1 KB Raw History
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<AppState> {
    Router::new().route("/.well-known/did.json", get(did_json))
}

pub fn document(state: &AppState) -> anyhow::Result<Value> {
    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<AppState>) -> Result<Json<Value>, XrpcError> {
    Ok(Json(document(&state)?))
}