mod models;
mod oauth;
mod graph_api;
mod message;
mod user;
mod channel;
use std::sync::Arc;
use tokio::sync::RwLock;
use anyhow::Result;
use tracing::info;
use crate::bridge::BridgeCore;
use crate::config::Config;
pub use models::{TeamsAttachment, TeamsChannel, TeamsChat, TeamsMessage, TeamsTeam, TeamsUser};
use oauth::OAuth2Client;
pub struct TeamsClient {
config: Arc<Config>,
oauth_client: OAuth2Client,
bridge: Arc<RwLock<Option<Arc<BridgeCore>>>>,
}
impl TeamsClient {
pub async fn new(config: Arc<Config>) -> Result<Self> {
let oauth_client = OAuth2Client::new(&config.auth)?;
Ok(Self {
config,
oauth_client,
bridge: Arc::new(RwLock::new(None)),
})
}
pub async fn set_bridge(&self, bridge: Arc<BridgeCore>) {
let mut b = self.bridge.write().await;
*b = Some(bridge);
}
pub async fn stop(&self) -> Result<()> {
Ok(())
}
pub async fn authenticate(&self, code: &str) -> Result<()> {
self.oauth_client.exchange_code_for_token(code).await?;
info!("Teams authentication successful");
Ok(())
}
pub fn get_auth_url(&self, state: &str) -> Result<String> {
self.oauth_client.get_authorization_url(state)
}
}