smbcloud_cli/account/me/
mod.rs

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