amélioration de la webapp
This commit is contained in:
@@ -68,8 +68,11 @@
|
||||
//! # }
|
||||
//! ```
|
||||
|
||||
pub mod server;
|
||||
pub mod logs;
|
||||
pub mod server;
|
||||
|
||||
pub use server::{Server, ServerBuilder, ServerInfo, ApiRegistry, ApiRegistryEntry};
|
||||
pub use logs::{LogState, SseLayer, log_sse, log_dump, init_logging, LoggingOptions, log_setup_get, log_setup_post, create_logs_router, LogsApiDoc};
|
||||
pub use logs::{
|
||||
LogState, LoggingOptions, LogsApiDoc, SseLayer, create_logs_router, init_logging, log_dump,
|
||||
log_setup_get, log_setup_post, log_sse,
|
||||
};
|
||||
pub use server::{ApiRegistry, ApiRegistryEntry, Server, ServerBuilder, ServerInfo};
|
||||
|
||||
@@ -13,22 +13,22 @@ use std::{
|
||||
use axum::{
|
||||
Json,
|
||||
extract::{Query, State},
|
||||
http::StatusCode,
|
||||
response::{
|
||||
IntoResponse,
|
||||
sse::{Event, KeepAlive, Sse},
|
||||
},
|
||||
http::StatusCode,
|
||||
};
|
||||
use serde::{Deserialize, Serialize};
|
||||
use tokio::sync::broadcast;
|
||||
use tracing::Level;
|
||||
use tracing_subscriber::{
|
||||
Registry,
|
||||
layer::{SubscriberExt, Filter},
|
||||
reload,
|
||||
filter::LevelFilter,
|
||||
layer::{Filter, SubscriberExt},
|
||||
reload,
|
||||
util::SubscriberInitExt,
|
||||
};
|
||||
use tracing::Level;
|
||||
use utoipa::OpenApi;
|
||||
|
||||
/// Représente une entrée de log
|
||||
@@ -69,7 +69,10 @@ impl LogState {
|
||||
if let Err(e) = self.reload_handle.write().unwrap().reload(level_filter) {
|
||||
eprintln!("❌ Failed to reload log level filter: {}", e);
|
||||
} else {
|
||||
eprintln!("✅ Log level filter reloaded successfully to: {:?}", level_filter);
|
||||
eprintln!(
|
||||
"✅ Log level filter reloaded successfully to: {:?}",
|
||||
level_filter
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -174,7 +177,10 @@ fn is_level_allowed(log_level: &str, max_level: Level) -> bool {
|
||||
Level::ERROR => matches!(entry_level, Level::ERROR),
|
||||
Level::WARN => matches!(entry_level, Level::ERROR | Level::WARN),
|
||||
Level::INFO => matches!(entry_level, Level::ERROR | Level::WARN | Level::INFO),
|
||||
Level::DEBUG => matches!(entry_level, Level::ERROR | Level::WARN | Level::INFO | Level::DEBUG),
|
||||
Level::DEBUG => matches!(
|
||||
entry_level,
|
||||
Level::ERROR | Level::WARN | Level::INFO | Level::DEBUG
|
||||
),
|
||||
Level::TRACE => true, // Tous les niveaux
|
||||
}
|
||||
}
|
||||
@@ -262,15 +268,15 @@ pub fn init_logging() -> LogState {
|
||||
Ok(l) => match string_to_level(&l) {
|
||||
Some(lev) => level_to_levelfilter(lev),
|
||||
None => LevelFilter::TRACE,
|
||||
}
|
||||
Err(_) => LevelFilter::TRACE
|
||||
},
|
||||
Err(_) => LevelFilter::TRACE,
|
||||
};
|
||||
|
||||
let (filter, reload_handle) = reload::Layer::new(log_level);
|
||||
|
||||
let buffer_capacity = match config.get_log_cache_size() {
|
||||
Ok(c) => c,
|
||||
Err(_) => 500
|
||||
Err(_) => 500,
|
||||
};
|
||||
|
||||
// Créer le LogState avec le handle de rechargement
|
||||
@@ -410,12 +416,12 @@ fn level_to_string(level: Level) -> String {
|
||||
|
||||
fn level_to_levelfilter(level: Level) -> LevelFilter {
|
||||
match level {
|
||||
Level::ERROR => LevelFilter::ERROR,
|
||||
Level::WARN => LevelFilter::WARN,
|
||||
Level::INFO => LevelFilter::INFO,
|
||||
Level::DEBUG => LevelFilter::DEBUG,
|
||||
Level::TRACE => LevelFilter::TRACE,
|
||||
}
|
||||
Level::ERROR => LevelFilter::ERROR,
|
||||
Level::WARN => LevelFilter::WARN,
|
||||
Level::INFO => LevelFilter::INFO,
|
||||
Level::DEBUG => LevelFilter::DEBUG,
|
||||
Level::TRACE => LevelFilter::TRACE,
|
||||
}
|
||||
}
|
||||
|
||||
/// Crée le router pour l'API de gestion des logs
|
||||
@@ -440,4 +446,4 @@ pub fn create_logs_router(log_state: LogState) -> axum::Router {
|
||||
(name = "logs", description = "Log level configuration endpoints")
|
||||
)
|
||||
)]
|
||||
pub struct LogsApiDoc;
|
||||
pub struct LogsApiDoc;
|
||||
|
||||
@@ -28,8 +28,8 @@ use std::net::SocketAddr;
|
||||
use std::sync::Arc;
|
||||
use tokio::{signal, sync::RwLock, task::JoinHandle};
|
||||
use tracing::info;
|
||||
use utoipa_swagger_ui::SwaggerUi;
|
||||
use utoipa::OpenApi;
|
||||
use utoipa_swagger_ui::SwaggerUi;
|
||||
|
||||
/// Info serveur sérialisable
|
||||
#[derive(Clone, Serialize, utoipa::ToSchema)]
|
||||
@@ -435,7 +435,8 @@ impl Server {
|
||||
let swagger_path_static: &'static str = Box::leak(swagger_path.clone().into_boxed_str());
|
||||
|
||||
let openapi_json_path = format!("/api-docs/{}.json", name);
|
||||
let openapi_json_path_static: &'static str = Box::leak(openapi_json_path.clone().into_boxed_str());
|
||||
let openapi_json_path_static: &'static str =
|
||||
Box::leak(openapi_json_path.clone().into_boxed_str());
|
||||
|
||||
// Compter le nombre d'endpoints dans l'OpenAPI spec
|
||||
let endpoint_count = openapi.paths.paths.len();
|
||||
@@ -538,11 +539,35 @@ impl Server {
|
||||
}
|
||||
}
|
||||
|
||||
/// Retourne l'URL de base complète du serveur (schéma + hôte + port).
|
||||
///
|
||||
/// La valeur configurable peut omettre le schéma ou le port ; cette méthode
|
||||
/// s'assure donc que les clients reçoivent toujours une URL exploitable comme
|
||||
/// `http://192.168.0.10:8080`.
|
||||
pub fn base_url(&self) -> String {
|
||||
let mut base = self.base_url.trim_end_matches('/').to_string();
|
||||
|
||||
if !base.contains("://") {
|
||||
base = format!("http://{}", base);
|
||||
}
|
||||
|
||||
let has_port = base
|
||||
.rsplit_once(':')
|
||||
.and_then(|(_, port)| port.parse::<u16>().ok())
|
||||
.is_some();
|
||||
|
||||
if has_port {
|
||||
base
|
||||
} else {
|
||||
format!("{}:{}", base, self.http_port)
|
||||
}
|
||||
}
|
||||
|
||||
/// Récupère les infos du serveur
|
||||
pub fn info(&self) -> ServerInfo {
|
||||
ServerInfo {
|
||||
name: self.name.clone(),
|
||||
base_url: self.base_url.clone(),
|
||||
base_url: self.base_url(),
|
||||
http_port: self.http_port,
|
||||
}
|
||||
}
|
||||
@@ -583,8 +608,9 @@ impl Server {
|
||||
self.add_openapi(
|
||||
crate::logs::create_logs_router(log_state.clone()),
|
||||
crate::logs::LogsApiDoc::openapi(),
|
||||
"logs"
|
||||
).await;
|
||||
"logs",
|
||||
)
|
||||
.await;
|
||||
|
||||
self.log_state = Some(log_state);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user