smbcloud_cli/account/logout/
mod.rs

1use crate::token::{get_smb_token, smb_token_file_path};
2use anyhow::{anyhow, Result};
3use dialoguer::{theme::ColorfulTheme, Confirm};
4use reqwest::{Client, StatusCode};
5use smbcloud_network::environment::Environment;
6use smbcloud_networking::{constants::PATH_USERS_SIGN_OUT, smb_base_url_builder};
7use spinners::Spinner;
8use std::fs;
9
10use crate::{
11    cli::CommandResult,
12    ui::{fail_message, fail_symbol, succeed_message, succeed_symbol},
13};
14
15pub async fn process_logout(env: Environment) -> Result<CommandResult> {
16    // Logout if user confirms
17    if let Some(token_path) = smb_token_file_path(env) {
18        let confirm = match Confirm::with_theme(&ColorfulTheme::default())
19            .with_prompt("Do you want to logout? y/n")
20            .interact()
21        {
22            Ok(confirm) => confirm,
23            Err(_) => {
24                let error = anyhow!("Invalid input.");
25                return Err(error);
26            }
27        };
28        if !confirm {
29            return Ok(CommandResult {
30                spinner: Spinner::new(
31                    spinners::Spinners::SimpleDotsScrolling,
32                    succeed_message("Cancel operation"),
33                ),
34                symbol: succeed_symbol(),
35                msg: succeed_message("Doing nothing."),
36            });
37        }
38
39        let spinner = Spinner::new(
40            spinners::Spinners::SimpleDotsScrolling,
41            succeed_message("Logging you out"),
42        );
43
44        // Call backend
45        match do_process_logout(env).await {
46            Ok(_) => {
47                fs::remove_file(token_path)?;
48                Ok(CommandResult {
49                    spinner,
50                    symbol: succeed_symbol(),
51                    msg: succeed_message("You are logged out!"),
52                })
53            }
54            Err(e) => Err(anyhow!("{e}")),
55        }
56    } else {
57        Ok(CommandResult {
58            spinner: Spinner::new(
59                spinners::Spinners::SimpleDotsScrolling,
60                succeed_message("Loading"),
61            ),
62            symbol: fail_symbol(),
63            msg: fail_message("You are not logged in. Please login first."),
64        })
65    }
66}
67
68async fn do_process_logout(env: Environment) -> Result<()> {
69    let token = get_smb_token(env).await?;
70
71    let response = Client::new()
72        .delete(build_smb_logout_url(env))
73        .header("Authorization", token)
74        .header("Accept", "application/json")
75        .header("Content-Type", "application/x-www-form-urlencoded")
76        .send()
77        .await?;
78
79    match response.status() {
80        StatusCode::OK => Ok(()),
81        _ => Err(anyhow!("Failed to logout.")),
82    }
83}
84
85fn build_smb_logout_url(env: Environment) -> String {
86    let mut url_builder = smb_base_url_builder(env);
87    url_builder.add_route(PATH_USERS_SIGN_OUT);
88    url_builder.build()
89}