use salvo::prelude::*;
use serde::Deserialize;
#[handler]
pub async fn push_transaction(
req: &mut Request,
_depot: &mut Depot,
res: &mut Response,
) {
let txn_id: String = req.param("txn_id").unwrap_or_default();
#[derive(Deserialize)]
struct TransactionBody {
events: Vec<serde_json::Value>,
}
match req.parse_json::<TransactionBody>().await {
Ok(body) => {
tracing::info!(
"Received transaction {} with {} events",
txn_id,
body.events.len()
);
for event in body.events {
if let Err(e) = handle_event(event).await {
tracing::error!("Failed to handle event: {}", e);
}
}
res.render(Json(&serde_json::json!({})));
}
Err(e) => {
tracing::error!("Failed to parse transaction body: {}", e);
res.status_code(StatusCode::BAD_REQUEST);
res.render(Json(&serde_json::json!({
"error": "Invalid transaction body"
})));
}
}
}
#[handler]
pub async fn query_user(
req: &mut Request,
_depot: &mut Depot,
res: &mut Response,
) {
let user_id: String = req.param("user_id").unwrap_or_default();
tracing::info!("Query user: {}", user_id);
res.render(Json(&serde_json::json!({})));
}
#[handler]
pub async fn query_room_alias(
req: &mut Request,
_depot: &mut Depot,
res: &mut Response,
) {
let room_alias: String = req.param("room_alias").unwrap_or_default();
tracing::info!("Query room alias: {}", room_alias);
res.render(Json(&serde_json::json!({})));
}
async fn handle_event(event: serde_json::Value) -> anyhow::Result<()> {
let event_type = event
.get("type")
.and_then(|v| v.as_str())
.unwrap_or("");
tracing::debug!("Handling event type: {}", event_type);
match event_type {
"m.room.message" => {
handle_message_event(event).await?;
}
"m.room.member" => {
handle_member_event(event).await?;
}
_ => {
tracing::debug!("Ignoring event type: {}", event_type);
}
}
Ok(())
}
async fn handle_message_event(event: serde_json::Value) -> anyhow::Result<()> {
tracing::debug!("Handling message event: {:?}", event);
Ok(())
}
async fn handle_member_event(event: serde_json::Value) -> anyhow::Result<()> {
tracing::debug!("Handling member event: {:?}", event);
Ok(())
}