aimo-cli 0.1.0

AiMo Network router node Rust implementation
use axum::{
    Router, middleware,
    routing::{any, get, post},
};
use tower::ServiceBuilder;
use tower_http::trace::TraceLayer;

use crate::{
    config::ServerOptions,
    server::{
        api::{
            chat::completions,
            keys::{generate_key, metadata_bytes, verify_key},
            subscribe,
        },
        context::ServiceContext,
        middleware::{auth_layer, cors_layer, timeout_layer},
    },
};

use super::state::ApiState;

pub fn api_v1(options: &ServerOptions, ctx: ServiceContext) -> Router {
    Router::new()
        .route("/ping", get(|| async { "pong" }))
        .route("/keys/metadata_bytes", get(metadata_bytes))
        .route("/keys/generate", post(generate_key))
        .route("/keys/verify", post(verify_key))
        .route(
            "/chat/completions",
            post(completions).layer(middleware::from_fn(auth_layer)),
        )
        .route(
            "/providers/subscribe",
            any(subscribe::handler).layer(middleware::from_fn(auth_layer)),
        )
        .with_state(ApiState::new(ctx))
        .layer(
            ServiceBuilder::new()
                .layer(TraceLayer::new_for_http())
                .layer(cors_layer(&options))
                .layer(timeout_layer(&options)),
        )
}