瀏覽代碼

Add event handlers

Mauricio Cassola 2 年之前
父節點
當前提交
0719cf66ff
共有 4 個文件被更改,包括 39 次插入12 次删除
  1. 14 9
      src/db.rs
  2. 3 3
      src/db/events.rs
  3. 1 0
      src/handlers.rs
  4. 21 0
      src/handlers/events.rs

+ 14 - 9
src/db.rs

@@ -5,6 +5,7 @@ use std::sync::{Arc, Mutex};
 use tokio::sync::{OwnedSemaphorePermit, Semaphore};
 use tokio_postgres::Client as DbClient;
 use crate::db::events::*;
+use crate::handlers::events::handle_event;
 
 pub mod events;
 pub mod issue_data;
@@ -182,21 +183,25 @@ pub async fn run_migrations(client: &DbClient) -> anyhow::Result<()> {
 }
 
 pub async fn run_scheduled_events(db: &DbClient) -> anyhow::Result<()> {
-    // table lock ????
-    
-    let events = get_events_to_execute(&db).await;
+    let events = get_events_to_execute(&db).await.unwrap();
     println!("events to execute: {:#?}", events);
+    tracing::trace!("events to execute: {:#?}", events);
 
-    for event in events.unwrap().iter() {
-        update_event_executed_at(&db, &event.event_id).await;
-        match call_event_handler_based_on_event_name {
-            Ok(r) => {
+    for event in events.iter() {
+        update_event_executed_at(&db, &event.event_id).await?;
+
+        match handle_event(&event.event_name, &event.event_metadata).await {
+            Ok(_) => {
+                println!("event succesfully executed (id={})", event.event_id);
                 tracing::trace!("event succesfully executed (id={})", event.event_id);
-                delete_event(&db, &event.event_id).await;
+
+                delete_event(&db, &event.event_id).await?;
             },
             Err(e) => {
+                println!("event failed on execution (id={:?}, error={:?})", event.event_id, e);
                 tracing::trace!("event failed on execution (id={:?}, error={:?})", event.event_id, e);
-                update_event_failed_message(&db, &event.event_id, &e).await;
+
+                update_event_failed_message(&db, &event.event_id, &e.to_string()).await?;
             },
         }
     }

+ 3 - 3
src/db/events.rs

@@ -10,7 +10,7 @@ pub struct Event {
     pub event_id: Uuid,
     pub event_name: String,
     pub expected_event_time: DateTime<FixedOffset>,
-    // pub event_metadata: String,
+    pub event_metadata: serde_json::Value,
     pub executed_at: DateTime<FixedOffset>,
     pub failed: Option<String>,
 }
@@ -85,7 +85,7 @@ pub async fn get_events_to_execute(db: &DbClient) -> Result<Vec<Event>>  {
         let event_id: Uuid = event.get(0);
         let event_name: String = event.get(1);
         let expected_event_time: DateTime<FixedOffset> = event.get(2);
-        // let event_metadata: String = event.get(3);
+        let event_metadata: serde_json::Value = event.get(3);
         let executed_at: DateTime<FixedOffset> = event.get(4);
         let failed: Option<String> = event.get(5);
 
@@ -93,7 +93,7 @@ pub async fn get_events_to_execute(db: &DbClient) -> Result<Vec<Event>>  {
             event_id,
             event_name,
             expected_event_time,
-            // event_metadata,
+            event_metadata,
             executed_at,
             failed
         });

+ 1 - 0
src/handlers.rs

@@ -43,6 +43,7 @@ mod review_submitted;
 mod rfc_helper;
 mod rustc_commits;
 mod shortcut;
+pub mod events;
 
 pub async fn handle(ctx: &Context, event: &Event) -> Vec<HandlerError> {
     let config = config::get(&ctx.github, event.repo()).await;

+ 21 - 0
src/handlers/events.rs

@@ -0,0 +1,21 @@
+// Function to match the scheduled event function with its corresponding handler.
+// In case you want to add a new one, just add a new clause to the match with 
+// the event name and the corresponding function.
+
+// The metadata is a serde_json::Value, please visit: https://docs.rs/serde_json/latest/serde_json/value/enum.Value.html
+// to refer on how to get values from there.
+// Example of accessing an integer id in the metadata:
+//    event_metadata["id"].as_i64().unwrap();
+
+pub async fn handle_event(event_name: &String, event_metadata: &serde_json::Value) -> anyhow::Result<()> {
+    match event_name {
+      _ => default(&event_name, &event_metadata)
+    }
+}
+
+fn default(event_name: &String, event_metadata: &serde_json::Value) -> anyhow::Result<()> {
+  println!("handle_event fall in default cause: (name={:?}, metadata={:?})", event_name, event_metadata);
+  tracing::trace!("handle_event fall in default cause: (name={:?}, metadata={:?})", event_name, event_metadata);
+
+  Ok(())
+}