Compare commits

...

3 Commits

Author SHA1 Message Date
Jef Roosens fd81b64262
fix(ci): add clippy and rustfmt
ci/woodpecker/push/lint Pipeline failed Details
ci/woodpecker/push/clippy Pipeline failed Details
ci/woodpecker/push/build Pipeline was successful Details
2023-05-13 13:10:24 +02:00
Jef Roosens 29f13d49b9
feat: start affluences cli for testing 2023-05-13 13:10:07 +02:00
Jef Roosens 8909ac57a8
docs: start of api reference file 2023-05-13 12:29:35 +02:00
10 changed files with 313 additions and 14 deletions

View File

@ -7,4 +7,5 @@ pipeline:
clippy: clippy:
image: 'rust:1.69' image: 'rust:1.69'
commands: commands:
- rustup component add clippy
- cargo clippy -- --no-deps -Dwarnings - cargo clippy -- --no-deps -Dwarnings

View File

@ -7,4 +7,5 @@ pipeline:
lint: lint:
image: 'rust:1.69' image: 'rust:1.69'
commands: commands:
- rustup component add rustfmt
- cargo fmt -- --check - cargo fmt -- --check

191
Cargo.lock generated
View File

@ -18,6 +18,16 @@ dependencies = [
"uuid", "uuid",
] ]
[[package]]
name = "affluences-cli"
version = "0.1.0"
dependencies = [
"affluences-api",
"clap",
"serde_json",
"tokio",
]
[[package]] [[package]]
name = "affy" name = "affy"
version = "0.1.0" version = "0.1.0"
@ -38,6 +48,55 @@ dependencies = [
"libc", "libc",
] ]
[[package]]
name = "anstream"
version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0ca84f3628370c59db74ee214b3263d58f9aadd9b4fe7e711fd87dc452b7f163"
dependencies = [
"anstyle",
"anstyle-parse",
"anstyle-query",
"anstyle-wincon",
"colorchoice",
"is-terminal",
"utf8parse",
]
[[package]]
name = "anstyle"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "41ed9a86bf92ae6580e0a31281f65a1b1d867c0cc68d5346e2ae128dddfa6a7d"
[[package]]
name = "anstyle-parse"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e765fd216e48e067936442276d1d57399e37bce53c264d6fefbe298080cb57ee"
dependencies = [
"utf8parse",
]
[[package]]
name = "anstyle-query"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b"
dependencies = [
"windows-sys 0.48.0",
]
[[package]]
name = "anstyle-wincon"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "180abfa45703aebe0093f79badacc01b8fd4ea2e35118747e5811127f926e188"
dependencies = [
"anstyle",
"windows-sys 0.48.0",
]
[[package]] [[package]]
name = "async-trait" name = "async-trait"
version = "0.1.68" version = "0.1.68"
@ -144,6 +203,48 @@ dependencies = [
"winapi", "winapi",
] ]
[[package]]
name = "clap"
version = "4.2.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "34d21f9bf1b425d2968943631ec91202fe5e837264063503708b83013f8fc938"
dependencies = [
"clap_builder",
"clap_derive",
"once_cell",
]
[[package]]
name = "clap_builder"
version = "4.2.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "914c8c79fb560f238ef6429439a30023c862f7a28e688c58f7203f12b29970bd"
dependencies = [
"anstream",
"anstyle",
"bitflags",
"clap_lex",
"strsim",
]
[[package]]
name = "clap_derive"
version = "4.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3f9644cd56d6b87dbe899ef8b053e331c0637664e9e21a33dfcdc36093f5c5c4"
dependencies = [
"heck",
"proc-macro2",
"quote",
"syn 2.0.15",
]
[[package]]
name = "clap_lex"
version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8a2dd5a6fe8c6e3502f568a6353e5273bbb15193ad9a89e457b9970798efbea1"
[[package]] [[package]]
name = "codespan-reporting" name = "codespan-reporting"
version = "0.11.1" version = "0.11.1"
@ -154,6 +255,12 @@ dependencies = [
"unicode-width", "unicode-width",
] ]
[[package]]
name = "colorchoice"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7"
[[package]] [[package]]
name = "core-foundation-sys" name = "core-foundation-sys"
version = "0.8.4" version = "0.8.4"
@ -311,6 +418,27 @@ dependencies = [
"cfg-if", "cfg-if",
] ]
[[package]]
name = "errno"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a"
dependencies = [
"errno-dragonfly",
"libc",
"windows-sys 0.48.0",
]
[[package]]
name = "errno-dragonfly"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf"
dependencies = [
"cc",
"libc",
]
[[package]] [[package]]
name = "flate2" name = "flate2"
version = "1.0.26" version = "1.0.26"
@ -459,6 +587,12 @@ version = "0.12.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
[[package]]
name = "heck"
version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
[[package]] [[package]]
name = "hermit-abi" name = "hermit-abi"
version = "0.2.6" version = "0.2.6"
@ -468,6 +602,12 @@ dependencies = [
"libc", "libc",
] ]
[[package]]
name = "hermit-abi"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286"
[[package]] [[package]]
name = "http" name = "http"
version = "0.2.9" version = "0.2.9"
@ -589,12 +729,35 @@ dependencies = [
"hashbrown", "hashbrown",
] ]
[[package]]
name = "io-lifetimes"
version = "1.0.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9c66c74d2ae7e79a5a8f7ac924adbe38ee42a859c6539ad869eb51f0b52dc220"
dependencies = [
"hermit-abi 0.3.1",
"libc",
"windows-sys 0.48.0",
]
[[package]] [[package]]
name = "ipnet" name = "ipnet"
version = "2.7.2" version = "2.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "12b6ee2129af8d4fb011108c73d99a1b83a85977f23b82460c0ae2e25bb4b57f" checksum = "12b6ee2129af8d4fb011108c73d99a1b83a85977f23b82460c0ae2e25bb4b57f"
[[package]]
name = "is-terminal"
version = "0.4.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "adcf93614601c8129ddf72e2d5633df827ba6551541c6d8c59520a371475be1f"
dependencies = [
"hermit-abi 0.3.1",
"io-lifetimes",
"rustix",
"windows-sys 0.48.0",
]
[[package]] [[package]]
name = "itoa" name = "itoa"
version = "1.0.6" version = "1.0.6"
@ -625,6 +788,12 @@ dependencies = [
"cc", "cc",
] ]
[[package]]
name = "linux-raw-sys"
version = "0.3.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ece97ea872ece730aed82664c424eb4c8291e1ff2480247ccf7409044bc6479f"
[[package]] [[package]]
name = "lock_api" name = "lock_api"
version = "0.4.9" version = "0.4.9"
@ -712,7 +881,7 @@ version = "1.15.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b"
dependencies = [ dependencies = [
"hermit-abi", "hermit-abi 0.2.6",
"libc", "libc",
] ]
@ -938,6 +1107,20 @@ dependencies = [
"winapi", "winapi",
] ]
[[package]]
name = "rustix"
version = "0.37.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "acf8729d8542766f1b2cf77eb034d52f40d375bb8b615d0b147089946e16613d"
dependencies = [
"bitflags",
"errno",
"io-lifetimes",
"libc",
"linux-raw-sys",
"windows-sys 0.48.0",
]
[[package]] [[package]]
name = "rustls" name = "rustls"
version = "0.20.8" version = "0.20.8"
@ -1432,6 +1615,12 @@ version = "0.7.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9"
[[package]]
name = "utf8parse"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a"
[[package]] [[package]]
name = "uuid" name = "uuid"
version = "1.3.2" version = "1.3.2"

