actix_admin/routes/
delete.rs

1use super::{render_unauthorized, user_can_access_page};
2use crate::prelude::*;
3use actix_session::Session;
4use actix_web::http::header;
5use actix_web::{web, Error, HttpRequest, HttpResponse};
6use sea_orm::DatabaseConnection;
7use tera::Context;
8
9pub async fn delete<E: ActixAdminViewModelTrait>(
10    session: Session,
11    _req: HttpRequest,
12    data: web::Data<ActixAdmin>,
13    db: web::Data<DatabaseConnection>,
14    _text: String,
15    id: web::Path<i32>,
16) -> Result<HttpResponse, Error> {
17    let actix_admin = &data.into_inner();
18    let entity_name = E::get_entity_name();
19
20    let view_model = actix_admin.view_models.get(&entity_name).unwrap();
21
22    if !user_can_access_page(&session, actix_admin, view_model) {
23        let mut ctx = Context::new();
24        ctx.insert("render_partial", &true);
25        return render_unauthorized(&ctx, &actix_admin);
26    }
27
28    let db = &db.get_ref();
29    let id = id.into_inner();
30
31    let tenant_ref = actix_admin
32        .configuration
33        .user_tenant_ref
34        .map_or(None, |f| f(&session));
35
36    let model_result = E::get_entity(db, id, tenant_ref).await;
37    let delete_result = E::delete_entity(db, id, tenant_ref).await;
38
39    match (model_result, delete_result) {
40        (Ok(model), Ok(_)) => {
41            for field in view_model.fields {
42                if field.field_type == ActixAdminViewModelFieldType::FileUpload {
43                    let file_name = model
44                        .get_value::<String>(&field.field_name, true, true)
45                        .unwrap_or_default();
46                    if file_name.is_some() {
47                        let file_path = format!(
48                            "{}/{}/{}",
49                            actix_admin.configuration.file_upload_directory,
50                            E::get_entity_name(),
51                            file_name.unwrap()
52                        );
53                        std::fs::remove_file(file_path)?;
54                    }
55                }
56            }
57
58            Ok(HttpResponse::Ok().finish())
59        }
60        (_, _) => Ok(HttpResponse::InternalServerError().finish()),
61    }
62}
63
64pub async fn delete_many<E: ActixAdminViewModelTrait>(
65    session: Session,
66    _req: HttpRequest,
67    data: web::Data<ActixAdmin>,
68    db: web::Data<DatabaseConnection>,
69    form: web::Form<Vec<(String, String)>>,
70) -> Result<HttpResponse, Error> {
71    let actix_admin = data.get_ref();
72    let entity_name = E::get_entity_name();
73
74    let view_model = actix_admin.view_models.get(&entity_name).unwrap();
75    let mut errors: Vec<crate::ActixAdminError> = Vec::new();
76
77    if !user_can_access_page(&session, actix_admin, view_model) {
78        let mut ctx = Context::new();
79        ctx.insert("render_partial", &true);
80        return render_unauthorized(&ctx, &actix_admin);
81    }
82
83    let db = &db.get_ref();
84
85    let ids: Vec<i32> = form.iter().filter(|el| el.0 == "ids").map(|el| el.1.parse::<i32>().unwrap()).collect();
86
87    // TODO: implement delete_many
88        let tenant_ref = actix_admin
89        .configuration
90        .user_tenant_ref
91        .map_or(None, |f| f(&session));
92
93    for id in ids {
94        let model_result = E::get_entity(db, id, tenant_ref).await;
95        let delete_result = E::delete_entity(db, id, tenant_ref).await;
96        match (delete_result, model_result) {
97            (Err(e), _) => errors.push(e),
98            (Ok(_), Ok(model)) => {
99                for field in view_model.fields {
100                    if field.field_type == ActixAdminViewModelFieldType::FileUpload {
101                        let file_name = model
102                            .get_value::<String>(&field.field_name, true, true)
103                            .unwrap_or_default();
104                        if file_name.is_some() {
105                            let file_path = format!(
106                                "{}/{}/{}",
107                                actix_admin.configuration.file_upload_directory,
108                                E::get_entity_name(),
109                                file_name.unwrap_or_default()
110                            );
111                            std::fs::remove_file(file_path)?;
112                        }
113                    }
114                }
115            }
116            (Ok(_), Err(e)) => errors.push(e),
117        }
118    }
119
120    let entities_per_page = form.iter()
121        .find(|el| el.0 == "entities_per_page")
122        .map(|e| e.1.to_string())
123        .unwrap_or("10".to_string());
124    let search = form.iter()
125        .find(|el| el.0 == "search")
126        .map(|e| e.1.to_string())
127        .unwrap_or_default();
128    let sort_by = form.iter()
129        .find(|el| el.0 == "sort_by")
130        .map(|e| e.1.to_string())
131        .unwrap_or("id".to_string());
132    let sort_order = form.iter()
133        .find(|el| el.0 == "sort_order")
134        .map(|e| e.1.to_string())
135        .unwrap_or("Asc".to_string());
136    let page = form.iter()
137        .find(|el| el.0 == "page")
138        .map(|e| e.1.to_string())
139        .unwrap_or("1".to_string());
140
141    match errors.is_empty() {
142        true => Ok(HttpResponse::SeeOther()
143            .append_header((
144                header::LOCATION,
145                format!("list?entities_per_page={0}&search={1}&sort_by={2}&sort_order={3}&page={4}", entities_per_page, search, sort_by, sort_order, page),
146            ))
147            .finish()),
148        false => Ok(HttpResponse::InternalServerError().finish()),
149    }
150}