mod graphql;
use crate::common::{
authorization_headers::authorization_headers,
execute_graphql_request::execute_graphql_request,
fetch_user_id::fetch_user_id,
keyring::keyring,
print_formatted_error::print_formatted_error,
query_full_id::{query_full_id, QueryType},
};
use crate::teams::common::team_info::team_info;
use clap::Args;
use graphql::send_invite::{send_invite, SendInvite};
use graphql_client::GraphQLQuery;
use reqwest::Client;
use termimad::crossterm::style::Stylize;
#[derive(Args, Debug)]
pub struct UserInviteArgs {
#[clap(short, long, help = "Team ID (First 4 characters or more are allowed)")]
id: String,
#[clap(short, long, help = "The email of the user to invite")]
email: String,
#[clap(
short,
long,
help = "Access token, if not specified, the token will be taken from the keychain"
)]
access_token: Option<String>,
}
pub fn invite(args: &UserInviteArgs) {
let access_token = match &args.access_token {
Some(token) => token.clone(),
None => keyring::get("access_token"),
};
let user_id = fetch_user_id(&access_token);
let team_id = query_full_id(QueryType::Teams, args.id.clone(), &access_token);
let team_info = team_info(&access_token, team_id);
if team_info.owner_user_id != user_id {
print_formatted_error(
"You are not the owner of this team. You cannot invite users to this team.",
);
std::process::exit(1);
};
let error_message = "Failed to send invitation.";
match execute_graphql_request::<send_invite::Variables, send_invite::ResponseData>(
authorization_headers(&access_token),
SendInvite::build_query,
&Client::new(),
&error_message,
send_invite::Variables {
team_id: team_info.id.to_string(),
email: args.email.to_string(),
},
)
.send_invite_user_team
.success
{
true => {
println!(
"{} {} {}",
"✔".green(),
"The invitation was successfully sent to the user.",
&args.email.to_string()
);
}
_ => {
print_formatted_error(error_message);
std::process::exit(1);
}
};
}