View File

@ -2,5 +2,6 @@
members = [ members = [
"affluences-api", "affluences-api",
"affluences-cli",
"bot", "bot",
] ]

View File

@ -1,3 +1,45 @@
# Affluences API Reference
## Terminology
* `site`
* General name for a location/institution
* Defined by a UUID and a slug, e.g. `ghent-university`
* Can contain one more or more sites, e.g.
`ghent-university-library-book-tower` is a child of `ghent-university`
## Notes
The API checks for browser user agents, so your requests should include a valid
user agent of a modern browser.
## API Routes
### Search for sites
`GET https://api.affluences.com/app/v3/sites`
**Body format**
```json
{
"selected_categories": [
1
],
"page": 0,
"search_query": "university of ghent"
}
```
**Response format**
`Data<Vec<SiteData>>`
### Retrieve time table for a given site
`GET https://reservation.affluences.com/api/sites/4737e57a-ee05-4f7b-901a-7bb541eeb297`
curl -L 'https://api.affluences.com/app/v3/sites/ghent-university' -H 'User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/112.0' curl -L 'https://api.affluences.com/app/v3/sites/ghent-university' -H 'User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/112.0'
returnt lijst van alle bibliotheken op ugent, inclusief de uuids die dan nodig zijn om de specifieke requests te sturen naar die bib zijn stuff returnt lijst van alle bibliotheken op ugent, inclusief de uuids die dan nodig zijn om de specifieke requests te sturen naar die bib zijn stuff

View File

