smbcloud_cli/account/me/
mod.rs

1use crate::{
2    cli::CommandResult,
3    ui::{fail_message, fail_symbol, succeed_message, succeed_symbol},
4};
5use anyhow::{anyhow, Result};
6use reqwest::{Client, StatusCode};
7use smbcloud_model::account::User;
8use smbcloud_networking::{
9    constants::PATH_USERS_ME, environment::Environment, get_smb_token, smb_base_url_builder,
10};
11use spinners::Spinner;
12use tabled::{Table, Tabled};
13
14#[derive(Tabled)]
15struct UserRow {
16    #[tabled(rename = "ID")]
17    id: i32,
18    #[tabled(rename = "Email")]
19    email: String,
20    #[tabled(rename = "Created At")]
21    created_at: String,
22    #[tabled(rename = "Updated At")]
23    updated_at: String,
24}
25
26fn show_user(user: &User) {
27    let row = UserRow {
28        id: user.id,
29        email: user.email.clone(),
30        created_at: user.created_at.format("%Y-%m-%d %H:%M:%S").to_string(),
31        updated_at: user.updated_at.format("%Y-%m-%d %H:%M:%S").to_string(),
32    };
33    let table = Table::new(vec![row]);
34    println!("{table}");
35}
36
37pub async fn process_me(env: Environment) -> Result<CommandResult> {
38    let mut spinner = Spinner::new(
39        spinners::Spinners::SimpleDotsScrolling,
40        succeed_message("Loading"),
41    );
42    match me(env).await {
43        Ok(user) => {
44            spinner.stop_and_persist(&succeed_symbol(), succeed_message("Loaded."));
45            show_user(&user);
46            Ok(CommandResult {
47                spinner: Spinner::new(
48                    spinners::Spinners::SimpleDotsScrolling,
49                    succeed_message("Loading"),
50                ),
51                symbol: succeed_symbol(),
52                msg: succeed_message("User info loaded."),
53            })
54        }
55        Err(e) => {
56            spinner.stop_and_persist(
57                &fail_symbol(),
58                fail_message("Error while requesting your information."),
59            );
60            Err(e)
61        }
62    }
63}
64
65pub async fn me(env: Environment) -> Result<User> {
66    let token = get_smb_token(env).await?;
67
68    let response = Client::new()
69        .get(build_smb_info_url(env))
70        .header("Authorization", token)
71        .header("Accept", "application/json")
72        .header("Content-Type", "application/x-www-form-urlencoded")
73        .send()
74        .await?;
75
76    match response.status() {
77        StatusCode::OK => {
78            let user: User = response.json().await?;
79            Ok(user)
80        }
81        StatusCode::UNAUTHORIZED => Err(anyhow!("Invalid token. Please logout first.")),
82        _ => Err(anyhow!("Error while requesting your information.")),
83    }
84}
85
86fn build_smb_info_url(env: Environment) -> String {
87    let mut url_builder = smb_base_url_builder(env);
88    url_builder.add_route(PATH_USERS_ME);
89    url_builder.build()
90}