Changed the set_schedule function to first attempt updating existing records before inserting new ones. This improves efficiency by avoiding unnecessary insert conflicts and subsequent updates. The logic now: 1. Tries to update matching existing schedule first 2. Only performs insert if no matching record was found 3. Maintains same functionality but with better performance
69 lines
1.9 KiB
Rust
69 lines
1.9 KiB
Rust
use diesel::prelude::*;
|
|
use log::info;
|
|
use serde_json::{json, Value};
|
|
use uuid::Uuid;
|
|
|
|
use crate::shared::models::TriggerKind;
|
|
|
|
|
|
pub fn execute_set_schedule(
|
|
conn: &mut diesel::PgConnection,
|
|
cron: &str,
|
|
script_name: &str,
|
|
bot_uuid: Uuid,
|
|
) -> Result<Value, Box<dyn std::error::Error>> {
|
|
info!(
|
|
"Scheduling SET SCHEDULE cron: {}, script: {}, bot_id: {:?}",
|
|
cron, script_name, bot_uuid
|
|
);
|
|
|
|
// First check if bot exists
|
|
use crate::shared::models::bots::dsl::bots;
|
|
let bot_exists: bool = diesel::select(diesel::dsl::exists(
|
|
bots.filter(crate::shared::models::bots::dsl::id.eq(bot_uuid))
|
|
))
|
|
.get_result(conn)?;
|
|
|
|
if !bot_exists {
|
|
return Err(format!("Bot with id {} does not exist", bot_uuid).into());
|
|
}
|
|
|
|
use crate::shared::models::system_automations::dsl::*;
|
|
|
|
let new_automation = (
|
|
bot_id.eq(bot_uuid),
|
|
kind.eq(TriggerKind::Scheduled as i32),
|
|
schedule.eq(cron),
|
|
param.eq(script_name),
|
|
is_active.eq(true),
|
|
);
|
|
|
|
// First try to update existing record
|
|
let update_result = diesel::update(system_automations)
|
|
.filter(bot_id.eq(bot_uuid))
|
|
.filter(kind.eq(TriggerKind::Scheduled as i32))
|
|
.filter(param.eq(script_name))
|
|
.set((
|
|
schedule.eq(cron),
|
|
is_active.eq(true),
|
|
last_triggered.eq(None::<chrono::DateTime<chrono::Utc>>),
|
|
))
|
|
.execute(&mut *conn)?;
|
|
|
|
// If no rows were updated, insert new record
|
|
let result = if update_result == 0 {
|
|
diesel::insert_into(system_automations)
|
|
.values(&new_automation)
|
|
.execute(&mut *conn)?
|
|
} else {
|
|
update_result
|
|
};
|
|
|
|
Ok(json!({
|
|
"command": "set_schedule",
|
|
"schedule": cron,
|
|
"script": script_name,
|
|
"bot_id": bot_uuid.to_string(),
|
|
"rows_affected": result
|
|
}))
|
|
}
|