Skip to main content

dna_rs/ops/
contact.rs

1use std::collections::HashMap;
2
3use crate::client::DnaClient;
4use crate::error::DnaResult;
5use crate::models::contact::{
6    ContactInfo, ContactInput, ContactPayload, SaveContactsPayload, SaveContactsResponse,
7};
8use crate::models::domain::DomainInfoResponse;
9use crate::ops::util::{build_contact_payload, parse_contacts};
10
11impl DnaClient {
12    /// Fetch all contacts for a domain.
13    ///
14    /// Returns a map of `"Administrative" | "Billing" | "Technical" | "Registrant"`
15    /// to [`ContactInfo`].
16    pub async fn get_contacts(&self, domain_name: &str) -> DnaResult<HashMap<String, ContactInfo>> {
17        let query = [("DomainName", domain_name)];
18        let raw: DomainInfoResponse = self.http.get("domains/info", Some(&query)).await?;
19        Ok(parse_contacts(raw.contacts.unwrap_or_default()))
20    }
21
22    /// Update all contacts for a domain.
23    ///
24    /// `contacts` maps a type label (`"Registrant"`, `"Administrative"`, etc.)
25    /// to the new contact data.
26    pub async fn save_contacts(
27        &self,
28        domain_name: &str,
29        contacts: HashMap<&str, ContactInput>,
30    ) -> DnaResult<HashMap<String, ContactInfo>> {
31        let payload_contacts: Vec<ContactPayload> = contacts
32            .iter()
33            .map(|(t, c)| build_contact_payload(c, t))
34            .collect();
35
36        let payload = SaveContactsPayload {
37            domain_name: domain_name.into(),
38            contacts: payload_contacts,
39        };
40
41        let resp: SaveContactsResponse = self.http.put("domains/contacts/update", &payload).await?;
42
43        Ok(parse_contacts(resp.contacts.unwrap_or_default()))
44    }
45}