Skip to main content

cloudflare_dns/tasks/
submit_task.rs

1/// Submit (create/update) DNS record task with parameter object.
2use iocraft::prelude::*;
3use std::sync::Arc;
4
5use crate::api::CloudflareClient;
6use crate::api::models::DnsRecord;
7use crate::ui::state::{AppState, AppView};
8use crate::utils::{extract_unique_ips, format_records};
9
10/// Parameters for the submit task.
11pub struct SubmitParams {
12    pub client: Arc<CloudflareClient>,
13    pub state: Arc<AppState>,
14    pub record_id: String,
15    pub record_type: String,
16    pub name: String,
17    pub content: String,
18    pub ttl: i64,
19    pub proxied: bool,
20    pub records_display: State<String>,
21    pub status: State<String>,
22    pub view: State<AppView>,
23    pub form_name: State<String>,
24    pub form_content: State<String>,
25    pub is_submitting: State<bool>,
26}
27
28/// Create or update a DNS record based on form data.
29pub async fn submit_task(mut params: SubmitParams) {
30    let is_update = !params.record_id.is_empty();
31    let rec = DnsRecord {
32        id: if is_update {
33            Some(params.record_id.clone())
34        } else {
35            None
36        },
37        record_type: params.record_type.clone(),
38        name: params.name.clone(),
39        content: params.content.clone(),
40        ttl: Some(params.ttl),
41        proxied: Some(params.proxied),
42        comment: None,
43    };
44
45    let result = if is_update {
46        params.client.update_dns_record(&rec).await
47    } else {
48        params.client.create_dns_record(&rec).await
49    };
50
51    match result {
52        Ok(_) => {
53            // Invalidate cache after successful create/update
54            params.state.dns_cache.lock().unwrap().invalidate();
55
56            let action = if is_update { "Updated" } else { "Created" };
57            params.status.set(format!(
58                "{} {} for {}",
59                action, params.record_type, params.name
60            ));
61            params.view.set(AppView::List);
62            params.form_name.set("".to_string());
63            params.form_content.set("".to_string());
64            params.is_submitting.set(false);
65
66            if let Ok(f) = params.client.list_dns_records().await {
67                params.records_display.set(format_records(&f));
68                *params.state.existing_ips.lock().unwrap() = extract_unique_ips(&f);
69                *params.state.records.lock().unwrap() = f.clone();
70                params.state.dns_cache.lock().unwrap().set(f);
71            } else {
72                params.status.set(format!(
73                    "{} {} for {}, but refresh failed — press R to reload",
74                    action, params.record_type, params.name
75                ));
76            }
77        }
78        Err(e) => {
79            params.status.set(format!("Failed: {}", e));
80            params.is_submitting.set(false);
81        }
82    }
83}