diff options
Diffstat (limited to 'atuin-server/src/handlers')
| -rw-r--r-- | atuin-server/src/handlers/history.rs | 48 |
1 files changed, 47 insertions, 1 deletions
diff --git a/atuin-server/src/handlers/history.rs b/atuin-server/src/handlers/history.rs index 546e5a29..fde7cf2d 100644 --- a/atuin-server/src/handlers/history.rs +++ b/atuin-server/src/handlers/history.rs @@ -1,11 +1,14 @@ use axum::extract::Query; -use axum::{Extension, Json}; +use axum::{extract::Path, Extension, Json}; use http::StatusCode; +use std::collections::HashMap; use crate::database::{Database, Postgres}; use crate::models::{NewHistory, User}; use atuin_common::api::*; +use crate::calendar::{TimePeriod, TimePeriodInfo}; + pub async fn count( user: User, db: Extension<Postgres>, @@ -79,3 +82,46 @@ pub async fn add( Ok(()) } + +pub async fn calendar( + Path(focus): Path<String>, + Query(params): Query<HashMap<String, u64>>, + user: User, + db: Extension<Postgres>, +) -> Result<Json<HashMap<u64, TimePeriodInfo>>, ErrorResponseStatus<'static>> { + let focus = focus.as_str(); + + let year = params.get("year").unwrap_or(&0); + let month = params.get("month").unwrap_or(&1); + + let focus = match focus { + "year" => db + .calendar(&user, TimePeriod::YEAR, *year, *month) + .await + .map_err(|_| { + ErrorResponse::reply("failed to query calendar") + .with_status(StatusCode::INTERNAL_SERVER_ERROR) + }), + + "month" => db + .calendar(&user, TimePeriod::MONTH, *year, *month) + .await + .map_err(|_| { + ErrorResponse::reply("failed to query calendar") + .with_status(StatusCode::INTERNAL_SERVER_ERROR) + }), + + "day" => db + .calendar(&user, TimePeriod::DAY, *year, *month) + .await + .map_err(|_| { + ErrorResponse::reply("failed to query calendar") + .with_status(StatusCode::INTERNAL_SERVER_ERROR) + }), + + _ => Err(ErrorResponse::reply("invalid focus: use year/month/day") + .with_status(StatusCode::BAD_REQUEST)), + }?; + + Ok(Json(focus)) +} |
