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