From 7fd6d55e71b84605a4a7c9c3a7349d0bd7a3804a Mon Sep 17 00:00:00 2001 From: Chewing_Bever Date: Thu, 15 Feb 2024 14:00:09 +0100 Subject: [PATCH] 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 {