mitsuba 1.10.0

Lightweight 4chan board archive software (like Foolfuuka), in Rust
#[allow(unused_imports)]
use log::{info, warn, error, debug};

use actix_web::{web, App, HttpServer, middleware::NormalizePath};
use tokio::fs::create_dir_all;

use crate::db::DBClient;
use crate::object_storage::ObjectStorage;

mod api;
mod frontend;

pub async fn web_main() -> std::io::Result<()> {
    let handlebars = frontend::build_handlebars();

    let handlebars_ref = web::Data::new(handlebars);
    let data_folder_str = std::env::var("DATA_ROOT").unwrap_or("data".to_string());
    let image_folder = format!("{}/images", data_folder_str);
    let port = std::env::var("WEB_PORT").unwrap_or("8080".to_string());
    let ip = std::env::var("WEB_IP").unwrap_or("0.0.0.0".to_string());
    info!("Web adress: {}:{}", ip, port);
    create_dir_all(std::path::Path::new(&image_folder)).await.ok();
    let dbc = DBClient::new().await;
    HttpServer::new(move || {
        let obc = ObjectStorage::new();
        let mut app = App::new()
        .data(dbc.clone())
        .app_data(handlebars_ref.clone())
        .wrap(NormalizePath::default())
        .service(api::get_index)
        .service(api::get_thread)
        .service(api::get_post)
        .service(frontend::thread_page)
        .service(frontend::index_page_handler)
        .service(frontend::board_page)
        .service(api::get_boards_status)
        .service(frontend::home_page)
        .service(web::resource("/static/{_:.*}").route(web::get().to(frontend::dist)));

        if obc.enabled {
            app = app.service(web::resource("/img/{_:.*}").route(web::get().to(api::get_file_object_storage_handler)))
                    .data(obc)
                    .service(api::get_full_image_object_storage)
                    .service(api::get_thumbnail_image_object_storage);
        } else {
            app = app.service(actix_files::Files::new("/img", image_folder.clone()))
                .service(api::get_thumbnail_image)
                .service(api::get_full_image);
        }
        app
    })
    .bind(format!("{}:{}", ip, port))?
    .run()
    .await
}