signal-cli-api 0.1.1

Native REST + WebSocket API bridge for signal-cli
use axum::extract::{Path, State};
use axum::response::Response;
use axum::routing::{get, put};
use axum::{Json, Router};
use serde::Deserialize;
use serde_json::json;

use crate::state::AppState;
use super::helpers::rpc_ok;

pub fn routes() -> Router<AppState> {
    Router::new()
        .route("/v1/identities/{number}", get(list_identities))
        .route("/v1/identities/{number}/trust/{number_to_trust}", put(trust_identity))
}

async fn list_identities(
    State(st): State<AppState>,
    Path(number): Path<String>,
) -> Response {
    rpc_ok(&st, "listIdentities", json!({ "account": number })).await
}

#[derive(Deserialize)]
struct TrustBody {
    #[serde(default)]
    trust_all_known_keys: Option<bool>,
    verified_safety_number: Option<String>,
}

async fn trust_identity(
    State(st): State<AppState>,
    Path((number, number_to_trust)): Path<(String, String)>,
    Json(body): Json<TrustBody>,
) -> Response {
    let mut params = json!({
        "account": number,
        "recipient": [number_to_trust],
    });
    if let Some(true) = body.trust_all_known_keys {
        params["trust-all-known-keys"] = json!(true);
    }
    if let Some(safety_number) = &body.verified_safety_number {
        params["verified-safety-number"] = json!(safety_number);
    }
    rpc_ok(&st, "trust", params).await
}