iggy_cli/commands/binary_system/
login.rs1use crate::commands::binary_system::session::ServerSession;
20use crate::commands::cli_command::{CliCommand, PRINT_TARGET};
21use crate::commands::utils::login_session_expiry::LoginSessionExpiry;
22use anyhow::Context;
23use async_trait::async_trait;
24use iggy_common::Client;
25use iggy_common::SEC_IN_MICRO;
26use tracing::{Level, event};
27
28const DEFAULT_LOGIN_SESSION_TIMEOUT: u64 = SEC_IN_MICRO * 15 * 60;
29
30pub struct LoginCmd {
31 server_session: ServerSession,
32 login_session_expiry: Option<LoginSessionExpiry>,
33}
34
35impl LoginCmd {
36 pub fn new(server_address: String, login_session_expiry: Option<LoginSessionExpiry>) -> Self {
37 Self {
38 server_session: ServerSession::new(server_address),
39 login_session_expiry,
40 }
41 }
42}
43
44#[async_trait]
45impl CliCommand for LoginCmd {
46 fn explain(&self) -> String {
47 "login command".to_owned()
48 }
49
50 async fn execute_cmd(&mut self, client: &dyn Client) -> anyhow::Result<(), anyhow::Error> {
51 if self.server_session.is_active() {
52 event!(target: PRINT_TARGET, Level::INFO, "Already logged into Iggy server {}", self.server_session.get_server_address());
53 return Ok(());
54 }
55
56 let tokens = client.get_personal_access_tokens().await.with_context(|| {
57 format!(
58 "Problem getting personal access tokens from server: {}",
59 self.server_session.get_server_address()
60 )
61 })?;
62
63 if let Some(token) = tokens
67 .iter()
68 .find(|pat| pat.name == self.server_session.get_token_name())
69 {
70 client
71 .delete_personal_access_token(&token.name)
72 .await
73 .with_context(|| {
74 format!(
75 "Problem deleting old personal access token with name: {}",
76 self.server_session.get_token_name()
77 )
78 })?;
79 }
80
81 let token = client
82 .create_personal_access_token(
83 &self.server_session.get_token_name(),
84 match &self.login_session_expiry {
85 None => Some(DEFAULT_LOGIN_SESSION_TIMEOUT).into(),
86 Some(value) => *value,
87 },
88 )
89 .await
90 .with_context(|| {
91 format!(
92 "Problem creating personal access token with name: {}",
93 self.server_session.get_token_name()
94 )
95 })?;
96
97 self.server_session.store(&token.token)?;
98
99 event!(target: PRINT_TARGET, Level::INFO,
100 "Successfully logged into Iggy server {}",
101 self.server_session.get_server_address(),
102 );
103
104 Ok(())
105 }
106}