use crate::constants;
use crate::github;
use crate::channel;
use anyhow::Result;
use poem::{
handler, listener::TcpListener, middleware::Tracing, post, web::Json, EndpointExt, Route,
Server,
};
use serde_json;
use tracing::{error};
#[tokio::main]
pub async fn event_loop() -> Result<(), std::io::Error> {
if std::env::var_os("RUST_LOG").is_none() {
std::env::set_var("RUST_LOG", "poem=debug");
}
let router = Route::new();
let app = router
.at("/healthz", health_check)
.at("/webhook_gateway_webhook", post(process_github_event_ep))
.with(Tracing);
Server::new(TcpListener::bind("0.0.0.0:31430"))
.run(app)
.await
}
#[handler(method = "get")]
async fn health_check() {}
#[handler]
fn process_github_event_ep(req: String) -> Json<serde_json::Value> {
if !constants::contain_keywords(&req) {
return Json(serde_json::json! ({
"code": 0,
"message": "Not OC comment.",
}));
}
let event = match github::event::GithubEvent::new(&req) {
Ok(event) => event,
Err(e) => {
error!("Cannot process github message, error: {:?}\n. payload is:\n{}", e, req);
return Json(serde_json::json! ({
"code": 0,
"message": "Cannot process github message"}));
}
};
if let Err(e) = channel::producer::produce_message_from(&event) {
error!("Cannot process github message, error: {:?}", e);
tokio::spawn(async move {
let _ = github::post_issue_comment(
event.get_repo_name(),
event.get_pr_number(),
&format!("{}", e),
)
.await;
});
}
Json(serde_json::json! ({
"code": 0,
"message": "Finish processing github event"}))
}