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