Skip to content
Merged
Show file tree
Hide file tree
Changes from 7 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
67 changes: 12 additions & 55 deletions crates/cli/src/subcommands/dns.rs
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
use crate::common_args;
use crate::config::Config;
use crate::util::{add_auth_header_opt, decode_identity, get_auth_header, get_login_token_or_log_in, ResponseExt};
use crate::util::{add_auth_header_opt, get_auth_header};
use clap::ArgMatches;
use clap::{Arg, Command};

use spacetimedb_client_api_messages::name::{DomainName, InsertDomainResult};
use spacetimedb_client_api_messages::name::DomainName;

pub fn cli() -> Command {
Command::new("rename")
Expand All @@ -30,70 +30,27 @@ pub async fn exec(mut config: Config, args: &ArgMatches) -> Result<(), anyhow::E
let database_identity = args.get_one::<String>("database-identity").unwrap();
let server = args.get_one::<String>("server").map(|s| s.as_ref());
let force = args.get_flag("force");
let token = get_login_token_or_log_in(&mut config, server, !force).await?;
let identity = decode_identity(&token)?;
let auth_header = get_auth_header(&mut config, false, server, !force).await?;

let domain: DomainName = domain.parse()?;

let builder = reqwest::Client::new()
.post(format!(
.put(format!(
"{}/v1/database/{database_identity}/names",
config.get_host_url(server)?
))
.body(String::from(domain));
.header(reqwest::header::CONTENT_TYPE, "application/json")
.body(serde_json::to_string(&[&domain])?);
let builder = add_auth_header_opt(builder, &auth_header);

let result = builder.send().await?.json_or_error().await?;
match result {
InsertDomainResult::Success {
domain,
database_identity,
} => {
println!("Domain set to {} for identity {}.", domain, database_identity);
}
InsertDomainResult::TldNotRegistered { domain } => {
return Err(anyhow::anyhow!(
"The top level domain that you provided is not registered.\n\
This tld is not yet registered to any identity. You can register this domain with the following command:\n\
\n\
\tspacetime dns register-tld {}\n",
domain.tld()
));
}
InsertDomainResult::PermissionDenied { domain } => {
//TODO(jdetter): Have a nice name generator here, instead of using some abstract characters
// we should perhaps generate fun names like 'green-fire-dragon' instead
let suggested_tld: String = identity.chars().take(12).collect();
if let Some(sub_domain) = domain.sub_domain() {
return Err(anyhow::anyhow!(
"The top level domain {} is not registered to the identity you provided.\n\
We suggest you register a new tld:\n\
\tspacetime dns register-tld {}\n\
\n\
And then push to the domain that uses that tld:\n\
\tspacetime publish {}/{}\n",
domain.tld(),
suggested_tld,
suggested_tld,
sub_domain
));
} else {
return Err(anyhow::anyhow!(
"The top level domain {} is not registered to the identity you provided.\n\
We suggest you register a new tld:\n\
\tspacetime dns register-tld {}\n\
\n\
And then push to the domain that uses that tld:\n\
\tspacetime publish {}\n",
domain.tld(),
suggested_tld,
suggested_tld
));
}
}
InsertDomainResult::OtherError(e) => return Err(anyhow::anyhow!(e)),
let response = builder.send().await?;
let status = response.status();
let response_body = response.text().await?;
if !status.is_success() {
anyhow::bail!("{response_body}");
}

println!("Domain set to {} for identity {}.", domain, database_identity);
Comment thread
bfops marked this conversation as resolved.
Outdated

Ok(())
}
7 changes: 6 additions & 1 deletion smoketests/tests/domains.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@ class Domains(Smoketest):
def test_set_name(self):
"""Tests the functionality of the set-name command"""

self.publish_module()
orig_name = random_string()
self.publish_module(orig_name)

rand_name = random_string()

Expand All @@ -21,6 +22,10 @@ def test_set_name(self):
# Now we're essentially just testing that it *doesn't* throw an exception
self.spacetime("logs", rand_name)

# This should throw an exception because the original name shouldn't exist anymore
with self.assertRaises(Exception):
self.spacetime("logs", orig_name)

@unittest.expectedFailure
def test_subdomain_behavior(self):
"""Test how we treat the / character in published names"""
Expand Down
Loading