From a8ce010c616f0a7d7adce95bb27738b708edc1f7 Mon Sep 17 00:00:00 2001 From: Ayush Jha Date: Mon, 18 Mar 2024 17:27:55 +0545 Subject: [PATCH] Add subcommand `wasmer domain register` to register a new domain --- lib/backend-api/schema.graphql | 4 ++-- lib/backend-api/src/query.rs | 23 +++++++++++++++++++++++ lib/backend-api/src/types.rs | 20 ++++++++++++++++++++ lib/cli/src/commands/domain/mod.rs | 5 +++++ 4 files changed, 50 insertions(+), 2 deletions(-) diff --git a/lib/backend-api/schema.graphql b/lib/backend-api/schema.graphql index 1940b71e6a7..b290541a1e2 100644 --- a/lib/backend-api/schema.graphql +++ b/lib/backend-api/schema.graphql @@ -3050,8 +3050,8 @@ type RegisterDomainPayload { input RegisterDomainInput { name: String! - namespace: String! - importRecords: Boolean = false + namespace: String + importRecords: Boolean = true clientMutationId: String } diff --git a/lib/backend-api/src/query.rs b/lib/backend-api/src/query.rs index 7c0d60f5b73..eccd81fb724 100644 --- a/lib/backend-api/src/query.rs +++ b/lib/backend-api/src/query.rs @@ -865,6 +865,29 @@ pub async fn get_domain_with_records( Ok(opt) } +/// Register a new domain +pub async fn register_domain( + client: &WasmerClient, + domain: String, + namespace: Option, + import_records: bool, +) -> Result { + let vars = types::RegisterDomainVars { + name: domain, + namespace, + import_records: Some(import_records), + }; + let opt = client + .run_graphql_strict(types::RegisterDomain::build(vars)) + .await + .map_err(anyhow::Error::from)? + .register_domain + .context("Domain registration failed")? + .domain + .context("Domain registration failed, no associatede domain found.")?; + Ok(opt) +} + /// Retrieve all DNS records. /// /// NOTE: this is a privileged operation that requires extra permissions. diff --git a/lib/backend-api/src/types.rs b/lib/backend-api/src/types.rs index 12ec6c7aeaf..da41dd07240 100644 --- a/lib/backend-api/src/types.rs +++ b/lib/backend-api/src/types.rs @@ -329,6 +329,26 @@ mod queries { pub get_deploy_app_version: Option, } + #[derive(cynic::QueryFragment, Debug)] + pub struct RegisterDomainPayload { + pub success: bool, + pub domain: Option, + } + + #[derive(cynic::QueryVariables, Debug)] + pub struct RegisterDomainVars { + pub name: String, + pub namespace: Option, + pub import_records: Option, + } + + #[derive(cynic::QueryFragment, Debug)] + #[cynic(graphql_type = "Mutation", variables = "RegisterDomainVars")] + pub struct RegisterDomain { + #[arguments(input: {name: $name, importRecords: $import_records, namespace: $namespace})] + pub register_domain: Option, + } + #[derive(cynic::QueryVariables, Debug)] pub struct UpsertDomainFromZoneFileVars { pub zone_file: String, diff --git a/lib/cli/src/commands/domain/mod.rs b/lib/cli/src/commands/domain/mod.rs index b606931d7cf..ec9de5d556d 100644 --- a/lib/cli/src/commands/domain/mod.rs +++ b/lib/cli/src/commands/domain/mod.rs @@ -1,5 +1,6 @@ pub mod get; pub mod list; +pub mod register; pub mod zonefile; use crate::commands::AsyncCliCommand; @@ -17,6 +18,9 @@ pub enum CmdDomain { /// Sync local zone file with remotex SyncZoneFile(self::zonefile::CmdZoneFileSync), + + /// Register new domain + Register(self::register::CmdDomainRegister), } #[async_trait::async_trait] @@ -29,6 +33,7 @@ impl AsyncCliCommand for CmdDomain { CmdDomain::Get(cmd) => cmd.run_async().await, CmdDomain::GetZoneFile(cmd) => cmd.run_async().await, CmdDomain::SyncZoneFile(cmd) => cmd.run_async().await, + CmdDomain::Register(cmd) => cmd.run_async().await, } } }