smbcloud_cli/account/me/
mod.rs1use 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}