use std::sync::Arc;
use anyhow::Result;
use salvo::prelude::*;
use tracing::info;
use crate::bridge::BridgeCore;
use crate::config::Config;
use crate::db::DatabaseManager;
use crate::matrix::MatrixAppservice;
use super::{appservice, health, metrics};
pub struct WebServer {
config: Arc<Config>,
matrix_client: Arc<MatrixAppservice>,
db_manager: Arc<DatabaseManager>,
bridge: Arc<BridgeCore>,
}
impl WebServer {
pub async fn new(
config: Arc<Config>,
matrix_client: Arc<MatrixAppservice>,
db_manager: Arc<DatabaseManager>,
bridge: Arc<BridgeCore>,
) -> Result<Self> {
Ok(Self {
config,
matrix_client,
db_manager,
bridge,
})
}
pub async fn start(&self) -> Result<()> {
let router = Router::new()
.push(
Router::with_path("health")
.get(health::health_check)
)
.push(
Router::with_path("status")
.get(health::status)
)
.push(
Router::with_path("metrics")
.get(metrics::metrics)
)
.push(
Router::with_path("_matrix/app/v1")
.push(
Router::with_path("transactions/<txn_id>")
.put(appservice::push_transaction)
)
.push(
Router::with_path("users/<user_id>")
.get(appservice::query_user)
)
.push(
Router::with_path("rooms/<room_alias>")
.get(appservice::query_room_alias)
)
);
let addr = format!("{}:{}", self.config.bridge.bind_address, self.config.bridge.port);
info!("Starting web server on {}", addr);
let acceptor = TcpListener::new(addr.clone()).bind().await;
Server::new(acceptor).serve(router).await;
Ok(())
}
}