Pour tout problème contactez-nous par mail : support@froggit.fr | La FAQ :grey_question: | Rejoignez-nous sur le Chat :speech_balloon:

Skip to content
Snippets Groups Projects
main.rs 3.29 KiB
Newer Older
peterrabbit's avatar
peterrabbit committed
mod static_files;
peterrabbit's avatar
peterrabbit committed
mod website;
use actix_web::{get, App, HttpResponse, HttpServer, Responder};
peterrabbit's avatar
peterrabbit committed
use static_files::StaticFilesManager;
peterrabbit's avatar
peterrabbit committed
use std::path::PathBuf;
peterrabbit's avatar
peterrabbit committed
use website::WebSite;

fn load_website_template() -> WebSite {
    let site_template_path = std::env::current_dir()
        .unwrap()
        .join("templates")
        .join("new_website.json");
    let site_template = std::fs::read_to_string(site_template_path).unwrap();
peterrabbit's avatar
peterrabbit committed
    WebSite::from_json_str(&site_template)
peterrabbit's avatar
peterrabbit committed
}
peterrabbit's avatar
peterrabbit committed

#[get("/{pth:.*}")]
peterrabbit's avatar
peterrabbit committed
async fn page(
    website: actix_web::web::Data<WebSite>,
peterrabbit's avatar
peterrabbit committed
    pth: actix_web::web::Path<PathBuf>,
peterrabbit's avatar
peterrabbit committed
) -> impl Responder {
peterrabbit's avatar
peterrabbit committed
    let pth = pth.into_inner();
peterrabbit's avatar
peterrabbit committed
    match website.get_page_by_url(&pth) {
peterrabbit's avatar
peterrabbit committed
        Some(page) => HttpResponse::Ok().body(page.html_doc.to_string()),
        None => HttpResponse::NotFound().body(format!("Not found {}", pth.display())),
peterrabbit's avatar
peterrabbit committed
    }
}

#[get("/admin/dashboard")]
async fn admin_dashboard() -> impl Responder {
    HttpResponse::Ok().body("Admin")
}

#[get("/admin/login")]
async fn admin_login() -> impl Responder {
    HttpResponse::Ok().body("Login")
peterrabbit's avatar
peterrabbit committed
}

#[actix_web::main]
async fn main() -> std::io::Result<()> {
peterrabbit's avatar
peterrabbit committed
    let website = load_website_template();
peterrabbit's avatar
peterrabbit committed
    let site_name = "rust_cms".to_string(); // Get from arg
    let mut static_files_manager = StaticFilesManager::new(&site_name).unwrap();
    static_files_manager.build_index().unwrap();
    // GET HOST AND CERTS DIR FROM CLI ARGUMENT
    // Get port from arg, or get context from arg and define default port, or set default port to standard

peterrabbit's avatar
peterrabbit committed
    // LOAD A WEBSITE SCHEMA (JSON) FROM CLI ARGUMENT PATH OR search in /var/{sitename} and load it CREATE A NEW ONE
    // create pages resources with templates and the contents from the json file
    // Save the resources in an appstate

peterrabbit's avatar
peterrabbit committed
    // create the static dir in standard location if doesn't exist (like /var/{sitename}/static)
    // create the static files index (like Arc<Mutex<StaticFilesIndex>>)

    let host = "localhost";
peterrabbit's avatar
peterrabbit committed
    let certs_dir = PathBuf::from("/etc/letsencrypt/live").join(host);
    let cert_file =
        &mut std::io::BufReader::new(std::fs::File::open(certs_dir.join("fullchain.pem")).unwrap());
    let key_file =
        &mut std::io::BufReader::new(std::fs::File::open(certs_dir.join("privkey.pem")).unwrap());

    let cert = rustls::Certificate(rustls_pemfile::certs(cert_file).unwrap().remove(0).to_vec());
    let key = rustls::PrivateKey(
        rustls_pemfile::pkcs8_private_keys(key_file)
            .unwrap()
            .remove(0)
            .to_vec(),
    );

    let srv_conf = rustls::ServerConfig::builder()
        .with_safe_defaults()
        .with_no_client_auth()
        .with_single_cert(vec![cert], key)
        .expect("bad certificate/key");

peterrabbit's avatar
peterrabbit committed
    let static_files_manager =
        actix_web::web::Data::new(std::sync::Mutex::new(static_files_manager));

peterrabbit's avatar
peterrabbit committed
    HttpServer::new(move || {
        App::new()
            .wrap(actix_web::middleware::Logger::default())
peterrabbit's avatar
peterrabbit committed
            .wrap(actix_web::middleware::Compress::default())
            .app_data(actix_web::web::Data::new(website.clone()))
peterrabbit's avatar
peterrabbit committed
            .app_data(actix_web::web::Data::clone(&static_files_manager))
            .service(admin_dashboard)
            .service(admin_login)
            .service(page)
peterrabbit's avatar
peterrabbit committed
    })
    .bind("127.0.0.1:8080")?
    .bind_rustls("127.0.0.1:8443", srv_conf)?
peterrabbit's avatar
peterrabbit committed
    .run()
    .await