//! Custom domains: attach one to a creator, prove ownership, take it away. use super::{MnwApiClient, empty_response, json_response}; use serde::{Deserialize, Serialize}; /// Custom domain info. #[derive(Debug, Clone, Deserialize, Serialize)] pub(crate) struct DomainInfo { pub id: String, pub domain: String, pub verified: bool, pub verification_token: String, pub instructions: Option, } /// Domain verification result. #[derive(Debug, Deserialize)] #[allow(dead_code)] // wire contract: every field the endpoint returns, read or not pub(crate) struct DomainVerifyResult { pub verified: bool, pub message: String, } impl MnwApiClient { pub(crate) async fn get_domain(&self, user_id: &str) -> anyhow::Result> { let url = format!("{}/api/internal/creator/domain", self.base_url); let resp = self .http .get(&url) .bearer_auth(&self.service_token) .header("X-MNW-Actor", self.actor_header()) .query(&[("user_id", user_id)]) .send() .await?; let val: serde_json::Value = json_response(resp, "get_domain").await?; if val.is_null() { return Ok(None); } Ok(serde_json::from_value(val).ok()) } pub(crate) async fn add_domain( &self, user_id: &str, domain: &str, ) -> anyhow::Result { let url = format!("{}/api/internal/creator/domain", self.base_url); let resp = self .http .post(&url) .bearer_auth(&self.service_token) .header("X-MNW-Actor", self.actor_header()) .json(&serde_json::json!({"user_id": user_id, "domain": domain})) .send() .await?; json_response(resp, "add_domain").await } pub(crate) async fn verify_domain(&self, user_id: &str) -> anyhow::Result { let url = format!("{}/api/internal/creator/domain/verify", self.base_url); let resp = self .http .post(&url) .bearer_auth(&self.service_token) .header("X-MNW-Actor", self.actor_header()) .query(&[("user_id", user_id)]) .send() .await?; json_response(resp, "verify_domain").await } pub(crate) async fn remove_domain(&self, user_id: &str) -> anyhow::Result<()> { let url = format!("{}/api/internal/creator/domain", self.base_url); let resp = self .http .delete(&url) .bearer_auth(&self.service_token) .header("X-MNW-Actor", self.actor_header()) .query(&[("user_id", user_id)]) .send() .await?; empty_response(resp, "remove_domain").await } }