zero-cli 1.0.1

A command line tool for Zero Secrets Manager
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);
        }
    };
}