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
website.rs 6.32 KiB
Newer Older
Pierre Jarriges's avatar
Pierre Jarriges committed
use crate::website::{Page, PageTemplate, WebSite};
Pierre Jarriges's avatar
Pierre Jarriges committed
use crate::AppState;
Pierre Jarriges's avatar
Pierre Jarriges committed
use actix_web::{
Pierre Jarriges's avatar
Pierre Jarriges committed
    delete, get, post, put,
Pierre Jarriges's avatar
Pierre Jarriges committed
    web::{Data, Json},
    HttpResponse,
};
use std::sync::RwLock;

#[derive(serde::Deserialize, Clone)]
pub struct AddPageData {
    parent_page_id: usize,
    new_page: Page,
}

#[post("/add-page")]
pub async fn add_page(
Pierre Jarriges's avatar
Pierre Jarriges committed
    app_state: Data<RwLock<AppState>>,
Pierre Jarriges's avatar
Pierre Jarriges committed
    website: Data<RwLock<WebSite>>,
    add_page_data: Json<AddPageData>,
) -> HttpResponse {
    let add_page_data = add_page_data.into_inner();
Pierre Jarriges's avatar
Pierre Jarriges committed
    let mut website = website
Pierre Jarriges's avatar
Pierre Jarriges committed
        .write()
Pierre Jarriges's avatar
Pierre Jarriges committed
        .expect("Couldn't acquire website write lock");

    match website.add_page(add_page_data.parent_page_id, add_page_data.new_page.clone()) {
        Ok(()) => {
            if let Err(msg) = website.build() {
                return HttpResponse::InternalServerError()
                    .body(format!("Error rebuilding Website - {}", msg));
            }

Pierre Jarriges's avatar
Pierre Jarriges committed
            if let Err(msg) =
                website.save(&app_state.read().expect("Couldn't read AppState").config)
            {
                return HttpResponse::InternalServerError()
                    .body(format!("Error saving website to static file - {}", msg));
            };
Pierre Jarriges's avatar
Pierre Jarriges committed
            HttpResponse::Created().finish()
        }
Pierre Jarriges's avatar
Pierre Jarriges committed
        Err(msg) => {
            HttpResponse::BadRequest().body(format!("Error adding new page to website - {}", msg))
        }
    }
}

#[get("/page-data/{id}")]
pub async fn get_page_data(
    website: Data<RwLock<WebSite>>,
    id: actix_web::web::Path<usize>,
) -> HttpResponse {
    let id = id.into_inner();
    match website
        .read()
        .expect("Couldn't acquire website read lock")
        .get_page(id)
    {
        Some(page) => HttpResponse::Ok().json(page),
        None => HttpResponse::NotFound().body(format!("Page with id {} was not found", id)),
    }
}

