Files
oott/backend/src/web_server.rs
T

69 lines
2.1 KiB
Rust
Raw Normal View History

2026-02-26 08:31:48 -05:00
use std::error::Error;
use axum::Router;
2026-02-26 12:19:58 -05:00
use axum::extract::Request;
use axum::http::StatusCode;
use axum::middleware::Next;
use axum::response::Response;
use axum::routing::{delete, get, put};
2026-02-26 08:31:48 -05:00
use log::{debug, info};
use tower_http::services::ServeDir;
2026-02-26 08:31:48 -05:00
pub mod devices;
pub mod notifications;
pub mod utils;
2026-02-25 15:58:32 -05:00
2026-02-26 12:19:58 -05:00
const API_KEY: &str = "very_secret_key";
pub async fn serve() -> Result<(), Box<dyn Error>> {
info!("Starting web server");
let static_files = ServeDir::new("./web");
let router = Router::new()
.route("/api/devices", get(devices::list))
.route("/api/devices", put(devices::register))
.route("/api/devices/{mac_address}", delete(devices::unregister))
.route("/api/devices/{mac_address}", get(devices::read))
.route("/api/notifications", get(notifications::list))
.route("/api/notifications/{id}", get(notifications::read))
.route(
"/api/notifications/{id}/read_without_flagging",
get(notifications::read_without_flagging),
)
2026-02-26 12:19:58 -05:00
.route_layer(axum::middleware::from_fn(auth))
.route(
"/",
get(|| async { "Go to /web for the UI or to /api for the better UI." }),
)
.nest_service("/web", static_files);
info!("Web server starting at http://0.0.0.0:3000");
// Start the server
let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await?;
debug!("Web server bound to IP and port");
axum::serve(listener, router).await?;
Ok(())
}
2026-02-26 12:19:58 -05:00
async fn auth(request: Request, next: Next) -> Result<Response, StatusCode> {
let auth_header = request
.headers()
.get(axum::http::header::AUTHORIZATION)
.and_then(|header| header.to_str().ok());
let auth_header = match auth_header {
Some(value) => value,
None => return Err(StatusCode::UNAUTHORIZED),
};
let mut valid_header = "Bearer ".to_string();
valid_header.push_str(API_KEY);
if auth_header == valid_header {
Ok(next.run(request).await)
} else {
Err(StatusCode::UNAUTHORIZED)
}
}