update deps
This commit is contained in:
1891
Cargo.lock
generated
1891
Cargo.lock
generated
File diff suppressed because it is too large
Load Diff
@ -14,7 +14,7 @@ thiserror = "1.0.24"
|
|||||||
notify = "4.0.16"
|
notify = "4.0.16"
|
||||||
log = "0.4.14"
|
log = "0.4.14"
|
||||||
pretty_env_logger = "0.4.0"
|
pretty_env_logger = "0.4.0"
|
||||||
uuid = { version = "0.8", features = ["serde", "v4"] }
|
uuid = { version = "1.8.0", features = ["serde", "v4"] }
|
||||||
chrono = { version = "0.4", features = ["serde"] }
|
chrono = { version = "0.4", features = ["serde"] }
|
||||||
structopt = "0.3.21"
|
structopt = "0.3.21"
|
||||||
syscalls = { version = "0.3", default-features = false }
|
syscalls = { version = "0.3", default-features = false }
|
||||||
|
|||||||
@ -9,5 +9,5 @@ edition = "2021"
|
|||||||
[dependencies]
|
[dependencies]
|
||||||
chrono = { version = "0.4", features = ["serde"] }
|
chrono = { version = "0.4", features = ["serde"] }
|
||||||
serde = { version = "1", features = ["derive"] }
|
serde = { version = "1", features = ["derive"] }
|
||||||
uuid = { version = "0.8", features = ["serde", "v4"] }
|
uuid = { version = "1.8.0", features = ["serde", "v4"] }
|
||||||
|
|
||||||
|
|||||||
@ -15,23 +15,23 @@ futures = "0.3"
|
|||||||
chrono = { version = "0.4", features = ["serde"] }
|
chrono = { version = "0.4", features = ["serde"] }
|
||||||
sled = "0.34"
|
sled = "0.34"
|
||||||
semver = "0.11"
|
semver = "0.11"
|
||||||
uuid = { version = "0.8", features = ["serde", "v4"] }
|
uuid = { version = "1.8.0", features = ["serde", "v4"] }
|
||||||
duplicate = "0.2"
|
duplicate = "0.2"
|
||||||
bincode = "1"
|
bincode = "1"
|
||||||
handlebars = "3"
|
handlebars = "4.1.0"
|
||||||
itertools = "0.10.0"
|
itertools = "0.10.0"
|
||||||
|
|
||||||
[dependencies.stl_lib]
|
[dependencies.stl_lib]
|
||||||
path = "../lib"
|
path = "../lib"
|
||||||
|
|
||||||
[dependencies.tokio]
|
[dependencies.tokio]
|
||||||
version = "1"
|
version = "1.37.0"
|
||||||
features = ["sync", "time"]
|
features = ["sync", "time"]
|
||||||
|
|
||||||
[dependencies.rocket]
|
[dependencies.rocket]
|
||||||
version = "0.5.0-rc.1"
|
version = "0.5.0"
|
||||||
features = ["secrets", "json", "uuid"]
|
features = ["secrets", "json", "uuid"]
|
||||||
|
|
||||||
[dependencies.rocket_dyn_templates]
|
[dependencies.rocket_dyn_templates]
|
||||||
version = "0.1.0-rc.1"
|
version = "0.1.0"
|
||||||
features = ["handlebars"]
|
features = ["handlebars"]
|
||||||
|
|||||||
@ -5,7 +5,7 @@ use rocket::{
|
|||||||
http::{Cookie, CookieJar, Status},
|
http::{Cookie, CookieJar, Status},
|
||||||
post,
|
post,
|
||||||
request::{FromRequest, Outcome, Request},
|
request::{FromRequest, Outcome, Request},
|
||||||
response::{content::Html, Redirect},
|
response::{content::RawHtml, Redirect},
|
||||||
uri, State,
|
uri, State,
|
||||||
};
|
};
|
||||||
use rocket_dyn_templates::Template;
|
use rocket_dyn_templates::Template;
|
||||||
@ -45,7 +45,7 @@ impl<'a> FromRequest<'a> for Authorized {
|
|||||||
request
|
request
|
||||||
.guard::<&State<MasterPassword>>()
|
.guard::<&State<MasterPassword>>()
|
||||||
.await
|
.await
|
||||||
.map_failure(|_| (Status::Unauthorized, Unauthorized))
|
.map_error(|_| (Status::Unauthorized, Unauthorized))
|
||||||
.and_then(|master_pass| {
|
.and_then(|master_pass| {
|
||||||
// Check if query string contains password
|
// Check if query string contains password
|
||||||
request
|
request
|
||||||
@ -65,14 +65,14 @@ impl<'a> FromRequest<'a> for Authorized {
|
|||||||
.filter(|(_, v)| v == &master_pass.0)
|
.filter(|(_, v)| v == &master_pass.0)
|
||||||
.map(|_| Outcome::Success(Authorized))
|
.map(|_| Outcome::Success(Authorized))
|
||||||
.next()
|
.next()
|
||||||
.unwrap_or(Outcome::Failure((Status::Unauthorized, Unauthorized)))
|
.unwrap_or(Outcome::Error((Status::Unauthorized, Unauthorized)))
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[catch(401)]
|
#[catch(401)]
|
||||||
pub fn login_page(_req: &Request) -> Html<Template> {
|
pub fn login_page(_req: &Request) -> RawHtml<Template> {
|
||||||
Html(Template::render("login", &()))
|
RawHtml(Template::render("login", &()))
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(FromForm)]
|
#[derive(FromForm)]
|
||||||
|
|||||||
@ -28,8 +28,8 @@ pub fn migrate(db: &mut Db) -> Result<(), MigrationError> {
|
|||||||
// Convert to new value
|
// Convert to new value
|
||||||
let v2_value = v2::trees::session::V {
|
let v2_value = v2::trees::session::V {
|
||||||
category,
|
category,
|
||||||
started: DateTime::<Utc>::from_utc(started, Utc).into(),
|
started: DateTime::<Utc>::from_naive_utc_and_offset(started, Utc).into(),
|
||||||
ended: DateTime::<Utc>::from_utc(ended, Utc).into(),
|
ended: DateTime::<Utc>::from_naive_utc_and_offset(ended, Utc).into(),
|
||||||
deleted: false,
|
deleted: false,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -63,7 +63,8 @@ pub fn migrate(db: &mut Db) -> Result<(), MigrationError> {
|
|||||||
name,
|
name,
|
||||||
description: None,
|
description: None,
|
||||||
color,
|
color,
|
||||||
started: started.map(|ndt| DateTime::<Utc>::from_utc(ndt, Utc).into()),
|
started: started
|
||||||
|
.map(|ndt| DateTime::<Utc>::from_naive_utc_and_offset(ndt, Utc).into()),
|
||||||
parent: None,
|
parent: None,
|
||||||
deleted: false,
|
deleted: false,
|
||||||
};
|
};
|
||||||
|
|||||||
@ -33,7 +33,9 @@ async fn main() -> io::Result<()> {
|
|||||||
|
|
||||||
let birth_date: BirthDate = env::var("BIRTH_DATE")
|
let birth_date: BirthDate = env::var("BIRTH_DATE")
|
||||||
.map(|s| BirthDate(s.parse().expect("failed to parse BIRTH_DATE")))
|
.map(|s| BirthDate(s.parse().expect("failed to parse BIRTH_DATE")))
|
||||||
.unwrap_or_else(|_| BirthDate(NaiveDate::from_ymd(2000, 1, 1)));
|
.unwrap_or_else(|_| {
|
||||||
|
BirthDate(NaiveDate::from_ymd_opt(2000, 1, 1).expect("Date is correct"))
|
||||||
|
});
|
||||||
|
|
||||||
let mut sled = sled::open(db_path)?;
|
let mut sled = sled::open(db_path)?;
|
||||||
match sled.insert(
|
match sled.insert(
|
||||||
|
|||||||
@ -9,7 +9,7 @@ use crate::status_json::StatusJson;
|
|||||||
use crate::util::EventNotifier;
|
use crate::util::EventNotifier;
|
||||||
use bincode::{deserialize, serialize};
|
use bincode::{deserialize, serialize};
|
||||||
use rocket::http::Status;
|
use rocket::http::Status;
|
||||||
use rocket::response::content::Html;
|
use rocket::response::content::RawHtml;
|
||||||
use rocket::response::Redirect;
|
use rocket::response::Redirect;
|
||||||
use rocket::serde::uuid::Uuid;
|
use rocket::serde::uuid::Uuid;
|
||||||
use rocket::{get, post, uri, State};
|
use rocket::{get, post, uri, State};
|
||||||
@ -19,7 +19,7 @@ use std::collections::{BTreeMap, HashMap};
|
|||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
|
|
||||||
#[get("/")]
|
#[get("/")]
|
||||||
pub fn index(_auth: Authorized, db: &State<sled::Db>) -> Result<Html<Template>, StatusJson> {
|
pub fn index(_auth: Authorized, db: &State<sled::Db>) -> Result<RawHtml<Template>, StatusJson> {
|
||||||
#[derive(Debug, Serialize, Deserialize, PartialOrd, Ord, PartialEq, Eq)]
|
#[derive(Debug, Serialize, Deserialize, PartialOrd, Ord, PartialEq, Eq)]
|
||||||
struct Node {
|
struct Node {
|
||||||
category: category::V,
|
category: category::V,
|
||||||
@ -92,7 +92,7 @@ pub fn index(_auth: Authorized, db: &State<sled::Db>) -> Result<Html<Template>,
|
|||||||
categories: top_level_nodes,
|
categories: top_level_nodes,
|
||||||
};
|
};
|
||||||
|
|
||||||
Ok(Html(Template::render("index", &context)))
|
Ok(RawHtml(Template::render("index", &context)))
|
||||||
}
|
}
|
||||||
|
|
||||||
#[post("/category/<category_uuid>/start_session")]
|
#[post("/category/<category_uuid>/start_session")]
|
||||||
@ -166,7 +166,7 @@ pub fn session_edit(
|
|||||||
_auth: Authorized,
|
_auth: Authorized,
|
||||||
session_uuid: Uuid,
|
session_uuid: Uuid,
|
||||||
db: &State<sled::Db>,
|
db: &State<sled::Db>,
|
||||||
) -> Result<Html<Template>, StatusJson> {
|
) -> Result<RawHtml<Template>, StatusJson> {
|
||||||
#[derive(Debug, Serialize, Deserialize)]
|
#[derive(Debug, Serialize, Deserialize)]
|
||||||
struct SessionPageContext {
|
struct SessionPageContext {
|
||||||
session: session::V,
|
session: session::V,
|
||||||
@ -184,13 +184,13 @@ pub fn session_edit(
|
|||||||
session_id: session_uuid,
|
session_id: session_uuid,
|
||||||
};
|
};
|
||||||
|
|
||||||
Ok(Html(Template::render("edit_session", &context)))
|
Ok(RawHtml(Template::render("edit_session", &context)))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[get("/history")]
|
#[get("/history")]
|
||||||
pub fn history(_auth: Authorized, db: &State<sled::Db>) -> Result<Html<Template>, StatusJson> {
|
pub fn history(_auth: Authorized, db: &State<sled::Db>) -> Result<RawHtml<Template>, StatusJson> {
|
||||||
#[derive(Debug, Serialize, Deserialize)]
|
#[derive(Debug, Serialize, Deserialize)]
|
||||||
struct HistoryEntryContext {
|
struct HistoryEntryContext {
|
||||||
category: category::V,
|
category: category::V,
|
||||||
@ -237,5 +237,5 @@ pub fn history(_auth: Authorized, db: &State<sled::Db>) -> Result<Html<Template>
|
|||||||
context.entries.sort_by_key(|entry| entry.session.started);
|
context.entries.sort_by_key(|entry| entry.session.started);
|
||||||
context.entries.reverse();
|
context.entries.reverse();
|
||||||
|
|
||||||
Ok(Html(Template::render("history", &context)))
|
Ok(RawHtml(Template::render("history", &context)))
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
use rocket::{get, response::content::Html, State};
|
use rocket::{get, response::content::RawHtml, State};
|
||||||
use rocket_dyn_templates::Template;
|
use rocket_dyn_templates::Template;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
@ -7,7 +7,7 @@ use crate::{
|
|||||||
};
|
};
|
||||||
|
|
||||||
#[get("/")]
|
#[get("/")]
|
||||||
pub fn dailies(_auth: Authorized, db: &State<sled::Db>) -> Result<Html<Template>, StatusJson> {
|
pub fn dailies(_auth: Authorized, db: &State<sled::Db>) -> Result<RawHtml<Template>, StatusJson> {
|
||||||
#[derive(Debug, Serialize, Deserialize)]
|
#[derive(Debug, Serialize, Deserialize)]
|
||||||
struct TemplateContext {
|
struct TemplateContext {
|
||||||
dailies: Vec<Daily>,
|
dailies: Vec<Daily>,
|
||||||
|
|||||||
@ -2,9 +2,9 @@ use crate::auth::Authorized;
|
|||||||
use crate::database::latest::trees::{category, session};
|
use crate::database::latest::trees::{category, session};
|
||||||
use crate::status_json::StatusJson;
|
use crate::status_json::StatusJson;
|
||||||
use crate::util::OrdL;
|
use crate::util::OrdL;
|
||||||
use chrono::{Date, DateTime, Datelike, Duration, Local, Timelike};
|
use chrono::{DateTime, Datelike, Duration, Local, NaiveDate, Timelike};
|
||||||
use itertools::Itertools;
|
use itertools::Itertools;
|
||||||
use rocket::{get, http::Status, response::content::Html, serde::uuid::Uuid, State};
|
use rocket::{get, http::Status, response::content::RawHtml, serde::uuid::Uuid, State};
|
||||||
use rocket_dyn_templates::Template;
|
use rocket_dyn_templates::Template;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use std::collections::{BTreeMap, HashMap, HashSet};
|
use std::collections::{BTreeMap, HashMap, HashSet};
|
||||||
@ -141,7 +141,7 @@ pub fn single_stats(
|
|||||||
_auth: Authorized,
|
_auth: Authorized,
|
||||||
category_id: Uuid,
|
category_id: Uuid,
|
||||||
db: &State<sled::Db>,
|
db: &State<sled::Db>,
|
||||||
) -> Result<Html<Template>, StatusJson> {
|
) -> Result<RawHtml<Template>, StatusJson> {
|
||||||
let categories_tree = db.open_tree(category::NAME)?;
|
let categories_tree = db.open_tree(category::NAME)?;
|
||||||
let sessions_tree = db.open_tree(session::NAME)?;
|
let sessions_tree = db.open_tree(session::NAME)?;
|
||||||
|
|
||||||
@ -153,11 +153,11 @@ pub fn single_stats(
|
|||||||
|
|
||||||
let now = Local::now();
|
let now = Local::now();
|
||||||
let ctx = category_stats_ctx(now, category_id, category, &sessions, &child_map);
|
let ctx = category_stats_ctx(now, category_id, category, &sessions, &child_map);
|
||||||
Ok(Html(Template::render("stats_single", dbg!(&ctx))))
|
Ok(RawHtml(Template::render("stats_single", dbg!(&ctx))))
|
||||||
}
|
}
|
||||||
|
|
||||||
#[get("/stats")]
|
#[get("/stats")]
|
||||||
pub fn all_stats(_auth: Authorized, db: &State<sled::Db>) -> Result<Html<Template>, StatusJson> {
|
pub fn all_stats(_auth: Authorized, db: &State<sled::Db>) -> Result<RawHtml<Template>, StatusJson> {
|
||||||
#[derive(Debug, Serialize, Deserialize)]
|
#[derive(Debug, Serialize, Deserialize)]
|
||||||
struct StatsContext {
|
struct StatsContext {
|
||||||
categories_stats: Vec<CategoryStatsCtx>,
|
categories_stats: Vec<CategoryStatsCtx>,
|
||||||
@ -185,15 +185,11 @@ pub fn all_stats(_auth: Authorized, db: &State<sled::Db>) -> Result<Html<Templat
|
|||||||
|
|
||||||
let context = StatsContext { categories_stats };
|
let context = StatsContext { categories_stats };
|
||||||
|
|
||||||
Ok(Html(Template::render("stats_all", &context)))
|
Ok(RawHtml(Template::render("stats_all", &context)))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Compute the duration of `day` that is covered by the span `start..end`
|
/// Compute the subset of `day` that is covered by the span `start..end`
|
||||||
fn span_duration_of_day(
|
fn span_duration_of_day(start: DateTime<Local>, end: DateTime<Local>, day: NaiveDate) -> Duration {
|
||||||
start: DateTime<Local>,
|
|
||||||
end: DateTime<Local>,
|
|
||||||
day: Date<Local>,
|
|
||||||
) -> Duration {
|
|
||||||
if end < start {
|
if end < start {
|
||||||
panic!("start must come before end");
|
panic!("start must come before end");
|
||||||
}
|
}
|
||||||
@ -201,26 +197,29 @@ fn span_duration_of_day(
|
|||||||
// if the span is 0
|
// if the span is 0
|
||||||
// or if the day is not in the span
|
// or if the day is not in the span
|
||||||
// the duration is zero
|
// the duration is zero
|
||||||
if end == start || start.date() > day || end.date() < day {
|
if end == start || start.date_naive() > day || end.date_naive() < day {
|
||||||
return Duration::zero();
|
return Duration::zero();
|
||||||
}
|
}
|
||||||
|
|
||||||
if start.date() < day {
|
// TODO: deal with unwrap
|
||||||
if end.date() > day {
|
let day_start = day.and_hms_opt(0, 0, 0).unwrap().and_local_timezone(Local).unwrap();
|
||||||
|
|
||||||
|
if start.date_naive() < day {
|
||||||
|
if end.date_naive() > day {
|
||||||
Duration::days(1)
|
Duration::days(1)
|
||||||
} else {
|
} else {
|
||||||
debug_assert_eq!(end.date(), day);
|
debug_assert_eq!(end.date_naive(), day);
|
||||||
|
|
||||||
end - day.and_hms(0, 0, 0)
|
end - day_start
|
||||||
}
|
}
|
||||||
} else if end.date() > day {
|
} else if end.date_naive() > day {
|
||||||
debug_assert_eq!(start.date(), day);
|
debug_assert_eq!(start.date_naive(), day);
|
||||||
|
|
||||||
day.and_hms(0, 0, 0) + Duration::days(1) - start
|
day_start + Duration::days(1) - start
|
||||||
} else {
|
} else {
|
||||||
debug_assert!(start < end);
|
debug_assert!(start < end);
|
||||||
debug_assert_eq!(start.date(), day);
|
debug_assert_eq!(start.date_naive(), day);
|
||||||
debug_assert_eq!(end.date(), day);
|
debug_assert_eq!(end.date_naive(), day);
|
||||||
|
|
||||||
end - start
|
end - start
|
||||||
}
|
}
|
||||||
@ -307,14 +306,14 @@ where
|
|||||||
{
|
{
|
||||||
const NUM_WEEKS: usize = 12;
|
const NUM_WEEKS: usize = 12;
|
||||||
|
|
||||||
let today = Local::today();
|
let today = Local::now().date_naive();
|
||||||
let last_day = today
|
let last_day = today
|
||||||
// take at least NUM_WEEKS * 7 days
|
// take at least NUM_WEEKS * 7 days
|
||||||
- Duration::weeks(NUM_WEEKS as i64)
|
- Duration::weeks(NUM_WEEKS as i64)
|
||||||
// round up to nearest monday
|
// round up to nearest monday
|
||||||
- Duration::days(today.weekday().num_days_from_monday() as i64);
|
- Duration::days(today.weekday().num_days_from_monday() as i64);
|
||||||
|
|
||||||
let mut days: BTreeMap<Date<Local>, Duration> = Default::default();
|
let mut days: BTreeMap<NaiveDate, Duration> = Default::default();
|
||||||
|
|
||||||
// calculate the time spent logging this category for every day of the last NUM_WEEKS
|
// calculate the time spent logging this category for every day of the last NUM_WEEKS
|
||||||
for session in sessions {
|
for session in sessions {
|
||||||
@ -350,8 +349,8 @@ where
|
|||||||
|
|
||||||
let month = day.month();
|
let month = day.month();
|
||||||
|
|
||||||
let month_border = |other_day: Date<_>| other_day.month() != month;
|
let month_border = |other_day: NaiveDate| other_day.month() != month;
|
||||||
let month_or_week_border = |other_day: Date<_>| {
|
let month_or_week_border = |other_day: NaiveDate| {
|
||||||
other_day.iso_week() != week || month_border(other_day)
|
other_day.iso_week() != week || month_border(other_day)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -2,7 +2,7 @@ use crate::auth::Authorized;
|
|||||||
use crate::status_json::StatusJson;
|
use crate::status_json::StatusJson;
|
||||||
use chrono::{Duration, Local, NaiveDate};
|
use chrono::{Duration, Local, NaiveDate};
|
||||||
use itertools::Itertools;
|
use itertools::Itertools;
|
||||||
use rocket::{get, response::content::Html, State};
|
use rocket::{get, response::content::RawHtml, State};
|
||||||
use rocket_dyn_templates::Template;
|
use rocket_dyn_templates::Template;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use std::borrow::Cow;
|
use std::borrow::Cow;
|
||||||
@ -14,7 +14,7 @@ pub struct BirthDate(pub NaiveDate);
|
|||||||
pub fn weeks(
|
pub fn weeks(
|
||||||
_auth: Authorized,
|
_auth: Authorized,
|
||||||
birth_date: &State<BirthDate>,
|
birth_date: &State<BirthDate>,
|
||||||
) -> Result<Html<Template>, StatusJson> {
|
) -> Result<RawHtml<Template>, StatusJson> {
|
||||||
type Color<'a> = Cow<'a, str>;
|
type Color<'a> = Cow<'a, str>;
|
||||||
|
|
||||||
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
|
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
|
||||||
@ -57,10 +57,10 @@ pub fn weeks(
|
|||||||
periods: Vec<PeriodCtx<'a>>,
|
periods: Vec<PeriodCtx<'a>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
let now = Local::now().date();
|
let now = Local::now().date_naive();
|
||||||
let birth_date = birth_date.0;
|
let birth_date = birth_date.0;
|
||||||
|
|
||||||
let lived: Duration = now.naive_local() - birth_date;
|
let lived: Duration = now - birth_date;
|
||||||
let one_year = Duration::days(365);
|
let one_year = Duration::days(365);
|
||||||
|
|
||||||
let life_expectancy = (one_year * 81).num_weeks();
|
let life_expectancy = (one_year * 81).num_weeks();
|
||||||
@ -108,5 +108,5 @@ pub fn weeks(
|
|||||||
.collect(),
|
.collect(),
|
||||||
};
|
};
|
||||||
|
|
||||||
Ok(Html(Template::render("weeks", &context)))
|
Ok(RawHtml(Template::render("weeks", &context)))
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user