summaryrefslogtreecommitdiff
path: root/src/models.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/models.rs')
-rw-r--r--src/models.rs59
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"]