(config: &Config, server: &str, token: &str)
| 1137 | } |
| 1138 | |
| 1139 | async fn select_database(config: &Config, server: &str, token: &str) -> Result<String, anyhow::Error> { |
| 1140 | let identity = crate::util::decode_identity(&token.to_string())?; |
| 1141 | |
| 1142 | let spinner = ProgressBar::new_spinner(); |
| 1143 | spinner.set_style( |
| 1144 | ProgressStyle::default_spinner() |
| 1145 | .template("{spinner:.cyan} {msg}") |
| 1146 | .unwrap(), |
| 1147 | ); |
| 1148 | spinner.set_message("Fetching database list..."); |
| 1149 | spinner.enable_steady_tick(Duration::from_millis(100)); |
| 1150 | |
| 1151 | let client = reqwest::Client::new(); |
| 1152 | let res = client |
| 1153 | .get(format!( |
| 1154 | "{}/v1/identity/{}/databases", |
| 1155 | config.get_host_url(Some(server))?, |
| 1156 | identity |
| 1157 | )) |
| 1158 | .bearer_auth(token) |
| 1159 | .send() |
| 1160 | .await?; |
| 1161 | |
| 1162 | let result: DatabasesResult = res |
| 1163 | .json_or_error() |
| 1164 | .await |
| 1165 | .context("Unable to retrieve databases for identity")?; |
| 1166 | |
| 1167 | if result.identities.is_empty() { |
| 1168 | spinner.finish_and_clear(); |
| 1169 | println!("{}", "No existing databases found.".yellow()); |
| 1170 | Ok(generate_database_name()) |
| 1171 | } else { |
| 1172 | let total = result.identities.len(); |
| 1173 | spinner.set_message(format!("Fetching names for {} databases...", total)); |
| 1174 | |
| 1175 | // Fetch database names with HTTP queries to /database/{identity}/names |
| 1176 | // It's parallelyzed in case a user has a lot of databases |
| 1177 | // TODO: we should introduce an endpoint that returns user's databases with names |
| 1178 | let databases: Vec<DatabaseRow> = stream::iter(result.identities.into_iter()) |
| 1179 | .map(|identity_str| { |
| 1180 | let config = config.clone(); |
| 1181 | async move { |
| 1182 | let names_response = spacetime_reverse_dns(&config, &identity_str, Some(server)).await?; |
| 1183 | let name = if names_response.names.is_empty() { |
| 1184 | identity_str.clone() |
| 1185 | } else { |
| 1186 | names_response.names[0].as_ref().to_string() |
| 1187 | }; |
| 1188 | Ok::<DatabaseRow, anyhow::Error>(DatabaseRow { |
| 1189 | identity: identity_str, |
| 1190 | name, |
| 1191 | }) |
| 1192 | } |
| 1193 | }) |
| 1194 | .buffer_unordered(30) |
| 1195 | .collect::<Vec<_>>() |
| 1196 | .await |
no test coverage detected
searching dependent graphs…