From 0a058ba2064d323451462a79c71580dea7d8ec8c Mon Sep 17 00:00:00 2001 From: FxQnLr Date: Mon, 4 Mar 2024 21:37:55 +0100 Subject: Closes #19. Added OpenApi through `utoipa` --- src/main.rs | 89 ++++++++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 70 insertions(+), 19 deletions(-) (limited to 'src/main.rs') diff --git a/src/main.rs b/src/main.rs index d17984f..8978e58 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,21 +1,29 @@ -use crate::config::Config; -use crate::db::init_db_pool; -use crate::routes::device; -use crate::routes::start::start; -use crate::routes::status::status; -use crate::services::ping::StatusMap; -use axum::middleware::from_fn_with_state; -use axum::routing::{get, put}; -use axum::{routing::post, Router}; +use crate::{ + config::Config, + db::init_db_pool, + routes::{device, start, status}, + services::ping::{BroadcastCommand, StatusMap}, +}; +use axum::{ + middleware::from_fn_with_state, + routing::{get, post}, + Router, +}; use dashmap::DashMap; -use services::ping::BroadcastCommand; use sqlx::PgPool; -use std::env; -use std::sync::Arc; +use std::{env, sync::Arc}; use tokio::sync::broadcast::{channel, Sender}; use tracing::{info, level_filters::LevelFilter}; -use tracing_subscriber::fmt::time::UtcTime; -use tracing_subscriber::{fmt, prelude::*, EnvFilter}; +use tracing_subscriber::{ + fmt::{self, time::UtcTime}, + prelude::*, + EnvFilter, +}; +use utoipa::{ + openapi::security::{ApiKey, ApiKeyValue, SecurityScheme}, + Modify, OpenApi, +}; +use utoipa_swagger_ui::SwaggerUi; mod config; mod db; @@ -25,7 +33,47 @@ mod routes; mod services; mod wol; +#[derive(OpenApi)] +#[openapi( + paths( + start::start, + device::get, + device::get_path, + device::post, + device::put, + ), + components( + schemas( + start::Payload, + start::Response, + device::PutDevicePayload, + device::GetDevicePayload, + device::PostDevicePayload, + db::DeviceSchema, + ) + ), + modifiers(&SecurityAddon), + tags( + (name = "Webol", description = "Webol API") + ) +)] +struct ApiDoc; + +struct SecurityAddon; + +impl Modify for SecurityAddon { + fn modify(&self, openapi: &mut utoipa::openapi::OpenApi) { + if let Some(components) = openapi.components.as_mut() { + components.add_security_scheme( + "api_key", + SecurityScheme::ApiKey(ApiKey::Header(ApiKeyValue::new("Authorization"))), + ); + } + } +} + #[tokio::main] +#[allow(deprecated)] async fn main() -> color_eyre::eyre::Result<()> { color_eyre::install()?; @@ -67,12 +115,15 @@ async fn main() -> color_eyre::eyre::Result<()> { }; let app = Router::new() - .route("/start", post(start)) - .route("/device", get(device::get)) - .route("/device", put(device::put)) - .route("/device", post(device::post)) - .route("/status", get(status)) + .route("/start", post(start::start)) + .route( + "/device", + post(device::post).get(device::get).put(device::put), + ) + .route("/device/:id", get(device::get_path)) + .route("/status", get(status::status)) .route_layer(from_fn_with_state(shared_state.clone(), extractors::auth)) + .merge(SwaggerUi::new("/swagger-ui").url("/api-docs/openapi.json", ApiDoc::openapi())) .with_state(Arc::new(shared_state)); let addr = config.serveraddr; -- cgit v1.2.3 From 85c63c2ca8448428e2db93cb9d4f284a4e314ed7 Mon Sep 17 00:00:00 2001 From: FxQnLr Date: Mon, 4 Mar 2024 21:59:50 +0100 Subject: #20. Set offset manually through config --- src/config.rs | 2 ++ src/main.rs | 11 ++++++----- 2 files changed, 8 insertions(+), 5 deletions(-) (limited to 'src/main.rs') diff --git a/src/config.rs b/src/config.rs index 58043c2..9605361 100644 --- a/src/config.rs +++ b/src/config.rs @@ -8,6 +8,7 @@ pub struct Config { pub serveraddr: String, pub pingtimeout: i64, pub pingthreshold: i64, + pub timeoffset: i8, } impl Config { @@ -16,6 +17,7 @@ impl Config { .set_default("serveraddr", "0.0.0.0:7229")? .set_default("pingtimeout", 10)? .set_default("pingthreshold", 1)? + .set_default("timeoffset", 0)? .add_source(File::with_name("config.toml").required(false)) .add_source(File::with_name("config.dev.toml").required(false)) .add_source(config::Environment::with_prefix("WEBOL").prefix_separator("_")) diff --git a/src/main.rs b/src/main.rs index 8978e58..00fc6ce 100644 --- a/src/main.rs +++ b/src/main.rs @@ -11,11 +11,12 @@ use axum::{ }; use dashmap::DashMap; use sqlx::PgPool; +use time::UtcOffset; use std::{env, sync::Arc}; use tokio::sync::broadcast::{channel, Sender}; use tracing::{info, level_filters::LevelFilter}; use tracing_subscriber::{ - fmt::{self, time::UtcTime}, + fmt::{self, time::OffsetTime}, prelude::*, EnvFilter, }; @@ -77,16 +78,18 @@ impl Modify for SecurityAddon { async fn main() -> color_eyre::eyre::Result<()> { color_eyre::install()?; + let config = Config::load()?; + let time_format = time::macros::format_description!("[year]-[month]-[day] [hour]:[minute]:[second]"); - let loc = UtcTime::new(time_format); + let time = OffsetTime::new(UtcOffset::from_hms(config.timeoffset, 0, 0)?, time_format); let file_appender = tracing_appender::rolling::daily("logs", "webol.log"); let (non_blocking, _guard) = tracing_appender::non_blocking(file_appender); tracing_subscriber::registry() .with(fmt::layer().with_writer(non_blocking).with_ansi(false)) - .with(fmt::layer().with_timer(loc)) + .with(fmt::layer().with_timer(time)) .with( EnvFilter::builder() .with_default_directive(LevelFilter::INFO.into()) @@ -96,8 +99,6 @@ async fn main() -> color_eyre::eyre::Result<()> { let version = env!("CARGO_PKG_VERSION"); - let config = Config::load()?; - info!("start webol v{}", version); let db = init_db_pool(&config.database_url).await; -- cgit v1.2.3