@ -20,6 +20,15 @@ impl AffluencesClient {
} }
} }
pub async fn search(&self, query: String) -> reqwest::Result<SiteSearchResponse> {
let url = "https://api.affluences.com/app/v3/sites";
let body = SiteSearch{
search_query: query
};
Ok(self.client.post(url).json(&body).send().await?.json::<Data<SiteSearchResponse>>().await?.data)
}
pub async fn available( pub async fn available(
&self, &self,
site_id: uuid::Uuid, site_id: uuid::Uuid,

View File

@ -1,24 +1,24 @@
use serde::Deserialize; use serde::{Serialize, Deserialize};
#[derive(Deserialize, Debug)] #[derive(Serialize, Deserialize, Debug)]
pub struct Data<T> { pub struct Data<T> {
pub data: T, pub data: T,
} }
#[derive(Deserialize, Debug)] #[derive(Serialize, Deserialize, Debug)]
pub struct SiteDataCategory { pub struct SiteDataCategory {
pub id: u32, pub id: u32,
pub name: String, pub name: String,
pub name_plural: String, pub name_plural: String,
} }
#[derive(Deserialize, Debug)] #[derive(Serialize, Deserialize, Debug)]
pub struct SiteDataLocationCoordinates { pub struct SiteDataLocationCoordinates {
pub latitude: f64, pub latitude: f64,
pub longitude: f64, pub longitude: f64,
} }
#[derive(Deserialize, Debug)] #[derive(Serialize, Deserialize, Debug)]
pub struct SiteDataLocationAddress { pub struct SiteDataLocationAddress {
pub route: String, pub route: String,
pub city: String, pub city: String,
@ -27,47 +27,47 @@ pub struct SiteDataLocationAddress {
pub country_code: String, pub country_code: String,
} }
#[derive(Deserialize, Debug)] #[derive(Serialize, Deserialize, Debug)]
pub struct SiteDataLocation { pub struct SiteDataLocation {
pub coordinates: SiteDataLocationCoordinates, pub coordinates: SiteDataLocationCoordinates,
pub address: SiteDataLocationAddress, pub address: SiteDataLocationAddress,
} }
#[derive(Deserialize, Debug)] #[derive(Serialize, Deserialize, Debug)]
pub struct SiteDataForecast { pub struct SiteDataForecast {
pub opened: bool, pub opened: bool,
pub occupancy: u32, pub occupancy: Option<u32>,
// waiting_time // waiting_time
pub waiting_time_overflow: bool, pub waiting_time_overflow: bool,
} }
#[derive(Deserialize, Debug)] #[derive(Serialize, Deserialize, Debug)]
pub struct SiteDataNotice { pub struct SiteDataNotice {
pub message: String, pub message: String,
pub url: Option<String>, pub url: Option<String>,
} }
#[derive(Deserialize, Debug)] #[derive(Serialize, Deserialize, Debug)]
pub struct SiteDataService { pub struct SiteDataService {
pub id: u32, pub id: u32,
pub name: String, pub name: String,
} }
#[derive(Deserialize, Debug)] #[derive(Serialize, Deserialize, Debug)]
pub struct SiteDataInfo { pub struct SiteDataInfo {
pub title: String, pub title: String,
pub description: String, pub description: String,
pub url: Option<String>, pub url: Option<String>,
} }
#[derive(Deserialize, Debug)] #[derive(Serialize, Deserialize, Debug)]
pub struct SiteDataStatus { pub struct SiteDataStatus {
pub state: String, pub state: String,
pub text: String, pub text: String,
pub color: String, pub color: String,
} }
#[derive(Deserialize, Debug)] #[derive(Serialize, Deserialize, Debug)]
pub struct SiteData { pub struct SiteData {
pub id: uuid::Uuid, pub id: uuid::Uuid,
pub slug: String, pub slug: String,
@ -104,3 +104,15 @@ pub struct SiteData {
#[serde(rename = "publicationStatus")] #[serde(rename = "publicationStatus")]
pub publication_status: String, pub publication_status: String,
} }
#[derive(Serialize, Debug)]
pub struct SiteSearch {
pub search_query: String
}
#[derive(Serialize, Deserialize, Debug)]
pub struct SiteSearchResponse {
pub page: u32,
pub max_size: u32,
pub results: Vec<SiteData>
}

View File

@ -0,0 +1,12 @@
[package]
name = "affluences-cli"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
affluences-api = { path = "../affluences-api" }
clap = { version = "4.2.7", features = ["derive"] }
serde_json = "1.0.96"
tokio = { version = "1.28.1", features = ["full"] }

View File

@ -0,0 +1,30 @@
use affluences_api::AffluencesClient;
use clap::{Parser, Subcommand};
#[derive(Parser)]
#[command(author, version, about, long_about = None)]
struct Cli {
#[command(subcommand)]
command: Option<Commands>,
}
#[derive(Subcommand)]
enum Commands {
/// does testing things
SearchSite { query: String },
}
#[tokio::main]
async fn main() {
let cli = Cli::parse();
let client = AffluencesClient::new();
match &cli.command {
Some(Commands::SearchSite { query }) => {
let res = client.search(query.to_string()).await.unwrap();
let s = serde_json::to_string_pretty(&res).unwrap();
println!("{}", s);
}
None => {}
}
}

View File

@ -158,3 +158,5 @@ pub async fn available(ctx: Context<'_>, date: NaiveDate) -> Result<(), Error> {
// ctx: Context<'_>, // ctx: Context<'_>,
// date: NaiveDate, // date: NaiveDate,
// ) -> Result<(), Error> { // ) -> Result<(), Error> {
// }