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