summaryrefslogtreecommitdiff
path: root/crates/cli/src/modules/domain.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/cli/src/modules/domain.rs')
-rw-r--r--crates/cli/src/modules/domain.rs98
1 files changed, 98 insertions, 0 deletions
diff --git a/crates/cli/src/modules/domain.rs b/crates/cli/src/modules/domain.rs
new file mode 100644
index 00000000..f2fe7332
--- /dev/null
+++ b/crates/cli/src/modules/domain.rs
@@ -0,0 +1,98 @@
+/*
+ * Copyright (c) 2020-2023, Stalwart Labs Ltd.
+ *
+ * This file is part of Stalwart Mail Server.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ * in the LICENSE file at the top-level directory of this distribution.
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * You can be released from the requirements of the AGPLv3 license by
+ * purchasing a commercial license. Please contact licensing@stalw.art
+ * for more details.
+*/
+
+use std::borrow::Cow;
+
+use prettytable::{Attr, Cell, Row, Table};
+use reqwest::Method;
+use serde_json::Value;
+
+use super::cli::{Client, DomainCommands};
+
+impl DomainCommands {
+ pub async fn exec(self, client: Client) {
+ match self {
+ DomainCommands::Create { name } => {
+ client
+ .http_request::<Value, String>(
+ Method::POST,
+ &format!("/admin/domain/{name}"),
+ None,
+ )
+ .await;
+ eprintln!("Successfully created domain {name:?}");
+ }
+ DomainCommands::Delete { name } => {
+ client
+ .http_request::<Value, String>(
+ Method::DELETE,
+ &format!("/admin/domain/{name}"),
+ None,
+ )
+ .await;
+ eprintln!("Successfully deleted domain {name:?}");
+ }
+ DomainCommands::List { from, limit } => {
+ let query = if from.is_none() && limit.is_none() {
+ Cow::Borrowed("/admin/domain")
+ } else {
+ let mut query = "/admin/domain?".to_string();
+ if let Some(from) = &from {
+ query.push_str(&format!("from={from}"));
+ }
+ if let Some(limit) = limit {
+ query.push_str(&format!(
+ "{}limit={limit}",
+ if from.is_some() { "&" } else { "" }
+ ));
+ }
+ Cow::Owned(query)
+ };
+
+ let domains = client
+ .http_request::<Vec<String>, String>(Method::GET, query.as_ref(), None)
+ .await;
+ if !domains.is_empty() {
+ let mut table = Table::new();
+ table.add_row(Row::new(vec![
+ Cell::new("Domain Name").with_style(Attr::Bold)
+ ]));
+
+ for domain in &domains {
+ table.add_row(Row::new(vec![Cell::new(domain)]));
+ }
+
+ eprintln!();
+ table.printstd();
+ eprintln!();
+ }
+
+ eprintln!(
+ "\n\n{} domain{} found.\n",
+ domains.len(),
+ if domains.len() == 1 { "" } else { "s" }
+ );
+ }
+ }
+ }
+}