webhook-gateway 2.17.2

A service to ingress github event
Documentation
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"}))
}