Skip to main content

rustbasic_cli/
publisher.rs

1use std::fs;
2use std::path::Path;
3use rustbasic_core::colored::*;
4
5pub fn publish_config(target: &str) {
6    let mut selected_target = target.to_string();
7    if selected_target.is_empty() {
8        println!("đŸ› ī¸  RustBasic Configuration Publisher");
9        println!("Pilih konfigurasi yang ingin dipublikasikan ke proyek Anda:");
10        println!("  [1] CORS (Cross-Origin Resource Sharing)");
11        println!("  [2] CSRF (Cross-Site Request Forgery)");
12        println!("  [3] APP (Application settings & Storage path overrides)");
13        let choice = crate::utils::prompt_choice("👉 Pilih nomor konfigurasi (1-3): ", 1, 3);
14        match choice {
15            1 => selected_target = "cors".to_string(),
16            2 => selected_target = "csrf".to_string(),
17            3 => selected_target = "app".to_string(),
18            _ => return,
19        }
20    }
21
22    match selected_target.as_str() {
23        "cors" => {
24            let path = Path::new("src/config/cors.rs");
25            if path.exists() {
26                println!("â„šī¸  File cors.rs sudah ada di src/config/cors.rs");
27                return;
28            }
29            if let Some(parent) = path.parent() {
30                let _ = fs::create_dir_all(parent);
31            }
32            let content = r#"/* ---------------------------------------------------------
33 * 📑 LABEL: CORS CONFIGURATION (src/config/cors.rs)
34 * Berkas konfigurasi tambahan untuk kustomisasi CORS.
35 * --------------------------------------------------------- */
36
37pub struct CorsConfig {
38    pub allowed_origins: Vec<&'static str>,
39    pub allowed_methods: Vec<&'static str>,
40    pub allowed_headers: Vec<&'static str>,
41}
42
43impl Default for CorsConfig {
44    fn default() -> Self {
45        Self {
46            allowed_origins: vec!["*"],
47            allowed_methods: vec!["GET", "POST", "PUT", "DELETE", "OPTIONS"],
48            allowed_headers: vec!["*"],
49        }
50    }
51}
52"#;
53            if fs::write(path, content).is_ok() {
54                println!("{} {}", "✅ Berhasil mempublikasikan konfigurasi CORS ke:".green().bold(), path.display().to_string().cyan());
55                println!("💡 File ini sekarang dapat diimpor untuk menyesuaikan aturan CORS lokal.");
56            } else {
57                println!("❌ Gagal menulis file CORS config.");
58            }
59        }
60        "csrf" => {
61            let path = Path::new("src/config/csrf.rs");
62            if path.exists() {
63                println!("â„šī¸  File csrf.rs sudah ada di src/config/csrf.rs");
64                return;
65            }
66            if let Some(parent) = path.parent() {
67                let _ = fs::create_dir_all(parent);
68            }
69            let content = r#"/* ---------------------------------------------------------
70 * 📑 LABEL: CSRF CONFIGURATION (src/config/csrf.rs)
71 * Berkas konfigurasi tambahan untuk perlindungan CSRF.
72 * --------------------------------------------------------- */
73
74pub struct CsrfConfig {
75    pub except_paths: Vec<&'static str>,
76}
77
78impl Default for CsrfConfig {
79    fn default() -> Self {
80        Self {
81            except_paths: vec![], // Masukkan rute yang dikecualikan dari CSRF di sini
82        }
83    }
84}
85"#;
86            if fs::write(path, content).is_ok() {
87                println!("{} {}", "✅ Berhasil mempublikasikan konfigurasi CSRF ke:".green().bold(), path.display().to_string().cyan());
88                println!("💡 File ini sekarang dapat diimpor untuk mengecualikan rute tertentu dari CSRF.");
89            } else {
90                println!("❌ Gagal menulis file CSRF config.");
91            }
92        }
93        "app" => {
94            let path = Path::new("src/config/app.rs");
95            if path.exists() {
96                println!("â„šī¸  File app.rs sudah ada di src/config/app.rs");
97                return;
98            }
99            if let Some(parent) = path.parent() {
100                let _ = fs::create_dir_all(parent);
101            }
102            let content = r#"/* ---------------------------------------------------------
103 * 📑 LABEL: APP CONFIGURATION (src/config/app.rs)
104 * Berkas konfigurasi tambahan untuk kustomisasi lokasi storage lokal.
105 * --------------------------------------------------------- */
106
107pub const STORAGE_TARGET: &str = "public/storage";
108pub const STORAGE_SOURCE: &str = "storage/app/public";
109"#;
110            if fs::write(path, content).is_ok() {
111                println!("{} {}", "✅ Berhasil mempublikasikan konfigurasi APP ke:".green().bold(), path.display().to_string().cyan());
112            } else {
113                println!("❌ Gagal menulis file APP config.");
114            }
115        }
116        _ => {
117            println!("❌ Target '{}' tidak dikenal untuk di-publish.", selected_target);
118            println!("💡 Target yang didukung: cors, csrf, app");
119        }
120    }
121}