#![allow(async_fn_in_trait)] use crate::database::{article::Article, page::Page, PsqlData}; use sqlx::{PgPool, Pool, Postgres}; use std::error::Error; use std::{ fs::{self, metadata}, path::PathBuf, }; use tracing::info; use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt}; mod database; mod html; mod macros; pub async fn run_server() -> std::io::Result<()> { let pool: PgPool = match database::establish_connection().await { Ok(p) => p, Err(_) => panic!("error connecting to database"), }; tracing_subscriber::registry() .with( tracing_subscriber::EnvFilter::try_from_default_env() .unwrap_or_else(|_| "achubb_backend".into()), ) .with(tracing_subscriber::fmt::layer()) .init(); info!("initializing router..."); let port = 21212_u16; let addr = std::net::SocketAddr::from(([0, 0, 0, 0], port)); let router = html::root::get_router(pool); info!("router initialized, now listening on port {}", port); match axum::Server::bind(&addr) .serve(router.into_make_service()) .await { Ok(p) => p, Err(_) => panic!("error starting webserver"), } Ok(()) } pub async fn run_load() -> Result<(), Box> { let pool: PgPool = match database::establish_connection().await { Ok(p) => p, Err(_) => panic!("error connecting to database"), }; load_articles(&pool).await?; load_pages(&pool).await?; Ok(()) } async fn load_articles(pool: &Pool) -> Result<(), Box> { let paths = fs::read_dir("blog/").unwrap(); for path_entry in paths { let path: PathBuf = path_entry.unwrap().path(); let metadata = metadata(path.clone()).unwrap(); if metadata.is_file() { let mut article: Article = Article::from_file(path); match Article::read_by_reference(pool, &article.reference).await { Ok(art) => { article.id = art.id; article.update(pool).await? } Err(_) => article.insert(pool).await?, } } } Ok(()) } async fn load_pages(pool: &Pool) -> Result<(), Box> { let paths = fs::read_dir("pages/").unwrap(); for path_entry in paths { let path: PathBuf = path_entry.unwrap().path(); let metadata = metadata(path.clone()).unwrap(); if metadata.is_file() { let mut page: Page = Page::from_file(path); match Page::read_by_reference(pool, &page.reference).await { Ok(proj) => { page.id = proj.id; page.update(pool).await? } Err(_) => page.insert(pool).await?, } } } Ok(()) }