moving the webserver out of the library
This commit is contained in:
@@ -1,7 +1,12 @@
|
||||
extern crate sqlx;
|
||||
|
||||
mod cli;
|
||||
mod views;
|
||||
|
||||
use actix_files::Files;
|
||||
use actix_identity::{CookieIdentityPolicy, IdentityService};
|
||||
use actix_web::{web, App, HttpServer};
|
||||
use fluent_templates::static_loader;
|
||||
use pslink::ServerConfig;
|
||||
|
||||
use tracing::instrument;
|
||||
@@ -9,6 +14,9 @@ use tracing::{subscriber::set_global_default, Subscriber};
|
||||
use tracing_opentelemetry::OpenTelemetryLayer;
|
||||
use tracing_subscriber::{layer::SubscriberExt, EnvFilter, Registry};
|
||||
|
||||
use tracing::{error, info};
|
||||
use tracing_actix_web::TracingLogger;
|
||||
|
||||
/// Compose multiple layers into a `tracing`'s subscriber.
|
||||
#[must_use]
|
||||
pub fn get_subscriber(name: &str, env_filter: &str) -> impl Subscriber + Send + Sync {
|
||||
@@ -47,7 +55,7 @@ async fn main() -> std::result::Result<(), std::io::Error> {
|
||||
|
||||
match cli::setup().await {
|
||||
Ok(Some(server_config)) => {
|
||||
pslink::webservice(server_config)
|
||||
webservice(server_config)
|
||||
.await
|
||||
.map_err(|e| {
|
||||
println!("{:?}", e);
|
||||
@@ -68,3 +76,112 @@ async fn main() -> std::result::Result<(), std::io::Error> {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// include the static files into the binary
|
||||
include!(concat!(env!("OUT_DIR"), "/generated.rs"));
|
||||
|
||||
static_loader! {
|
||||
static LOCALES = {
|
||||
locales: "./locales",
|
||||
fallback_language: "en",
|
||||
};
|
||||
}
|
||||
|
||||
/// Launch the pslink-webservice
|
||||
///
|
||||
/// # Errors
|
||||
/// This produces a [`ServerError`] if:
|
||||
/// * The server failed to bind to the designated port.
|
||||
#[allow(
|
||||
clippy::future_not_send,
|
||||
clippy::too_many_lines,
|
||||
unknown_lints,
|
||||
clippy::unused_async
|
||||
)]
|
||||
pub async fn webservice(
|
||||
server_config: ServerConfig,
|
||||
) -> Result<actix_web::dev::Server, std::io::Error> {
|
||||
let host_port = format!("{}:{}", &server_config.internal_ip, &server_config.port);
|
||||
info!(
|
||||
"Running on: {}://{}/app/",
|
||||
&server_config.protocol, host_port
|
||||
);
|
||||
info!(
|
||||
"If the public url is set up correctly it should be accessible via: {}://{}/app/",
|
||||
&server_config.protocol, &server_config.public_url
|
||||
);
|
||||
|
||||
let server = HttpServer::new(move || {
|
||||
let generated = generate();
|
||||
App::new()
|
||||
.data(server_config.clone())
|
||||
.wrap(TracingLogger)
|
||||
.wrap(IdentityService::new(
|
||||
CookieIdentityPolicy::new(&[0; 32])
|
||||
.name("auth-cookie")
|
||||
.secure(true),
|
||||
))
|
||||
.service(actix_web_static_files::ResourceFiles::new(
|
||||
"/static", generated,
|
||||
))
|
||||
// directly go to the main page set the target with the environment variable.
|
||||
.route("/", web::get().to(views::redirect_empty))
|
||||
// admin block
|
||||
.service(
|
||||
web::scope("/admin")
|
||||
.route("/logout/", web::to(views::logout))
|
||||
.service(
|
||||
web::scope("/download")
|
||||
.route("/png/{redirect_id}", web::get().to(views::download_png)),
|
||||
)
|
||||
.service(
|
||||
web::scope("/json")
|
||||
.route("/list_links/", web::post().to(views::index_json))
|
||||
.route("/get_language/", web::get().to(views::get_language))
|
||||
.route("/change_language/", web::post().to(views::set_language))
|
||||
.route(
|
||||
"/create_link/",
|
||||
web::post().to(views::process_create_link_json),
|
||||
)
|
||||
.route(
|
||||
"/edit_link/",
|
||||
web::post().to(views::process_update_link_json),
|
||||
)
|
||||
.route(
|
||||
"/delete_link/",
|
||||
web::post().to(views::process_delete_link_json),
|
||||
)
|
||||
.route("/list_users/", web::post().to(views::index_users_json))
|
||||
.route(
|
||||
"/create_user/",
|
||||
web::post().to(views::process_create_user_json),
|
||||
)
|
||||
.route(
|
||||
"/update_user/",
|
||||
web::post().to(views::process_update_user_json),
|
||||
)
|
||||
.route("/update_privileges/", web::post().to(views::toggle_admin))
|
||||
.route(
|
||||
"/get_logged_user/",
|
||||
web::post().to(views::get_logged_user_json),
|
||||
)
|
||||
.route("/login_user/", web::post().to(views::process_login_json)),
|
||||
),
|
||||
)
|
||||
// Serve the Wasm App for the admin interface.
|
||||
.service(
|
||||
web::scope("/app")
|
||||
.service(Files::new("/pkg", "./app/pkg"))
|
||||
.default_service(web::get().to(views::wasm_app)),
|
||||
)
|
||||
// redirect to the url hidden behind the code
|
||||
.route("/{redirect_id}", web::get().to(views::redirect))
|
||||
})
|
||||
.bind(host_port)
|
||||
.map_err(|e| {
|
||||
error!("Failed to bind to port!");
|
||||
e
|
||||
})?
|
||||
.run();
|
||||
Ok(server)
|
||||
}
|
||||
|
||||
@@ -12,8 +12,8 @@ use fluent_langneg::{
|
||||
};
|
||||
use fluent_templates::LanguageIdentifier;
|
||||
use image::{DynamicImage, ImageOutputFormat, Luma};
|
||||
use pslink::queries::{authenticate, RoleGuard};
|
||||
use qrcode::QrCode;
|
||||
use queries::{authenticate, RoleGuard};
|
||||
use shared::{
|
||||
apirequests::{
|
||||
general::{Message, Status},
|
||||
@@ -24,8 +24,8 @@ use shared::{
|
||||
};
|
||||
use tracing::{error, info, instrument, warn};
|
||||
|
||||
use crate::queries;
|
||||
use crate::ServerError;
|
||||
use pslink::queries;
|
||||
use pslink::ServerError;
|
||||
|
||||
#[instrument]
|
||||
fn redirect_builder(target: &str) -> HttpResponse {
|
||||
+1
-116
@@ -2,20 +2,14 @@ extern crate sqlx;
|
||||
|
||||
pub mod models;
|
||||
pub mod queries;
|
||||
mod views;
|
||||
|
||||
use actix_files::Files;
|
||||
use actix_identity::{CookieIdentityPolicy, IdentityService};
|
||||
use actix_web::HttpResponse;
|
||||
use actix_web::{web, App, HttpServer};
|
||||
use fluent_templates::static_loader;
|
||||
use qrcode::types::QrError;
|
||||
use shared::datatypes::Secret;
|
||||
use sqlx::{Pool, Sqlite};
|
||||
use std::{fmt::Display, path::PathBuf, str::FromStr};
|
||||
use thiserror::Error;
|
||||
use tracing::{error, info};
|
||||
use tracing_actix_web::TracingLogger;
|
||||
use tracing::error;
|
||||
|
||||
/// The Error type that is returned by most function calls if anything failed.
|
||||
#[derive(Error, Debug)]
|
||||
@@ -190,112 +184,3 @@ impl ServerConfig {
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
// include the static files into the binary
|
||||
include!(concat!(env!("OUT_DIR"), "/generated.rs"));
|
||||
|
||||
static_loader! {
|
||||
static LOCALES = {
|
||||
locales: "./locales",
|
||||
fallback_language: "en",
|
||||
};
|
||||
}
|
||||
|
||||
/// Launch the pslink-webservice
|
||||
///
|
||||
/// # Errors
|
||||
/// This produces a [`ServerError`] if:
|
||||
/// * The server failed to bind to the designated port.
|
||||
#[allow(
|
||||
clippy::future_not_send,
|
||||
clippy::too_many_lines,
|
||||
unknown_lints,
|
||||
clippy::unused_async
|
||||
)]
|
||||
pub async fn webservice(
|
||||
server_config: ServerConfig,
|
||||
) -> Result<actix_web::dev::Server, std::io::Error> {
|
||||
let host_port = format!("{}:{}", &server_config.internal_ip, &server_config.port);
|
||||
info!(
|
||||
"Running on: {}://{}/app/",
|
||||
&server_config.protocol, host_port
|
||||
);
|
||||
info!(
|
||||
"If the public url is set up correctly it should be accessible via: {}://{}/app/",
|
||||
&server_config.protocol, &server_config.public_url
|
||||
);
|
||||
|
||||
let server = HttpServer::new(move || {
|
||||
let generated = generate();
|
||||
App::new()
|
||||
.data(server_config.clone())
|
||||
.wrap(TracingLogger)
|
||||
.wrap(IdentityService::new(
|
||||
CookieIdentityPolicy::new(&[0; 32])
|
||||
.name("auth-cookie")
|
||||
.secure(true),
|
||||
))
|
||||
.service(actix_web_static_files::ResourceFiles::new(
|
||||
"/static", generated,
|
||||
))
|
||||
// directly go to the main page set the target with the environment variable.
|
||||
.route("/", web::get().to(views::redirect_empty))
|
||||
// admin block
|
||||
.service(
|
||||
web::scope("/admin")
|
||||
.route("/logout/", web::to(views::logout))
|
||||
.service(
|
||||
web::scope("/download")
|
||||
.route("/png/{redirect_id}", web::get().to(views::download_png)),
|
||||
)
|
||||
.service(
|
||||
web::scope("/json")
|
||||
.route("/list_links/", web::post().to(views::index_json))
|
||||
.route("/get_language/", web::get().to(views::get_language))
|
||||
.route("/change_language/", web::post().to(views::set_language))
|
||||
.route(
|
||||
"/create_link/",
|
||||
web::post().to(views::process_create_link_json),
|
||||
)
|
||||
.route(
|
||||
"/edit_link/",
|
||||
web::post().to(views::process_update_link_json),
|
||||
)
|
||||
.route(
|
||||
"/delete_link/",
|
||||
web::post().to(views::process_delete_link_json),
|
||||
)
|
||||
.route("/list_users/", web::post().to(views::index_users_json))
|
||||
.route(
|
||||
"/create_user/",
|
||||
web::post().to(views::process_create_user_json),
|
||||
)
|
||||
.route(
|
||||
"/update_user/",
|
||||
web::post().to(views::process_update_user_json),
|
||||
)
|
||||
.route("/update_privileges/", web::post().to(views::toggle_admin))
|
||||
.route(
|
||||
"/get_logged_user/",
|
||||
web::post().to(views::get_logged_user_json),
|
||||
)
|
||||
.route("/login_user/", web::post().to(views::process_login_json)),
|
||||
),
|
||||
)
|
||||
// Serve the Wasm App for the admin interface.
|
||||
.service(
|
||||
web::scope("/app")
|
||||
.service(Files::new("/pkg", "./app/pkg"))
|
||||
.default_service(web::get().to(views::wasm_app)),
|
||||
)
|
||||
// redirect to the url hidden behind the code
|
||||
.route("/{redirect_id}", web::get().to(views::redirect))
|
||||
})
|
||||
.bind(host_port)
|
||||
.map_err(|e| {
|
||||
error!("Failed to bind to port!");
|
||||
e
|
||||
})?
|
||||
.run();
|
||||
Ok(server)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user