spacetimedb_cli/subcommands/
dns.rs1use crate::common_args;
2use crate::config::Config;
3use crate::util::{add_auth_header_opt, get_auth_header, ResponseExt};
4use clap::ArgMatches;
5use clap::{Arg, Command};
6
7use spacetimedb_client_api_messages::name::{DomainName, SetDomainsResult};
8
9pub fn cli() -> Command {
10 Command::new("rename")
11 .about("Rename a database")
12 .arg(
13 Arg::new("new-name")
14 .long("to")
15 .required(true)
16 .help("The new name you would like to assign"),
17 )
18 .arg(
19 Arg::new("database-identity")
20 .required(true)
21 .help("The database identity to rename"),
22 )
23 .arg(common_args::server().help("The nickname, host name or URL of the server on which to set the name"))
24 .arg(common_args::yes())
25 .after_help("Run `spacetime rename --help` for more detailed information.\n")
26}
27
28pub async fn exec(mut config: Config, args: &ArgMatches) -> Result<(), anyhow::Error> {
29 let domain = args.get_one::<String>("new-name").unwrap();
30 let database_identity = args.get_one::<String>("database-identity").unwrap();
31 let server = args.get_one::<String>("server").map(|s| s.as_ref());
32 let force = args.get_flag("force");
33 let auth_header = get_auth_header(&mut config, false, server, !force).await?;
34
35 let domain: DomainName = domain.parse()?;
36
37 let builder = reqwest::Client::new()
38 .put(format!(
39 "{}/v1/database/{database_identity}/names",
40 config.get_host_url(server)?
41 ))
42 .header(reqwest::header::CONTENT_TYPE, "application/json")
43 .body(serde_json::to_string(&[&domain])?);
44 let builder = add_auth_header_opt(builder, &auth_header);
45
46 let response = builder.send().await?;
47 let status = &response.status();
48 let result: SetDomainsResult = response.json_or_error().await?;
49
50 if !status.is_success() {
51 anyhow::bail!(match result {
52 SetDomainsResult::Success => "".to_string(),
53 SetDomainsResult::PermissionDenied { domain } => format!("Permission denied for domain: {domain}"),
54 SetDomainsResult::PermissionDeniedOnAny { domains } =>
55 format!("Permission denied for domains: {domains:?}"),
56 SetDomainsResult::DatabaseNotFound => format!("Database {database_identity} not found"),
57 SetDomainsResult::NotYourDatabase { .. } =>
58 format!("You cannot rename {database_identity} because it is owned by another identity."),
59 SetDomainsResult::OtherError(err) => err,
60 });
61 }
62
63 println!("Name set to {domain} for identity {database_identity}.");
64
65 Ok(())
66}