actix_admin/routes/
delete.rs1use 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 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}