diff options
Diffstat (limited to 'src/models.rs')
-rw-r--r-- | src/models.rs | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/src/models.rs b/src/models.rs index ce3dd19..0b7e5db 100644 --- a/src/models.rs +++ b/src/models.rs @@ -1,9 +1,68 @@ +use crate::schema::tasks; use crate::schema::config; use crate::schema::strava_tokens; use crate::schema::users; use chrono::DateTime; use chrono::Utc; use std::fmt; +use serde_json::Value; +use diesel::pg::Pg; +use diesel::deserialize; +use diesel::deserialize::FromSql; +use diesel::serialize; +use diesel::serialize::Output; +use diesel::serialize::ToSql; +use diesel::sql_types; +use std::io::Write; + +#[derive(PartialEq, Debug, Clone, Copy, AsExpression, FromSqlRow)] +#[sql_type = "sql_types::Text"] +pub enum TaskState { + NEW = 0, + SUCCESSFUL, + FAILED, +} + +impl ToSql<sql_types::Text, Pg> for TaskState { + fn to_sql<W: Write>(&self, out: &mut Output<W, Pg>) -> serialize::Result { + let t = match *self { + TaskState::NEW => "new".to_string(), + TaskState::SUCCESSFUL => "success".to_string(), + TaskState::FAILED => "failed".to_string(), + }; + <String as ToSql<sql_types::Text, Pg>>::to_sql(&t, out) + } +} + +impl FromSql<sql_types::Text, Pg> for TaskState { + fn from_sql(bytes: Option<&[u8]>) -> deserialize::Result<Self> { + let s = <String as FromSql<sql_types::Text, Pg>>::from_sql(bytes)?; + match s.as_str() { + "new" => Ok(TaskState::NEW), + "success" => Ok(TaskState::SUCCESSFUL), + "failed" => Ok(TaskState::FAILED), + &_ => Err("Unrecognized task state".into()), + } + } +} + +#[derive(Insertable)] +#[table_name = "tasks"] +pub struct NewTask<'a> { + pub start_at: DateTime<Utc>, + pub state: TaskState, + pub username: &'a str, + pub payload: &'a Value, +} + +#[derive(Queryable, Debug, Clone)] +pub struct Task { + pub id: i64, + pub state: TaskState, + pub start_at: DateTime<Utc>, + pub username: String, + pub payload: Value, +} #[derive(Insertable, Queryable)] #[table_name = "config"] |