romance_core/addon/
soft_delete.rs1use crate::addon::Addon;
2use anyhow::Result;
3use std::path::Path;
4
5pub struct SoftDeleteAddon;
6
7impl Addon for SoftDeleteAddon {
8 fn name(&self) -> &str {
9 "soft-delete"
10 }
11
12 fn check_prerequisites(&self, project_root: &Path) -> Result<()> {
13 super::check_romance_project(project_root)
14 }
15
16 fn is_already_installed(&self, project_root: &Path) -> bool {
17 project_root
18 .join("backend/src/soft_delete.rs")
19 .exists()
20 }
21
22 fn install(&self, project_root: &Path) -> Result<()> {
23 install_soft_delete(project_root)
24 }
25
26 fn uninstall(&self, project_root: &Path) -> Result<()> {
27 use colored::Colorize;
28
29 println!("{}", "Uninstalling soft delete...".bold());
30
31 if super::remove_file_if_exists(&project_root.join("backend/src/soft_delete.rs"))? {
33 println!(" {} backend/src/soft_delete.rs", "delete".red());
34 }
35
36 super::remove_mod_from_main(project_root, "soft_delete")?;
38
39 super::remove_feature_flag(project_root, "soft_delete")?;
41
42 crate::ai_context::regenerate(project_root).ok();
44
45 println!();
46 println!("{}", "Soft delete uninstalled successfully.".green().bold());
47
48 Ok(())
49 }
50}
51
52fn install_soft_delete(project_root: &Path) -> Result<()> {
53 use crate::template::TemplateEngine;
54 use crate::utils;
55 use colored::Colorize;
56 use tera::Context;
57
58 println!("{}", "Installing soft delete...".bold());
59
60 let engine = TemplateEngine::new()?;
61 let ctx = Context::new();
62
63 let content = engine.render("addon/soft_delete/soft_delete.rs.tera", &ctx)?;
65 utils::write_file(
66 &project_root.join("backend/src/soft_delete.rs"),
67 &content,
68 )?;
69 println!(" {} backend/src/soft_delete.rs", "create".green());
70
71 super::add_mod_to_main(project_root, "soft_delete")?;
73
74 super::update_feature_flag(project_root, "soft_delete", true)?;
76
77 println!();
78 println!(
79 "{}",
80 "Soft delete installed successfully!".green().bold()
81 );
82 println!(" Future entities will use soft-delete by default.");
83 println!(" Entities get: DELETE (soft), POST /:id/restore, DELETE /:id/permanent");
84
85 Ok(())
86}