smbcloud_cli/account/logout/
mod.rs

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