diff --git a/src/dao/alarm.rs b/src/dao/alarm.rs index a5987c3..2e30978 100644 --- a/src/dao/alarm.rs +++ b/src/dao/alarm.rs @@ -1,4 +1,4 @@ -use chrono::{DateTime, Local}; +use chrono::{DateTime, Local, Utc}; use sea_orm::{ ActiveModelTrait, ActiveValue::Set, ColumnTrait, ConnectionTrait, DbErr, EntityTrait, QueryFilter }; @@ -8,7 +8,7 @@ use crate::model::{self, alarm}; pub async fn create_alarm( db: &C, title: &str, - time: DateTime, + time: DateTime, ) -> Result { let alarm_to_create = model::alarm::ActiveModel { title: Set(title.to_string()), diff --git a/src/resources/alarm/get.rs b/src/resources/alarm/get.rs index 6e332bd..3df5946 100644 --- a/src/resources/alarm/get.rs +++ b/src/resources/alarm/get.rs @@ -1,13 +1,15 @@ -use axum::{Json, debug_handler, extract::Query, http::StatusCode, response::IntoResponse}; -use chrono::{DateTime, Local}; +use axum::{Json, debug_handler, extract::{Query, State}, http::StatusCode, response::IntoResponse}; +use chrono::{DateTime, Local, Utc}; use serde::{Deserialize, Serialize}; use utoipa::{IntoParams, IntoResponses, ToSchema}; +use crate::{AppState, types::Alarm}; + #[derive(ToSchema, Serialize)] pub struct OkResponse { name: String, enabled: bool, - time: DateTime, + time: DateTime, } #[derive(IntoResponses)] @@ -34,16 +36,26 @@ pub struct RequestQuery { enabled: Option } -#[utoipa::path(get, path = "", responses(Responses), params(RequestQuery))] -#[debug_handler] -pub async fn get_handler(Query(RequestQuery { enabled }): Query) -> Responses { - match enabled { - Some(enabled) => { - let alarms = crate::db::alarm::get_alarms(enabled).await; - todo!() - }, - None => { - todo!() +impl From for OkResponse { + fn from(value: Alarm) -> Self { + Self { + name: value.time.to_string(), + enabled: value.enabled, + time: value.time, + } + } +} + +#[utoipa::path(get, path = "", responses(Responses), params(RequestQuery))] +#[debug_handler] +pub async fn get_handler(State(AppState{ scheduler }): State, Query(RequestQuery { enabled }): Query) -> Responses { + let result = scheduler.get_alarms(enabled).await; + match result { + Ok(alarms) => { + Responses::Ok(alarms.into_iter().map(|alarm| alarm.into()).collect()) + }, + Err(error) => { + Responses::DBError(error.to_string()) } } } diff --git a/src/resources/alarm/post.rs b/src/resources/alarm/post.rs index 4385b5b..d1eb6e9 100644 --- a/src/resources/alarm/post.rs +++ b/src/resources/alarm/post.rs @@ -3,7 +3,7 @@ use axum::{Json}; use axum::http::StatusCode; use axum::debug_handler; use axum::response::IntoResponse; -use chrono::{DateTime, Local}; +use chrono::{DateTime, Utc}; use serde::{Deserialize, Serialize}; use utoipa::{IntoResponses, ToSchema}; @@ -12,12 +12,12 @@ use crate::types::Alarm; #[derive(Debug, Deserialize, ToSchema)] pub struct RequestBody { - time: DateTime, + time: DateTime, } #[derive(ToSchema, Serialize)] pub struct OkResponseBody { - time: DateTime, + time: DateTime, enabled: bool, } diff --git a/src/scheduler.rs b/src/scheduler.rs index 13b93ab..1d1ae66 100644 --- a/src/scheduler.rs +++ b/src/scheduler.rs @@ -1,6 +1,6 @@ use std::sync::{Arc, Mutex}; -use chrono::{DateTime, Local, Timelike}; +use chrono::{DateTime, Local, Timelike, Utc}; use cron_tab::Cron; use sea_orm::{DatabaseConnection, DbErr}; @@ -48,7 +48,7 @@ impl Scheduler { Ok(()) } - pub async fn add_alarm(&self, time: DateTime) -> Result { + pub async fn add_alarm(&self, time: DateTime) -> Result { let cron_schedule = format!("{} {} {} * * *", "*", time.minute(), time.hour()); let alarm = Alarm::new(true, time); @@ -63,7 +63,12 @@ impl Scheduler { } pub async fn get_alarms(&self, enabled: Option) -> Result, DbErr> { - get_alarms(&*self.db, enabled).await.map(|a| a.into()) + get_alarms(&*self.db, enabled).await + .map(|alarms| alarms + .into_iter() + .map(|a| a.into()) + .collect() + ) } pub fn start(&self) { diff --git a/src/types.rs b/src/types.rs index fa445b3..1dd34cb 100644 --- a/src/types.rs +++ b/src/types.rs @@ -1,4 +1,4 @@ -use chrono::{DateTime, Local}; +use chrono::{DateTime, Utc}; use serde::{Deserialize, Serialize}; use crate::model; @@ -6,11 +6,11 @@ use crate::model; #[derive(Debug, Serialize, Deserialize, Clone)] pub struct Alarm { pub enabled: bool, - pub time: DateTime, + pub time: DateTime, } impl Alarm { - pub fn new(enabled: bool, time: DateTime) -> Self { + pub fn new(enabled: bool, time: DateTime) -> Self { Self { enabled, time } } } @@ -19,7 +19,7 @@ impl From for Alarm { fn from(value: model::alarm::Model) -> Self { Self { enabled: value.enabled, - time: DateTime::fromna, + time: DateTime::from_utc(value.time, Utc), } } }