diff options
Diffstat (limited to 'src/db.rs')
-rw-r--r-- | src/db.rs | 62 |
1 files changed, 62 insertions, 0 deletions
@@ -6,6 +6,9 @@ use diesel::pg::PgConnection; use diesel::ExpressionMethods; use diesel::QueryDsl; use diesel::RunQueryDsl; +use std::time::Duration; +use chrono::DateTime; +use chrono::Utc; pub const COST: u32 = 10; @@ -98,3 +101,62 @@ pub fn get_strava_token( .get_result::<models::StravaToken>(conn)?; Ok(token) } + +pub fn insert_task( + conn: &PgConnection, + task: &models::NewTask) -> Result<i64, Error> { + use crate::schema::tasks; + let id = diesel::insert_into(tasks::table) + .values(task) + .returning(tasks::id) + .get_result(conn)?; + Ok(id) +} + +fn update_task_inner(conn: &PgConnection, task: &models::Task) + -> Result<models::Task, Error> { + use crate::schema::tasks; + + diesel::delete(tasks::table.filter(tasks::columns::id.eq(task.id))) + .execute(conn)?; + + let new_id = insert_task(conn, &models::NewTask { + start_at: task.start_at, + state: task.state, + username: &task.username, + payload: &task.payload, + })?; + + let new_task = tasks::table.find(new_id) + .get_result::<models::Task>(conn)?; + + Ok(new_task) +} + +fn update_task(conn: &PgConnection, task: &models::Task) -> Result<models::Task, Error> { + conn.transaction(|| { + update_task_inner(conn, task) + }) +} + +pub fn take_task( + conn: &PgConnection, + state: models::TaskState, + start_before: DateTime<Utc>, + eta: DateTime<Utc>) + -> Result<models::Task, Error> { + use crate::schema::tasks; + + conn.transaction(|| { + let mut task = tasks::table + .filter(tasks::state.eq(state)) + .filter(tasks::start_at.lt(start_before)) + .order(tasks::start_at.asc()) + .first::<models::Task>(conn)?; + + task.start_at = eta; + let task = update_task_inner(conn, &task)?; + + Ok(task) + }) +} |