diff --git a/.env b/.env index cf1db3d..b433453 100644 --- a/.env +++ b/.env @@ -7,8 +7,10 @@ POSTGRES_DB=nocturne # backend settings GIT_WORK_DIR=../blog_posts_git -BLOG_ENDPOINT=https://github.com/Lumither/blog-posts.git LOG_ROOT_DIR=/var/log/nocturne + +BLOG_ENDPOINT=https://github.com/Lumither/blog-posts.git +WORD_DIR=~/.nocturne BACKEND_PORT=3001 # frontend settings diff --git a/backend/Cargo.toml b/backend/Cargo.toml index 5d3cbd3..1ae871b 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -1,25 +1,7 @@ -[package] -name = "backend" -version = "0.1.0" -edition = "2021" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -axum = "0.7.5" -dotenv = "0.15.0" -serde = { version = "1.0.199", features = ["derive"] } -serde_json = "1.0.116" -tokio = { version = "1.37.0", features = ["full"] } -uuid = { version = "1.8.0", features = ["v4", "fast-rng", "serde"] } -sqlx = { version = "0.7.4", features = ["runtime-tokio", "tls-native-tls", "postgres", "chrono", "uuid"] } -chrono = { version = "0.4.38", features = ["serde", "alloc"] } -regex = "1.10.4" -futures = { version = "0.3.30", features = ["executor"] } -tracing = "0.1.40" -tracing-subscriber = "0.3.18" -tracing-appender = "0.2.3" -log = "0.4.21" -sha2 = "0.10.8" -thiserror = "1.0.63" -base64 = "0.22.1" +[workspace] +resolver = "2" +members = [ + "api_server", + "constants", + "markdown" +] diff --git a/backend/api_server/Cargo.toml b/backend/api_server/Cargo.toml new file mode 100644 index 0000000..2543a40 --- /dev/null +++ b/backend/api_server/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "api_server" +version = "0.1.0" +edition = "2021" + +[dependencies] +constants = { path = "../constants" } +chrono = "0.4.38" +tracing = "0.1.40" +tracing-subscriber = "0.3.18" +tracing-appender = "0.2.3" +dotenv = "0.15.0" diff --git a/backend/api_server/src/init.rs b/backend/api_server/src/init.rs new file mode 100644 index 0000000..8785944 --- /dev/null +++ b/backend/api_server/src/init.rs @@ -0,0 +1,22 @@ +use crate::logger; +use std::env; +use tracing_appender::non_blocking::WorkerGuard; + +pub fn logger_init() -> (WorkerGuard, WorkerGuard) { + logger::init() +} + +pub fn load_env() { + if let Some(env_file) = env::args().nth(1) { + match dotenv::from_filename(&env_file) { + Ok(_) => { + println!("[info] env loaded from {}, starting up", env_file); + } + Err(e) => { + panic!("[fatal] failed to read {}: {}", env_file, e); + } + } + } else { + println!("[info] no .env file referred, starting up") + } +} diff --git a/backend/api_server/src/logger.rs b/backend/api_server/src/logger.rs new file mode 100644 index 0000000..1887753 --- /dev/null +++ b/backend/api_server/src/logger.rs @@ -0,0 +1,68 @@ +use std::{env, io}; + +use chrono::Local; +use tracing::info; +use tracing_appender::non_blocking::WorkerGuard; +use tracing_appender::{non_blocking, rolling}; +use tracing_subscriber::fmt::format::Writer; +use tracing_subscriber::fmt::time::FormatTime; +use tracing_subscriber::fmt::MakeWriter; +use tracing_subscriber::layer::SubscriberExt; +use tracing_subscriber::{fmt, Registry}; + +struct LocalTimer; + +impl FormatTime for LocalTimer { + fn format_time(&self, w: &mut Writer<'_>) -> std::fmt::Result { + write!( + w, + "{}", + Local::now().format(constants::time::DEFAULT_TIME_FORMAT) + ) + } +} + +type _LogWriter = dyn for<'writer> MakeWriter<'writer, Writer = dyn io::Write + 'static> + 'static; + +pub fn init() -> (WorkerGuard, WorkerGuard) { + let log_path = env::var("LOG_ROOT_DIR").unwrap_or_else(|e| { + panic!("[fatal] failed to load LOG_ROOT_DIR: {}", e); + }); + + let log_path = format!("{}/backend", log_path); + + let (info_log_writer, info_guard) = non_blocking(rolling::never(&log_path, "info.log")); + + let (err_log_writer, error_guard) = non_blocking(rolling::never(&log_path, "error.log")); + + let log_format = tracing_subscriber::fmt::format() + .with_level(true) + .with_target(true) + .with_source_location(true) + .with_timer(LocalTimer); + + let subscribers = Registry::default() + .with( + fmt::Layer::default() + .with_writer(info_log_writer) + .with_ansi(false), + ) + .with( + fmt::Layer::default() + .with_writer(err_log_writer) + .with_ansi(false), + ) + .with( + fmt::Layer::default() + .with_writer(io::stdout) + .with_ansi(true) + .event_format(log_format), + ); + + tracing::subscriber::set_global_default(subscribers) + .expect("[fatal] Failed to setup logging system"); + + info!("Module Started: Logger"); + + (info_guard, error_guard) +} diff --git a/backend/api_server/src/main.rs b/backend/api_server/src/main.rs new file mode 100644 index 0000000..1db4480 --- /dev/null +++ b/backend/api_server/src/main.rs @@ -0,0 +1,7 @@ +mod init; +mod logger; + +fn main() { + init::load_env(); + let _guards = init::logger_init(); +} diff --git a/backend/constants/Cargo.toml b/backend/constants/Cargo.toml new file mode 100644 index 0000000..db345c7 --- /dev/null +++ b/backend/constants/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "constants" +version = "0.1.0" +edition = "2021" + +[dependencies] diff --git a/backend/constants/src/blog.rs b/backend/constants/src/blog.rs new file mode 100644 index 0000000..f0e80e6 --- /dev/null +++ b/backend/constants/src/blog.rs @@ -0,0 +1 @@ +pub const PAGE_SIZE: u32 = 6; diff --git a/backend/constants/src/lib.rs b/backend/constants/src/lib.rs new file mode 100644 index 0000000..f5cd248 --- /dev/null +++ b/backend/constants/src/lib.rs @@ -0,0 +1,2 @@ +pub mod blog; +pub mod time; diff --git a/backend/constants/src/time.rs b/backend/constants/src/time.rs new file mode 100644 index 0000000..89e7f55 --- /dev/null +++ b/backend/constants/src/time.rs @@ -0,0 +1 @@ +pub const DEFAULT_TIME_FORMAT: &str = "%Y-%m-%dT%H:%M:%S%z"; diff --git a/backend/legacy/Cargo.toml b/backend/legacy/Cargo.toml new file mode 100644 index 0000000..5d3cbd3 --- /dev/null +++ b/backend/legacy/Cargo.toml @@ -0,0 +1,25 @@ +[package] +name = "backend" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +axum = "0.7.5" +dotenv = "0.15.0" +serde = { version = "1.0.199", features = ["derive"] } +serde_json = "1.0.116" +tokio = { version = "1.37.0", features = ["full"] } +uuid = { version = "1.8.0", features = ["v4", "fast-rng", "serde"] } +sqlx = { version = "0.7.4", features = ["runtime-tokio", "tls-native-tls", "postgres", "chrono", "uuid"] } +chrono = { version = "0.4.38", features = ["serde", "alloc"] } +regex = "1.10.4" +futures = { version = "0.3.30", features = ["executor"] } +tracing = "0.1.40" +tracing-subscriber = "0.3.18" +tracing-appender = "0.2.3" +log = "0.4.21" +sha2 = "0.10.8" +thiserror = "1.0.63" +base64 = "0.22.1" diff --git a/backend/src/api/get/get_page_count.rs b/backend/legacy/src/api/get/get_page_count.rs similarity index 100% rename from backend/src/api/get/get_page_count.rs rename to backend/legacy/src/api/get/get_page_count.rs diff --git a/backend/src/api/get/get_post.rs b/backend/legacy/src/api/get/get_post.rs similarity index 100% rename from backend/src/api/get/get_post.rs rename to backend/legacy/src/api/get/get_post.rs diff --git a/backend/src/api/get/get_post_list.rs b/backend/legacy/src/api/get/get_post_list.rs similarity index 100% rename from backend/src/api/get/get_post_list.rs rename to backend/legacy/src/api/get/get_post_list.rs diff --git a/backend/src/api/get/mod.rs b/backend/legacy/src/api/get/mod.rs similarity index 100% rename from backend/src/api/get/mod.rs rename to backend/legacy/src/api/get/mod.rs diff --git a/backend/src/api/mod.rs b/backend/legacy/src/api/mod.rs similarity index 100% rename from backend/src/api/mod.rs rename to backend/legacy/src/api/mod.rs diff --git a/backend/src/api/post/errors/mod.rs b/backend/legacy/src/api/post/errors/mod.rs similarity index 100% rename from backend/src/api/post/errors/mod.rs rename to backend/legacy/src/api/post/errors/mod.rs diff --git a/backend/src/api/post/errors/refresh.rs b/backend/legacy/src/api/post/errors/refresh.rs similarity index 100% rename from backend/src/api/post/errors/refresh.rs rename to backend/legacy/src/api/post/errors/refresh.rs diff --git a/backend/src/api/post/mod.rs b/backend/legacy/src/api/post/mod.rs similarity index 100% rename from backend/src/api/post/mod.rs rename to backend/legacy/src/api/post/mod.rs diff --git a/backend/src/api/post/refresh.rs b/backend/legacy/src/api/post/refresh.rs similarity index 100% rename from backend/src/api/post/refresh.rs rename to backend/legacy/src/api/post/refresh.rs diff --git a/backend/src/api/post/utils/build_post_idx.rs b/backend/legacy/src/api/post/utils/build_post_idx.rs similarity index 100% rename from backend/src/api/post/utils/build_post_idx.rs rename to backend/legacy/src/api/post/utils/build_post_idx.rs diff --git a/backend/src/api/post/utils/mod.rs b/backend/legacy/src/api/post/utils/mod.rs similarity index 100% rename from backend/src/api/post/utils/mod.rs rename to backend/legacy/src/api/post/utils/mod.rs diff --git a/backend/src/api/post/utils/post.rs b/backend/legacy/src/api/post/utils/post.rs similarity index 100% rename from backend/src/api/post/utils/post.rs rename to backend/legacy/src/api/post/utils/post.rs diff --git a/backend/src/constants.rs b/backend/legacy/src/constants.rs similarity index 100% rename from backend/src/constants.rs rename to backend/legacy/src/constants.rs diff --git a/backend/src/logger.rs b/backend/legacy/src/logger.rs similarity index 100% rename from backend/src/logger.rs rename to backend/legacy/src/logger.rs diff --git a/backend/src/main.rs b/backend/legacy/src/main.rs similarity index 81% rename from backend/src/main.rs rename to backend/legacy/src/main.rs index eaf806d..7fef8f3 100644 --- a/backend/src/main.rs +++ b/backend/legacy/src/main.rs @@ -4,13 +4,12 @@ use std::num::ParseIntError; use std::process::exit; use std::str::FromStr; -use crate::api::get::get_page_count::get_page_count; -use crate::api::get::get_post::get_post; -use crate::api::get::get_post_list::get_post_list; -use crate::api::post::refresh::refresh; +use crate::api::{ + get::{get_page_count::get_page_count, get_post::get_post, get_post_list::get_post_list}, + post::refresh::refresh, +}; use axum::routing::{get, post}; use axum::Router; -use dotenv::dotenv; use sqlx::postgres::{PgConnectOptions, PgPoolOptions}; use sqlx::ConnectOptions; use tracing::{error, info, warn}; @@ -26,21 +25,15 @@ async fn main() -> Result<(), Box> { if let Some(env_file) = env::args().nth(1) { match dotenv::from_filename(&env_file) { Ok(_) => { - println!("[Info] env loaded from {}", env_file); + println!("[Info] env loaded from {}, starting up", env_file); } Err(e) => { panic!("[Fatal] failed to read {}: {}", env_file, e); } } - }; - match dotenv() { - Ok(_) => { - println!("[Info] env loaded from .env file, starting up...") - } - Err(_) => { - println!("[Info] .env not detected, starting up...") - } - }; + } else { + println!("[info] no .env file referred, starting up") + } let _guards = logger::init(); @@ -52,7 +45,7 @@ async fn main() -> Result<(), Box> { Err(_) => 3001, }; - let db_connect_option = PgConnectOptions::from_str(dbg!(&parse_db_uri())) + let db_connect_option = PgConnectOptions::from_str(&parse_db_uri()) .unwrap() .disable_statement_logging(); diff --git a/backend/src/markdown/meta.rs b/backend/legacy/src/markdown/meta.rs similarity index 100% rename from backend/src/markdown/meta.rs rename to backend/legacy/src/markdown/meta.rs diff --git a/backend/src/markdown/mod.rs b/backend/legacy/src/markdown/mod.rs similarity index 100% rename from backend/src/markdown/mod.rs rename to backend/legacy/src/markdown/mod.rs diff --git a/backend/src/model/blog/hash.sql b/backend/legacy/src/model/blog/hash.sql similarity index 100% rename from backend/src/model/blog/hash.sql rename to backend/legacy/src/model/blog/hash.sql diff --git a/backend/src/model/blog/meta.sql b/backend/legacy/src/model/blog/meta.sql similarity index 100% rename from backend/src/model/blog/meta.sql rename to backend/legacy/src/model/blog/meta.sql diff --git a/backend/src/model/blog/mod.rs b/backend/legacy/src/model/blog/mod.rs similarity index 100% rename from backend/src/model/blog/mod.rs rename to backend/legacy/src/model/blog/mod.rs diff --git a/backend/src/model/blog/post.sql b/backend/legacy/src/model/blog/post.sql similarity index 100% rename from backend/src/model/blog/post.sql rename to backend/legacy/src/model/blog/post.sql diff --git a/backend/src/model/blog/tag.sql b/backend/legacy/src/model/blog/tag.sql similarity index 100% rename from backend/src/model/blog/tag.sql rename to backend/legacy/src/model/blog/tag.sql diff --git a/backend/src/model/mod.rs b/backend/legacy/src/model/mod.rs similarity index 100% rename from backend/src/model/mod.rs rename to backend/legacy/src/model/mod.rs diff --git a/backend/markdown/Cargo.toml b/backend/markdown/Cargo.toml new file mode 100644 index 0000000..6f30a74 --- /dev/null +++ b/backend/markdown/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "markdown" +version = "0.1.0" +edition = "2021" + +[dependencies] diff --git a/backend/markdown/src/lib.rs b/backend/markdown/src/lib.rs new file mode 100644 index 0000000..b93cf3f --- /dev/null +++ b/backend/markdown/src/lib.rs @@ -0,0 +1,14 @@ +pub fn add(left: u64, right: u64) -> u64 { + left + right +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn it_works() { + let result = add(2, 2); + assert_eq!(result, 4); + } +}