#[put("/update-page/{id}")]
pub async fn update_page(
    id: actix_web::web::Path<usize>,
Pierre Jarriges's avatar
Pierre Jarriges committed
    app_state: Data<RwLock<AppState>>,
Pierre Jarriges's avatar
Pierre Jarriges committed
    website: Data<RwLock<WebSite>>,
    updated_page: Json<Page>,
) -> HttpResponse {
    let id = id.into_inner();
    let mut website = website
        .write()
        .expect("Couldn't acquire website write lock");
Pierre Jarriges's avatar
Pierre Jarriges committed
    let page = {
        match website.update_page(id, updated_page.into_inner()) {
Pierre Jarriges's avatar
Pierre Jarriges committed
            Ok(page) => page.clone(),
            Err(msg) => {
                return HttpResponse::BadRequest()
                    .body(format!("Error updating page with id {} - {:?}", id, msg));
            }
Pierre Jarriges's avatar
Pierre Jarriges committed
        }
    if let Err(msg) = website.build() {
        return HttpResponse::InternalServerError()
            .body(format!("Error rebuilding Website - {}", msg));
    }

    if let Err(msg) = website.save(&app_state.read().expect("Couldn't read AppState").config) {
Pierre Jarriges's avatar
Pierre Jarriges committed
        return HttpResponse::InternalServerError()
            .body(format!("Error saving website to static file - {}", msg));
    };

    HttpResponse::Ok().json(page)
Pierre Jarriges's avatar
Pierre Jarriges committed
}
Pierre Jarriges's avatar
Pierre Jarriges committed

#[post("/add-template")]
pub async fn add_template(
Pierre Jarriges's avatar
Pierre Jarriges committed
    app_state: Data<RwLock<AppState>>,
Pierre Jarriges's avatar
Pierre Jarriges committed
    website: Data<RwLock<WebSite>>,
    new_template: Json<PageTemplate>,
) -> HttpResponse {
Pierre Jarriges's avatar
Pierre Jarriges committed
    let template = {
        match website
            .write()
            .expect("Couldn't acquire website write lock")
            .add_template(new_template.into_inner())
        {
            Ok(template) => template.clone(),
            Err(msg) => {
                return HttpResponse::BadRequest()
                    .body(format!("Error adding new template {}", msg))
            }
        }
    };

    if let Err(msg) = website
        .read()
        .expect("Couldn't read WebSite")
        .save(&app_state.read().expect("Couldn't read AppState").config)
Pierre Jarriges's avatar
Pierre Jarriges committed
        return HttpResponse::InternalServerError()
            .body(format!("Error saving website to static file - {}", msg));
    };

    HttpResponse::Created().json(template)
Pierre Jarriges's avatar
Pierre Jarriges committed
#[put("/update-template")]
Pierre Jarriges's avatar
Pierre Jarriges committed
pub async fn update_template(
Pierre Jarriges's avatar
Pierre Jarriges committed
    app_state: Data<RwLock<AppState>>,
Pierre Jarriges's avatar
Pierre Jarriges committed
    website: Data<RwLock<WebSite>>,
    updated_template: Json<PageTemplate>,
) -> HttpResponse {
    let mut website = website
        .write()
        .expect("Couldn't acquire website write lock");

Pierre Jarriges's avatar
Pierre Jarriges committed
    let updated = {
        match website.update_template(updated_template.into_inner()) {
Pierre Jarriges's avatar
Pierre Jarriges committed
            Ok(template) => template.clone(),
            Err(msg) => {
                return HttpResponse::BadRequest().body(format!("Error updating template {}", msg))
            }
        }
    };

    WebSite::update_page_rec_after_template_update(&mut website.root_page, &updated);
    if let Err(msg) = website.build() {
        return HttpResponse::InternalServerError()
            .body(format!("Error rebuilding Website - {}", msg));
    }

    if let Err(msg) = website.save(&app_state.read().expect("Couldn't read AppState").config) {
Pierre Jarriges's avatar
Pierre Jarriges committed
        return HttpResponse::InternalServerError()
            .body(format!("Error saving website to static file - {}", msg));
    };

Pierre Jarriges's avatar
Pierre Jarriges committed
    HttpResponse::Ok().json(updated)
}
Pierre Jarriges's avatar
Pierre Jarriges committed

#[delete("/remove-page/{id}")]
pub async fn remove_page(
    id: actix_web::web::Path<usize>,
    app_state: Data<RwLock<AppState>>,
    website: Data<RwLock<WebSite>>,
) -> HttpResponse {
    let mut website = website
        .write()
        .expect("Couldn't acquire website write lock");
Pierre Jarriges's avatar
Pierre Jarriges committed

Pierre Jarriges's avatar
Pierre Jarriges committed
    match website.remove_page(id.into_inner()) {
        Ok(()) => {
            website
                .save(&app_state.read().expect("Couldn't read AppState").config)
                .expect("Error saving website to static file");
            HttpResponse::Accepted().finish()
        }
        Err(msg) => HttpResponse::BadRequest().body(msg),
    }
}
Pierre Jarriges's avatar
Pierre Jarriges committed

#[delete("remove-template/{name}")]
pub async fn remove_template(
    name: actix_web::web::Path<String>,
    app_state: Data<RwLock<AppState>>,
    website: Data<RwLock<WebSite>>,
) -> HttpResponse {
    let mut website = website
        .write()
        .expect("Couldn't acquire website write lock");

    match website.remove_template(name.into_inner()) {
        Ok(()) => {
            if let Err(msg) =
                website.save(&app_state.read().expect("Couldn't read AppState").config)
            {
                return HttpResponse::InternalServerError()
                    .body(format!("Error saving website to static file {}", msg));
            }
            HttpResponse::Accepted().finish()
        }
        Err(msg) => HttpResponse::BadRequest().body(msg),
    }
}