use std::sync::Arc;
use axum::{Json, routing::get};
use utoipa::OpenApi;
use utoipa_axum::router::OpenApiRouter;
use crate::api::http::model::PgWapSessionManager;
mod v1;
#[derive(OpenApi)]
#[openapi(info(
title = "SNAP HTTP API",
version = "0.1.0",
description = "Anapaya SNAP HTTP API"
))]
struct SnapApi;
pub mod model {
use std::net::IpAddr;
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct Session {
pub ip: IpAddr,
pub ap_id: String,
pub data_plane_port: u16,
pub valid_until: chrono::DateTime<chrono::Utc>,
pub target_domains: Vec<String>,
}
pub trait PgWapSessionManager: Send + Sync {
fn new_session(
&self,
client_ip: IpAddr,
target_domains: &[&str],
) -> Result<Session, anyhow::Error>;
}
}
pub fn nest_http_api(
router: axum::Router,
pg_wap_session_manager: Arc<dyn PgWapSessionManager>,
) -> axum::Router {
let mut doc = SnapApi::openapi();
let (api_router, api_spec) = OpenApiRouter::new()
.nest(v1::PG_WAP_API_V1, v1::pg_wap_router(pg_wap_session_manager))
.split_for_parts();
doc.merge(api_spec);
router
.merge(api_router)
.route("/.well-known/openapi.json", get(|| async { Json(doc) }))
}