From 4380074a75f865f12fbc429660c041dc2add238d Mon Sep 17 00:00:00 2001 From: Chewing_Bever Date: Wed, 17 May 2023 23:21:15 +0200 Subject: [PATCH 1/8] chore: please linter --- build.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.rs b/build.rs index 508b53c..3a8149e 100644 --- a/build.rs +++ b/build.rs @@ -1,3 +1,3 @@ fn main() { - println!("cargo:rerun-if-changed=migrations"); + println!("cargo:rerun-if-changed=migrations"); } From c8ef995bc053276190e731c5ffe9b41c2261b6ef Mon Sep 17 00:00:00 2001 From: Chewing_Bever Date: Sat, 20 May 2023 21:13:59 +0200 Subject: [PATCH 2/8] feat: smaller binaries --- Cargo.toml | 7 +++++++ src/commands/bib.rs | 13 ++++++++----- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 518d125..b41350e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -26,3 +26,10 @@ diesel = { version = "2.0.4", features = ["sqlite", "returning_clauses_for_sqlit diesel_migrations = { version = "2.0.0", features = [ "sqlite" ] } # Force sqlite3 to be bundled, allowing for a fully static binary libsqlite3-sys = { version = "*", features = ["bundled"] } + +# https://stackoverflow.com/a/54842093 +[profile.release] +lto = true # Enable link-time optimization +codegen-units = 1 # Reduce number of codegen units to increase optimizations +panic = 'abort' # Abort on panic +strip = true # Strip symbols from binary* diff --git a/src/commands/bib.rs b/src/commands/bib.rs index 32fbbe2..01e7dab 100644 --- a/src/commands/bib.rs +++ b/src/commands/bib.rs @@ -48,8 +48,10 @@ fn resource_to_embed_field(resource: Resource) -> EmbedField { #[poise::command(prefix_command, slash_command)] pub async fn available(ctx: Context<'_>, date: HumanNaiveDate) -> Result<(), Error> { let client = &ctx.data().client; + let date: NaiveDate = date.into(); + let mut resources = client - .available(STERRE_BIB_ID, date.clone().into(), 1) + .available(STERRE_BIB_ID, date, 1) .await?; // Cloning here isn't super efficient, but this list only consists of a handful of elements so // it's fine @@ -59,7 +61,7 @@ pub async fn available(ctx: Context<'_>, date: HumanNaiveDate) -> Result<(), Err f.embed(|e| { e.description(format!( "Available booking dates for {}.", - Into::::into(date) + date )) .fields( resources @@ -91,6 +93,7 @@ pub async fn book( let guild_id = ctx.guild_id().unwrap(); let discord_id = ctx.author().id.0 as i64; + let date: NaiveDate = date.into(); let user = { let mut conn = ctx.data().pool.get()?; @@ -108,7 +111,7 @@ pub async fn book( let client = &ctx.data().client; let resources = client - .available(STERRE_BIB_ID, date.clone().into(), 1) + .available(STERRE_BIB_ID, date, 1) .await?; let chosen_resource = resources .iter() @@ -119,7 +122,7 @@ pub async fn book( let reservation = Reservation { auth_type: None, email: user.email.clone(), - date: date.clone().into(), + date, start_time, end_time, note: "coworking space".to_string(), @@ -136,7 +139,7 @@ pub async fn book( ctx.send(|f| { f.embed(|e| { e.description("A new reservation has been made.") - .field("when", format!("{} {} - {}", Into::::into(date), start_time.format(TIME_FORMAT), end_time.format(TIME_FORMAT)), false) + .field("when", format!("{} {} - {}", date, start_time.format(TIME_FORMAT), end_time.format(TIME_FORMAT)), false) .field("where", &chosen_resource.resource_name, false) .footer(|ft| ft.text( format!("A confirmation mail has been sent to {}. Please check your email and confirm your reservation within two hours.", user.email))) From fa24625a1f75c168bcb107ecab1fd14f27ddfcce Mon Sep 17 00:00:00 2001 From: Chewing_Bever Date: Sat, 20 May 2023 21:17:01 +0200 Subject: [PATCH 3/8] chore: conform linting --- src/commands/bib.rs | 25 +++++++++---------------- 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/src/commands/bib.rs b/src/commands/bib.rs index 01e7dab..9f28cee 100644 --- a/src/commands/bib.rs +++ b/src/commands/bib.rs @@ -50,25 +50,20 @@ pub async fn available(ctx: Context<'_>, date: HumanNaiveDate) -> Result<(), Err let client = &ctx.data().client; let date: NaiveDate = date.into(); - let mut resources = client - .available(STERRE_BIB_ID, date, 1) - .await?; + let mut resources = client.available(STERRE_BIB_ID, date, 1).await?; // Cloning here isn't super efficient, but this list only consists of a handful of elements so // it's fine resources.sort_by_key(|k| k.resource_name.clone()); ctx.send(|f| { f.embed(|e| { - e.description(format!( - "Available booking dates for {}.", - date - )) - .fields( - resources - .into_iter() - .map(resource_to_embed_field) - .collect::>(), - ) + e.description(format!("Available booking dates for {}.", date)) + .fields( + resources + .into_iter() + .map(resource_to_embed_field) + .collect::>(), + ) }) }) .await?; @@ -110,9 +105,7 @@ pub async fn book( let user = user.unwrap(); let client = &ctx.data().client; - let resources = client - .available(STERRE_BIB_ID, date, 1) - .await?; + let resources = client.available(STERRE_BIB_ID, date, 1).await?; let chosen_resource = resources .iter() .filter(|r| capacity.is_none() || capacity.unwrap() <= r.capacity) From c33cec3af50c86b37bb4b026f5c97f5ca783c1ad Mon Sep 17 00:00:00 2001 From: Chewing_Bever Date: Sat, 20 May 2023 21:13:59 +0200 Subject: [PATCH 4/8] feat: smaller binaries --- Cargo.toml | 7 +++++++ src/commands/bib.rs | 13 ++++++++----- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 518d125..b41350e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -26,3 +26,10 @@ diesel = { version = "2.0.4", features = ["sqlite", "returning_clauses_for_sqlit diesel_migrations = { version = "2.0.0", features = [ "sqlite" ] } # Force sqlite3 to be bundled, allowing for a fully static binary libsqlite3-sys = { version = "*", features = ["bundled"] } + +# https://stackoverflow.com/a/54842093 +[profile.release] +lto = true # Enable link-time optimization +codegen-units = 1 # Reduce number of codegen units to increase optimizations +panic = 'abort' # Abort on panic +strip = true # Strip symbols from binary* diff --git a/src/commands/bib.rs b/src/commands/bib.rs index 32fbbe2..01e7dab 100644 --- a/src/commands/bib.rs +++ b/src/commands/bib.rs @@ -48,8 +48,10 @@ fn resource_to_embed_field(resource: Resource) -> EmbedField { #[poise::command(prefix_command, slash_command)] pub async fn available(ctx: Context<'_>, date: HumanNaiveDate) -> Result<(), Error> { let client = &ctx.data().client; + let date: NaiveDate = date.into(); + let mut resources = client - .available(STERRE_BIB_ID, date.clone().into(), 1) + .available(STERRE_BIB_ID, date, 1) .await?; // Cloning here isn't super efficient, but this list only consists of a handful of elements so // it's fine @@ -59,7 +61,7 @@ pub async fn available(ctx: Context<'_>, date: HumanNaiveDate) -> Result<(), Err f.embed(|e| { e.description(format!( "Available booking dates for {}.", - Into::::into(date) + date )) .fields( resources @@ -91,6 +93,7 @@ pub async fn book( let guild_id = ctx.guild_id().unwrap(); let discord_id = ctx.author().id.0 as i64; + let date: NaiveDate = date.into(); let user = { let mut conn = ctx.data().pool.get()?; @@ -108,7 +111,7 @@ pub async fn book( let client = &ctx.data().client; let resources = client - .available(STERRE_BIB_ID, date.clone().into(), 1) + .available(STERRE_BIB_ID, date, 1) .await?; let chosen_resource = resources .iter() @@ -119,7 +122,7 @@ pub async fn book( let reservation = Reservation { auth_type: None, email: user.email.clone(), - date: date.clone().into(), + date, start_time, end_time, note: "coworking space".to_string(), @@ -136,7 +139,7 @@ pub async fn book( ctx.send(|f| { f.embed(|e| { e.description("A new reservation has been made.") - .field("when", format!("{} {} - {}", Into::::into(date), start_time.format(TIME_FORMAT), end_time.format(TIME_FORMAT)), false) + .field("when", format!("{} {} - {}", date, start_time.format(TIME_FORMAT), end_time.format(TIME_FORMAT)), false) .field("where", &chosen_resource.resource_name, false) .footer(|ft| ft.text( format!("A confirmation mail has been sent to {}. Please check your email and confirm your reservation within two hours.", user.email))) From 7467b1f588643962ee45dc91b8ebcf4df9c309af Mon Sep 17 00:00:00 2001 From: Chewing_Bever Date: Sat, 20 May 2023 21:17:01 +0200 Subject: [PATCH 5/8] chore: conform linting --- src/commands/bib.rs | 25 +++++++++---------------- 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/src/commands/bib.rs b/src/commands/bib.rs index 01e7dab..9f28cee 100644 --- a/src/commands/bib.rs +++ b/src/commands/bib.rs @@ -50,25 +50,20 @@ pub async fn available(ctx: Context<'_>, date: HumanNaiveDate) -> Result<(), Err let client = &ctx.data().client; let date: NaiveDate = date.into(); - let mut resources = client - .available(STERRE_BIB_ID, date, 1) - .await?; + let mut resources = client.available(STERRE_BIB_ID, date, 1).await?; // Cloning here isn't super efficient, but this list only consists of a handful of elements so // it's fine resources.sort_by_key(|k| k.resource_name.clone()); ctx.send(|f| { f.embed(|e| { - e.description(format!( - "Available booking dates for {}.", - date - )) - .fields( - resources - .into_iter() - .map(resource_to_embed_field) - .collect::>(), - ) + e.description(format!("Available booking dates for {}.", date)) + .fields( + resources + .into_iter() + .map(resource_to_embed_field) + .collect::>(), + ) }) }) .await?; @@ -110,9 +105,7 @@ pub async fn book( let user = user.unwrap(); let client = &ctx.data().client; - let resources = client - .available(STERRE_BIB_ID, date, 1) - .await?; + let resources = client.available(STERRE_BIB_ID, date, 1).await?; let chosen_resource = resources .iter() .filter(|r| capacity.is_none() || capacity.unwrap() <= r.capacity) From 83e9d3e8cfedd21cf99e7e85dd896fe1ac497123 Mon Sep 17 00:00:00 2001 From: Chewing_Bever Date: Sat, 20 May 2023 22:36:44 +0200 Subject: [PATCH 6/8] fix: writeable docker data directory --- Dockerfile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Dockerfile b/Dockerfile index b2cbacc..9d47548 100644 --- a/Dockerfile +++ b/Dockerfile @@ -25,6 +25,9 @@ FROM busybox:1.36.0 COPY --from=builder /build/dumb-init /build/affy/target/release/affy /bin/ +RUN mkdir /data && \ + chown -R www-data:www-data /data + WORKDIR /data ENV TZ=Europe/Brussels From 7fd6d55e71b84605a4a7c9c3a7349d0bd7a3804a Mon Sep 17 00:00:00 2001 From: Chewing_Bever Date: Thu, 15 Feb 2024 14:00:09 +0100 Subject: [PATCH 7/8] fix: update serialization for new state string type --- .woodpecker/deploy.yml | 12 ++++++------ Cargo.lock | 2 ++ affluences-api/src/models/available.rs | 26 +++++++++++++++++++------- affluences-cli/Cargo.toml | 2 ++ affluences-cli/src/main.rs | 17 ++++++++++++++++- src/commands/bib.rs | 4 ++-- 6 files changed, 47 insertions(+), 16 deletions(-) diff --git a/.woodpecker/deploy.yml b/.woodpecker/deploy.yml index 1fd44e2..7be1e36 100644 --- a/.woodpecker/deploy.yml +++ b/.woodpecker/deploy.yml @@ -14,9 +14,9 @@ pipeline: - 'docker_username' - 'docker_password' - deploy: - image: 'curlimages/curl' - secrets: - - 'webhook' - commands: - - curl -XPOST --fail -s "$WEBHOOK" + # deploy: + # image: 'curlimages/curl' + # secrets: + # - 'webhook' + # commands: + # - curl -XPOST --fail -s "$WEBHOOK" diff --git a/Cargo.lock b/Cargo.lock index 1237a05..31b1f33 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -23,9 +23,11 @@ name = "affluences-cli" version = "0.1.0" dependencies = [ "affluences-api", + "chrono", "clap", "serde_json", "tokio", + "uuid", ] [[package]] diff --git a/affluences-api/src/models/available.rs b/affluences-api/src/models/available.rs index e10052c..ced3836 100644 --- a/affluences-api/src/models/available.rs +++ b/affluences-api/src/models/available.rs @@ -1,12 +1,19 @@ use super::hh_mm_time_format; use chrono::{Duration, NaiveTime}; -use serde::Deserialize; +use serde::{Deserialize, Serialize}; -#[derive(Deserialize, Debug, Clone, Copy)] +#[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq)] +#[serde(rename_all = "lowercase")] +pub enum ResourceState { + Available, + Full, +} + +#[derive(Serialize, Deserialize, Debug, Clone, Copy)] pub struct HourBlock { #[serde(with = "hh_mm_time_format")] pub hour: NaiveTime, - pub state: u32, + pub state: ResourceState, // reservations pub granularity: u32, pub person_count: u32, @@ -14,7 +21,7 @@ pub struct HourBlock { pub places_bookable: u32, } -#[derive(Deserialize, Debug)] +#[derive(Serialize, Deserialize, Debug)] pub struct Resource { pub resource_id: u32, pub resource_name: String, @@ -38,7 +45,7 @@ pub struct Resource { // max_places_per_reservation pub image_url: Option, // services - pub slots_state: u32, + pub slots_state: ResourceState, pub hours: Vec, } @@ -70,13 +77,18 @@ impl Resource { pub fn condensed_available_hours(&self) -> Vec<(&HourBlock, Duration)> { self.condensed_hours() .into_iter() - .filter(|(hour, _)| hour.state == 1) + .filter(|(hour, _)| hour.state == ResourceState::Available) .collect() } /// Returns whether a slot with the given state and time bounds is present in the list of /// hours. - pub fn has_slot(&self, start_time: NaiveTime, end_time: NaiveTime, state: u32) -> bool { + pub fn has_slot( + &self, + start_time: NaiveTime, + end_time: NaiveTime, + state: ResourceState, + ) -> bool { self.condensed_hours() .into_iter() .filter(|(block, _)| block.state == state) diff --git a/affluences-cli/Cargo.toml b/affluences-cli/Cargo.toml index f46a340..f9aa8b1 100644 --- a/affluences-cli/Cargo.toml +++ b/affluences-cli/Cargo.toml @@ -10,3 +10,5 @@ affluences-api = { path = "../affluences-api" } clap = { version = "4.2.7", features = ["derive"] } serde_json = "1.0.96" tokio = { version = "1.28.1", features = ["full"] } +uuid = "*" +chrono = "*" diff --git a/affluences-cli/src/main.rs b/affluences-cli/src/main.rs index 3b31cb5..afd9b29 100644 --- a/affluences-cli/src/main.rs +++ b/affluences-cli/src/main.rs @@ -1,5 +1,9 @@ use affluences_api::AffluencesClient; +use chrono::NaiveDate; use clap::{Parser, Subcommand}; +use uuid::{uuid, Uuid}; + +const STERRE_BIB_ID: Uuid = uuid!("4737e57a-ee05-4f7b-901a-7bb541eeb297"); #[derive(Parser)] #[command(author, version, about, long_about = None)] @@ -11,7 +15,10 @@ struct Cli { #[derive(Subcommand)] enum Commands { /// does testing things - SearchSite { query: String }, + SearchSite { + query: String, + }, + Available, } #[tokio::main] @@ -25,6 +32,14 @@ async fn main() { let s = serde_json::to_string_pretty(&res).unwrap(); println!("{}", s); } + Some(Commands::Available) => { + let res = client + .available(STERRE_BIB_ID, chrono::Utc::now().naive_utc().date(), 1) + .await + .unwrap(); + let s = serde_json::to_string_pretty(&res).unwrap(); + println!("{}", s); + } None => {} } } diff --git a/src/commands/bib.rs b/src/commands/bib.rs index 9f28cee..f5f68f7 100644 --- a/src/commands/bib.rs +++ b/src/commands/bib.rs @@ -2,7 +2,7 @@ use crate::commands::{EmbedField, HumanNaiveDate}; use crate::db::users::User; use crate::{Context, Error}; -use affluences_api::{Reservation, Resource}; +use affluences_api::{Reservation, Resource, ResourceState}; use chrono::{NaiveDate, NaiveTime}; use uuid::{uuid, Uuid}; @@ -109,7 +109,7 @@ pub async fn book( let chosen_resource = resources .iter() .filter(|r| capacity.is_none() || capacity.unwrap() <= r.capacity) - .find(|r| r.has_slot(start_time, end_time, 1)); + .find(|r| r.has_slot(start_time, end_time, ResourceState::Available)); if let Some(chosen_resource) = chosen_resource { let reservation = Reservation { From 81f052ecbc67f8dfbb1c6d583e4582e2e22b2977 Mon Sep 17 00:00:00 2001 From: Chewing_Bever Date: Thu, 15 Feb 2024 14:07:06 +0100 Subject: [PATCH 8/8] chore: bump rust version to 1.76 --- .woodpecker/build.yml | 2 +- .woodpecker/clippy.yml | 2 +- .woodpecker/lint.yml | 2 +- Dockerfile | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.woodpecker/build.yml b/.woodpecker/build.yml index 5779344..7adfe62 100644 --- a/.woodpecker/build.yml +++ b/.woodpecker/build.yml @@ -5,7 +5,7 @@ branches: pipeline: build: - image: 'rust:1.69' + image: 'rust:1.76' commands: - cargo build --verbose - cargo test --verbose diff --git a/.woodpecker/clippy.yml b/.woodpecker/clippy.yml index 92851e5..d34cdf6 100644 --- a/.woodpecker/clippy.yml +++ b/.woodpecker/clippy.yml @@ -5,7 +5,7 @@ branches: pipeline: clippy: - image: 'rust:1.69' + image: 'rust:1.76' commands: - rustup component add clippy - cargo clippy -- --no-deps -Dwarnings diff --git a/.woodpecker/lint.yml b/.woodpecker/lint.yml index ad2b612..89c1d62 100644 --- a/.woodpecker/lint.yml +++ b/.woodpecker/lint.yml @@ -5,7 +5,7 @@ branches: pipeline: lint: - image: 'rust:1.69' + image: 'rust:1.76' commands: - rustup component add rustfmt - cargo fmt -- --check diff --git a/Dockerfile b/Dockerfile index 9d47548..12e9300 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.69-alpine AS builder +FROM rust:1.76-alpine AS builder ARG DI_VER=1.2.5