2024-07-31 21:56:22 -04:00
|
|
|
#![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,
|
|
|
|
|
};
|
2024-01-21 17:15:59 -05:00
|
|
|
use tracing::info;
|
|
|
|
|
use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt};
|
2024-04-28 14:20:23 -04:00
|
|
|
mod database;
|
2024-04-28 20:23:19 -04:00
|
|
|
mod html;
|
|
|
|
|
mod macros;
|
2024-01-21 17:15:59 -05:00
|
|
|
|
2024-07-31 21:56:22 -04:00
|
|
|
pub async fn run_server() -> std::io::Result<()> {
|
2024-04-28 20:23:19 -04:00
|
|
|
let pool: PgPool = match database::establish_connection().await {
|
|
|
|
|
Ok(p) => p,
|
|
|
|
|
Err(_) => panic!("error connecting to database"),
|
|
|
|
|
};
|
2024-01-21 17:15:59 -05:00
|
|
|
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...");
|
2024-03-24 14:09:21 -04:00
|
|
|
let port = 21212_u16;
|
2024-01-21 17:15:59 -05:00
|
|
|
let addr = std::net::SocketAddr::from(([0, 0, 0, 0], port));
|
2024-04-28 20:23:19 -04:00
|
|
|
let router = html::root::get_router(pool);
|
2024-01-21 17:15:59 -05:00
|
|
|
info!("router initialized, now listening on port {}", port);
|
2024-04-28 20:23:19 -04:00
|
|
|
match axum::Server::bind(&addr)
|
2024-01-21 17:15:59 -05:00
|
|
|
.serve(router.into_make_service())
|
|
|
|
|
.await
|
2024-04-28 20:23:19 -04:00
|
|
|
{
|
|
|
|
|
Ok(p) => p,
|
|
|
|
|
Err(_) => panic!("error starting webserver"),
|
|
|
|
|
}
|
2024-01-21 17:15:59 -05:00
|
|
|
Ok(())
|
|
|
|
|
}
|
2024-07-31 21:56:22 -04:00
|
|
|
|
|
|
|
|
pub async fn run_load() -> Result<(), Box<dyn Error>> {
|
|
|
|
|
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<Postgres>) -> Result<(), Box<dyn Error>> {
|
|
|
|
|
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<Postgres>) -> Result<(), Box<dyn Error>> {
|
|
|
|
|
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(())
|
|
|
|
|
}
|