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 5.28 KiB
Newer Older
  • Learn to ignore specific revisions
  • 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.save(&app_state.read().expect("Couldn't read AppState").config)
                {
                    return HttpResponse::InternalServerError()
                        .body(format!("Error saving website to static file - {}", msg));
                };
                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();
    
    Pierre Jarriges's avatar
    Pierre Jarriges committed
        let page = {
            match website
                .write()
                .expect("Couldn't acquire website write lock")
                .update_page(id, updated_page.into_inner())
            {
                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
            }
    
    Pierre Jarriges's avatar
    Pierre Jarriges committed
        };
    
        if let Err(msg) = website
            .read()
            .expect("Couldn't read WebSite")
            .save(&app_state.read().expect("Couldn't read AppState").config)
        {
            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 updated = {
            let mut ws = website
                .write()
                .expect("Couldn't acquire website write lock");
            match ws.update_template(updated_template.into_inner()) {
                Ok(template) => template.clone(),
                Err(msg) => {
                    return HttpResponse::BadRequest().body(format!("Error updating template {}", msg))
                }
            }
        };
    
        WebSite::update_page_rec_after_template_update(
            &mut website
                .write()
                .expect("Couldn't acquire website write lock")
                .root_page,
            &updated,
        );
    
    
    Pierre Jarriges's avatar
    Pierre Jarriges committed
        if let Err(msg) = website
            .read()
            .expect("Couldn't read 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::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");
        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),
        }
    }