matrix-bridge-teams 0.1.0

A bridge between Matrix and Microsoft Teams written in Rust
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(())
    }
}