parent
9bc75b9627
commit
b742f0f8d6
127 changed files with 38 additions and 5722 deletions
src
124
src/main.rs
Normal file
124
src/main.rs
Normal file
|
@ -0,0 +1,124 @@
|
|||
use std::net::TcpListener;
|
||||
|
||||
use actix::{Actor, Arbiter};
|
||||
use actix_cors::Cors;
|
||||
use actix_web::middleware::TrailingSlash;
|
||||
use actix_web::{middleware, web, App, HttpServer};
|
||||
use emgauwa_common::db::DbController;
|
||||
use emgauwa_common::errors::EmgauwaError;
|
||||
use emgauwa_common::utils::{drop_privileges, init_logging};
|
||||
use serde_json::json;
|
||||
use utoipa_swagger_ui::SwaggerUi;
|
||||
|
||||
use crate::app_state::AppState;
|
||||
|
||||
mod app_state;
|
||||
mod handlers;
|
||||
mod settings;
|
||||
mod utils;
|
||||
|
||||
#[actix_web::main]
|
||||
async fn main() -> Result<(), std::io::Error> {
|
||||
let settings = settings::init()?;
|
||||
|
||||
let listener = TcpListener::bind(format!("{}:{}", settings.server.host, settings.server.port))?;
|
||||
drop_privileges(&settings.permissions)?;
|
||||
|
||||
init_logging(&settings.logging.level)?;
|
||||
|
||||
let pool = emgauwa_common::db::init(&settings.database).await?;
|
||||
|
||||
let mut conn = pool.acquire().await.map_err(EmgauwaError::from)?;
|
||||
DbController::all_inactive(&mut conn)
|
||||
.await
|
||||
.map_err(EmgauwaError::from)?;
|
||||
conn.close().await.map_err(EmgauwaError::from)?;
|
||||
|
||||
let app_state_arbiter = Arbiter::with_tokio_rt(|| {
|
||||
tokio::runtime::Builder::new_multi_thread()
|
||||
.worker_threads(2)
|
||||
.enable_all()
|
||||
.build()
|
||||
.unwrap()
|
||||
});
|
||||
let app_state_pool = pool.clone();
|
||||
let app_state = Actor::start_in_arbiter(&app_state_arbiter.handle(), move |_| {
|
||||
AppState::new(app_state_pool)
|
||||
});
|
||||
|
||||
log::info!(
|
||||
"Starting server on {}:{}",
|
||||
settings.server.host,
|
||||
settings.server.port
|
||||
);
|
||||
|
||||
HttpServer::new(move || {
|
||||
let cors = Cors::default().allow_any_method().allow_any_header();
|
||||
|
||||
let origins = settings.origins.clone();
|
||||
let cors = match settings.origins.is_empty() {
|
||||
true => cors.allow_any_origin(),
|
||||
false => cors.allowed_origin_fn(move |origin, _req_head| {
|
||||
origins.contains(&origin.to_str().unwrap_or_default().to_string())
|
||||
}),
|
||||
};
|
||||
|
||||
let api_default = json!({
|
||||
"openapi": "3.0.0",
|
||||
"info": {
|
||||
"version": "0.0.0",
|
||||
"title": "Failed to load API documentation",
|
||||
}
|
||||
});
|
||||
let api_v1_json =
|
||||
serde_json::from_str(include_str!(concat!(env!("OUT_DIR"), "/api.v1.json")))
|
||||
.unwrap_or(api_default.clone());
|
||||
|
||||
App::new()
|
||||
.wrap(cors)
|
||||
.wrap(middleware::Logger::default())
|
||||
.app_data(web::JsonConfig::default().error_handler(handlers::json_error_handler))
|
||||
.app_data(web::Data::new(pool.clone()))
|
||||
.app_data(web::Data::new(app_state.clone()))
|
||||
.service(
|
||||
SwaggerUi::new("/api/docs/{_:.*}")
|
||||
.external_urls_from_iter_unchecked([("/api/v1.json", api_v1_json)]),
|
||||
)
|
||||
.service(
|
||||
web::scope("/api/v1")
|
||||
.wrap(middleware::NormalizePath::new(TrailingSlash::Trim))
|
||||
.service(handlers::v1::controllers::index)
|
||||
.service(handlers::v1::controllers::show)
|
||||
.service(handlers::v1::controllers::update)
|
||||
.service(handlers::v1::controllers::delete)
|
||||
.service(handlers::v1::relays::index)
|
||||
.service(handlers::v1::relays::tagged)
|
||||
.service(handlers::v1::relays::index_for_controller)
|
||||
.service(handlers::v1::relays::show_for_controller)
|
||||
.service(handlers::v1::relays::update_for_controller)
|
||||
.service(handlers::v1::relays::pulse)
|
||||
.service(handlers::v1::schedules::index)
|
||||
.service(handlers::v1::schedules::tagged)
|
||||
.service(handlers::v1::schedules::show)
|
||||
.service(handlers::v1::schedules::add)
|
||||
.service(handlers::v1::schedules::add_list)
|
||||
.service(handlers::v1::schedules::update)
|
||||
.service(handlers::v1::schedules::delete)
|
||||
.service(handlers::v1::tags::index)
|
||||
.service(handlers::v1::tags::show)
|
||||
.service(handlers::v1::tags::delete)
|
||||
.service(handlers::v1::tags::add)
|
||||
.service(handlers::v1::macros::index)
|
||||
.service(handlers::v1::macros::show)
|
||||
.service(handlers::v1::macros::add)
|
||||
.service(handlers::v1::macros::update)
|
||||
.service(handlers::v1::macros::delete)
|
||||
.service(handlers::v1::macros::execute)
|
||||
.service(handlers::v1::ws::ws_controllers)
|
||||
.service(handlers::v1::ws::ws_relays),
|
||||
)
|
||||
})
|
||||
.listen(listener)?
|
||||
.run()
|
||||
.await
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue