use axum::{ extract::Query, routing::{get, post}, Form, Json, Router, }; use serde::{Deserialize, Serialize}; use tracing::{event, instrument, Level}; use crate::secrets::Password; #[instrument] pub async fn run() -> color_eyre::Result<()> { let app = Router::new() .route("/tls-check/success", get(|| async { "OK" })) .route("/api-login", post(api_login)); let listener = tokio::net::TcpListener::bind("[::]:8080").await?; axum::serve(listener, app).await?; Ok(()) } #[derive(Debug, Clone, PartialEq, Eq, Serialize)] struct ApiError { error: String, message: String, } type ApiResult = Result>; #[derive(Debug, Clone, PartialEq, Eq, Deserialize)] struct ApiVersion { api_version: String, } #[derive(Debug, Clone, Deserialize)] struct LoginRequest { username: String, password: Password, } #[derive(Debug, Clone, Serialize)] struct LoginResponse { username: String, token: String, } #[instrument] async fn api_login( Query(ApiVersion { api_version }): Query, Form(LoginRequest { username, password }): Form, ) -> ApiResult> { event!(Level::WARN, "Creating dummy token"); Ok(Json(LoginResponse { username, token: "invalid".to_string(), })) }