Setup commands moved to a subcommand menu

This commit is contained in:
JP Stringham
2026-03-06 16:10:53 -05:00
parent e8c844a282
commit 2ea28220b3
4 changed files with 73 additions and 50 deletions

View File

@@ -1,13 +1,12 @@
pub mod admin;
use std::time::{Duration, Instant}; use std::time::{Duration, Instant};
use colored::{ColoredString, Colorize}; use colored::{ColoredString, Colorize};
use reqwest::{StatusCode, Url}; use reqwest::StatusCode;
use crate::json_types::*; use crate::json_types::*;
const MAS_SERVER_BASE_URL: &str = "https://mas.supersaturn.space";
const USERS_ENDPT: &str = "/api/admin/v1/users";
const OAUTH_LINKS_ENDPT: &str = "/api/admin/v1/upstream-oauth-links";
#[derive(Debug)] #[derive(Debug)]
pub struct App { pub struct App {
matrix_base_url: String, matrix_base_url: String,
@@ -32,11 +31,11 @@ impl App {
println!("\nApp Base URL: {}", self.matrix_base_url); println!("\nApp Base URL: {}", self.matrix_base_url);
println!( println!(
"Auth Metadata? {}", "Auth Metadata? {}",
quick_format_bool(self.auth_metadata.is_some()) crate::quick_format_bool(self.auth_metadata.is_some())
); );
println!( println!(
"Client Reg? {}", "Client Reg? {}",
quick_format_bool(self.client_registration.is_some()) crate::quick_format_bool(self.client_registration.is_some())
); );
} }
@@ -218,39 +217,4 @@ impl App {
println!("Authorized!"); println!("Authorized!");
self.auth_token = Some(token); self.auth_token = Some(token);
} }
pub fn show_oauth_links(&self) {
let auth_token = self
.auth_token
.as_ref()
.expect("Need auth token to perform this action");
let url = format!("{}{OAUTH_LINKS_ENDPT}", self.mas_base_url);
let client = reqwest::blocking::Client::new();
let req = client
.get(url)
.header("Accept", "application/json")
.header(
"Authorization",
format!("Bearer {}", auth_token.access_token.clone()),
)
.header("Content-Type", "application/json")
.body(include_str!("../oauthlinks.json"));
// println!("Req {:?}", req);
let res = req.send().unwrap();
let json = prettify_json_str(res.text().unwrap().as_str()).unwrap();
println!("{}", json);
}
}
fn quick_format_bool(b: bool) -> ColoredString {
match b {
true => "true".bright_green(),
false => "false".red(),
}
} }

35
src/app/admin.rs Normal file
View File

@@ -0,0 +1,35 @@
const SITE_CONFIG: &str = "/api/admin/v1/site-config";
const USERS_ENDPT: &str = "/api/admin/v1/users";
const OAUTH_LINKS_ENDPT: &str = "/api/admin/v1/upstream-oauth-links";
use crate::json_types::*;
impl super::App {
pub fn show_oauth_links(&self) {
let auth_token = self
.auth_token
.as_ref()
.expect("Need auth token to perform this action");
let url = format!("{}{OAUTH_LINKS_ENDPT}", self.mas_base_url);
let client = reqwest::blocking::Client::new();
let req = client
.get(url)
.header("Accept", "application/json")
.header(
"Authorization",
format!("Bearer {}", auth_token.access_token.clone()),
)
.header("Content-Type", "application/json")
.body(include_str!("../../oauthlinks.json"));
// println!("Req {:?}", req);
let res = req.send().unwrap();
let json = prettify_json_str(res.text().unwrap().as_str()).unwrap();
println!("{}", json);
}
}

0
src/app/setup.rs Normal file
View File

View File

@@ -10,12 +10,10 @@
mod app; mod app;
pub mod json_types; pub mod json_types;
use json_types::*;
use std::io::Write; use std::io::Write;
use clap::{CommandFactory, Parser, Subcommand}; use clap::{CommandFactory, Parser, Subcommand};
use colored::Colorize; use colored::{ColoredString, Colorize};
use enum_iterator::Sequence; use enum_iterator::Sequence;
use crate::app::App; use crate::app::App;
@@ -62,10 +60,16 @@ fn main() {
}; };
match cli.command { match cli.command {
Commands::GetAuthMetadata => app.get_auth_metadata(), Commands::Setup(sub_args) => {
Commands::RegisterClient => app.register_client(), println!("subargs: {:?}", sub_args);
Commands::AuthorizeDevice => app.authorize_device(),
Commands::RefreshAuth => app.refresh_auth(), match sub_args.command {
SetupCommands::GetAuthMetadata => app.get_auth_metadata(),
SetupCommands::RegisterClient => app.register_client(),
SetupCommands::AuthorizeDevice => app.authorize_device(),
SetupCommands::RefreshAuth => app.refresh_auth(),
}
}
Commands::ShowOauthLinks => app.show_oauth_links(), Commands::ShowOauthLinks => app.show_oauth_links(),
} }
} }
@@ -149,11 +153,31 @@ struct Cli {
command: Commands, command: Commands,
} }
#[derive(Debug, Subcommand, PartialEq, Eq, Sequence)] #[derive(Debug, Subcommand)]
enum Commands { enum Commands {
#[command(subcommand_help_heading = "Setup Auth for Admin API")]
#[command(arg_required_else_help = true)]
Setup(SetupCommandArgs),
ShowOauthLinks,
}
#[derive(Debug, Parser)]
struct SetupCommandArgs {
#[command(subcommand)]
command: SetupCommands,
}
#[derive(Debug, Subcommand, PartialEq, Eq, Sequence)]
enum SetupCommands {
GetAuthMetadata, GetAuthMetadata,
RegisterClient, RegisterClient,
AuthorizeDevice, AuthorizeDevice,
RefreshAuth, RefreshAuth,
ShowOauthLinks, }
fn quick_format_bool(b: bool) -> ColoredString {
match b {
true => "true".bright_green(),
false => "false".red(),
}
} }