From 3e2353bc02b47803c400bf72afb15e6efccc99ae Mon Sep 17 00:00:00 2001 From: Chris Cochrun Date: Thu, 7 Nov 2024 14:21:55 -0600 Subject: [PATCH] updating to using actix for all things --- Cargo.lock | 219 ++++++++++++++++++++++++++++++++--- Cargo.toml | 4 + assets/css/compiled/main.css | 20 +--- src/main.rs | 71 +++++------- 4 files changed, 240 insertions(+), 74 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 54cfd20..b861650 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8,7 +8,7 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "617a8268e3537fe1d8c9ead925fca49ef6400927ee7bc26750e90ecee14ce4b8" dependencies = [ - "bitflags", + "bitflags 1.3.2", "bytes", "futures-core", "futures-sink", @@ -34,6 +34,29 @@ dependencies = [ "smallvec", ] +[[package]] +name = "actix-files" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0773d59061dedb49a8aed04c67291b9d8cf2fe0b60130a381aab53c6dd86e9be" +dependencies = [ + "actix-http", + "actix-service", + "actix-utils", + "actix-web", + "bitflags 2.6.0", + "bytes", + "derive_more", + "futures-core", + "http-range", + "log", + "mime", + "mime_guess", + "percent-encoding", + "pin-project-lite", + "v_htmlescape", +] + [[package]] name = "actix-http" version = "3.3.1" @@ -46,7 +69,7 @@ dependencies = [ "actix-utils", "ahash 0.8.7", "base64", - "bitflags", + "bitflags 1.3.2", "brotli", "bytes", "bytestring", @@ -449,6 +472,12 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "bitflags" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" + [[package]] name = "block-buffer" version = "0.10.4" @@ -612,6 +641,15 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "crossbeam-channel" +version = "0.5.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "crossbeam-utils" version = "0.8.18" @@ -1052,6 +1090,12 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "http-range" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21dec9db110f5f872ed9699c3ecf50cf16f423502706ba5c72462e28d3157573" + [[package]] name = "httparse" version = "1.8.0" @@ -1383,6 +1427,15 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" +[[package]] +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata 0.1.10", +] + [[package]] name = "maud" version = "0.26.0" @@ -1484,6 +1537,16 @@ dependencies = [ "minimal-lexical", ] +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + [[package]] name = "num-traits" version = "0.2.19" @@ -1503,6 +1566,15 @@ dependencies = [ "libc", ] +[[package]] +name = "num_threads" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" +dependencies = [ + "libc", +] + [[package]] name = "once_cell" version = "1.19.0" @@ -1515,7 +1587,7 @@ version = "0.10.52" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "01b8574602df80f7b85fdfc5392fa884a4e3b3f4f35402c070ab34c3d3f78d56" dependencies = [ - "bitflags", + "bitflags 1.3.2", "cfg-if", "foreign-types", "libc", @@ -1562,6 +1634,12 @@ dependencies = [ "num-traits", ] +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + [[package]] name = "parking" version = "2.1.0" @@ -1634,7 +1712,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4b2d323e8ca7996b3e23126511a523f7e62924d93ecd5ae73b333815b0eb3dce" dependencies = [ "autocfg", - "bitflags", + "bitflags 1.3.2", "cfg-if", "concurrent-queue", "libc", @@ -1741,7 +1819,7 @@ version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" dependencies = [ - "bitflags", + "bitflags 1.3.2", ] [[package]] @@ -1750,7 +1828,7 @@ version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" dependencies = [ - "bitflags", + "bitflags 1.3.2", ] [[package]] @@ -1761,8 +1839,17 @@ checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" dependencies = [ "aho-corasick", "memchr", - "regex-automata", - "regex-syntax", + "regex-automata 0.4.3", + "regex-syntax 0.8.2", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax 0.6.29", ] [[package]] @@ -1773,9 +1860,15 @@ checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" dependencies = [ "aho-corasick", "memchr", - "regex-syntax", + "regex-syntax 0.8.2", ] +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + [[package]] name = "regex-syntax" version = "0.8.2" @@ -1835,7 +1928,7 @@ version = "0.37.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "acf8729d8542766f1b2cf77eb034d52f40d375bb8b615d0b147089946e16613d" dependencies = [ - "bitflags", + "bitflags 1.3.2", "errno", "io-lifetimes", "libc", @@ -1880,7 +1973,7 @@ version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fc758eb7bffce5b308734e9b0c1468893cae9ff70ebf13e7090be8dcbcc83a8" dependencies = [ - "bitflags", + "bitflags 1.3.2", "core-foundation", "core-foundation-sys", "libc", @@ -1989,6 +2082,15 @@ dependencies = [ "digest", ] +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + [[package]] name = "signal-hook-registry" version = "1.4.1" @@ -2101,6 +2203,7 @@ name = "tfcapi" version = "0.1.0" dependencies = [ "actix-cors", + "actix-files", "actix-multipart", "actix-rt", "actix-web", @@ -2117,6 +2220,9 @@ dependencies = [ "sanitize-filename", "serde", "serde_json", + "tracing", + "tracing-appender", + "tracing-subscriber", "uuid", ] @@ -2150,6 +2256,16 @@ dependencies = [ "winapi", ] +[[package]] +name = "thread_local" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +dependencies = [ + "cfg-if", + "once_cell", +] + [[package]] name = "time" version = "0.3.21" @@ -2157,6 +2273,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f3403384eaacbca9923fa06940178ac13e4edb725486d70e8e15881d0c836cc" dependencies = [ "itoa", + "libc", + "num_threads", "serde", "time-core", "time-macros", @@ -2241,23 +2359,78 @@ checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" [[package]] name = "tracing" -version = "0.1.37" +version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ - "cfg-if", "log", "pin-project-lite", + "tracing-attributes", "tracing-core", ] [[package]] -name = "tracing-core" -version = "0.1.31" +name = "tracing-appender" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" +checksum = "3566e8ce28cc0a3fe42519fc80e6b4c943cc4c8cef275620eb8dac2d3d4e06cf" +dependencies = [ + "crossbeam-channel", + "thiserror", + "time", + "tracing-subscriber", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.43", +] + +[[package]] +name = "tracing-core" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" dependencies = [ "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" +dependencies = [ + "chrono", + "matchers", + "nu-ansi-term", + "once_cell", + "regex", + "sharded-slab", + "smallvec", + "thread_local", + "time", + "tracing", + "tracing-core", + "tracing-log", ] [[package]] @@ -2343,6 +2516,18 @@ version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e395fcf16a7a3d8127ec99782007af141946b4795001f876d54fb0d55978560" +[[package]] +name = "v_htmlescape" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e8257fbc510f0a46eb602c10215901938b5c2a7d5e70fc11483b1d3c9b5b18c" + +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + [[package]] name = "value-bag" version = "1.4.3" diff --git a/Cargo.toml b/Cargo.toml index df070a0..e659460 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -24,3 +24,7 @@ markup = "0.15.0" maud = { version = "0.26.0", features = ["actix-web"] } log4rs = "1.3.0" actix-cors = "0.7.0" +tracing = "0.1.40" +tracing-subscriber = { version = "0.3.18", features = ["fmt", "std", "chrono", "time", "local-time", "env-filter"] } +tracing-appender = "0.2.3" +actix-files = "0.6.6" diff --git a/assets/css/compiled/main.css b/assets/css/compiled/main.css index 791988c..9907588 100644 --- a/assets/css/compiled/main.css +++ b/assets/css/compiled/main.css @@ -1824,6 +1824,10 @@ select { margin-right: 1rem; } +.ml-2 { + margin-left: 0.5rem; +} + .-mr-2 { margin-right: -0.5rem; } @@ -1900,10 +1904,6 @@ select { margin-bottom: -0.25rem; } -.ml-2 { - margin-left: 0.5rem; -} - .-mr-\[100\%\] { margin-right: -100%; } @@ -1940,10 +1940,6 @@ select { margin-top: -2px; } -.ml-4 { - margin-left: 1rem; -} - .box-content { box-sizing: content-box; } @@ -5392,10 +5388,6 @@ pre { max-width: 65ch; } - .sm\:basis-full { - flex-basis: 100%; - } - .sm\:grid-cols-1 { grid-template-columns: repeat(1, minmax(0, 1fr)); } @@ -5510,10 +5502,6 @@ pre { flex-basis: 25%; } - .md\:basis-full { - flex-basis: 100%; - } - .md\:grid-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); } diff --git a/src/main.rs b/src/main.rs index 1a77a07..cc75864 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,6 @@ mod api; -use actix_cors::Cors; +use actix_files::Files; use actix_multipart::form::tempfile::TempFileConfig; use actix_web::{middleware, App, HttpServer}; use api::camp_form::camp_form; @@ -10,58 +10,47 @@ use api::local_trip_form::local_form; use api::mt_form::mt_form; use api::parent_form::parent_form; use api::teacher_form::teacher_form; -use log::LevelFilter; -use log4rs::append::console::ConsoleAppender; -use log4rs::append::file::FileAppender; -use log4rs::config::{Appender, Root}; -use log4rs::encode::pattern::PatternEncoder; -use log4rs::Config; +use tracing::info; +use tracing::level_filters::LevelFilter; +use tracing_subscriber::{layer::SubscriberExt, EnvFilter, Layer}; #[actix_web::main] async fn main() -> std::io::Result<()> { - // env_logger::init_from_env(env_logger::Env::new().default_filter_or("info")); - let stdout = ConsoleAppender::builder() - .encoder(Box::new(PatternEncoder::new( - "{d(%Y-%m-%d %H:%M:%S)} {h({l})} - {m}\n", - ))) - .build(); - let logfile = FileAppender::builder() - .encoder(Box::new(PatternEncoder::new( - "{d(%Y-%m-%d %H:%M:%S)} {h({l})} - {m}\n", - ))) - .build("./tmp/api.log")?; + let timer = + tracing_subscriber::fmt::time::ChronoLocal::new("%Y-%m-%d_%I:%M:%S%.6f %P".to_owned()); + let logfile = tracing_appender::rolling::daily("./tmp", "api.log"); - let config = Config::builder() - .appender(Appender::builder().build("stdout", Box::new(stdout))) - .appender(Appender::builder().build("logfile", Box::new(logfile))) - .build( - Root::builder() - .appenders(vec!["logfile", "stdout"]) - .build(LevelFilter::Info), - ) - .unwrap(); + let filter = EnvFilter::builder() + .with_default_directive(LevelFilter::WARN.into()) + .parse_lossy("tfcapi=debug"); + let logfile_layer = tracing_subscriber::fmt::layer() + .pretty() + .with_writer(logfile) + .with_line_number(true) + .with_level(true) + .with_target(true) + .with_timer(timer.clone()); + let stdout_layer = tracing_subscriber::fmt::layer() + .pretty() + .with_line_number(true) + .with_target(true) + .with_timer(timer) + .with_filter(filter); + let filter = EnvFilter::builder() + .with_default_directive(LevelFilter::WARN.into()) + .parse_lossy("tfcapi=debug"); + tracing_subscriber::registry().with(logfile_layer.with_filter(filter).and_then(stdout_layer)); - let _handle = log4rs::init_config(config).expect("error setting up logger"); - - log::info!("creating temporary upload directory"); + info!("creating temporary upload directory"); std::fs::create_dir_all("./tmp")?; - log::info!("starting HTTP server at http://localhost:4242"); + info!("starting HTTP server at http://localhost:4242"); HttpServer::new(|| { - // let cors = Cors::default() - // .send_wildcard() - // .allowed_origin("https://tfcconnection.org") - // .allowed_origin("http://localhost:1313") - // .allowed_origin("http://127.0.0.1:1313") - // .allow_any_origin() - // .allow_any_method() - // .allow_any_header() - // .max_age(3600); - App::new() .wrap(middleware::Logger::default()) .app_data(TempFileConfig::default().directory("./tmp")) + .service(Files::new("/", "./public").show_files_listing()) .service(mt_form) .service(health_form) .service(parent_form)