@smbcloud / cli / commits / edfffb1

wip

Seto committed Sep 28, 2025 at 11:41 UTC edfffb1b8a04afce2c24590d28fdce7805ec4d00
19 files changed +145 -69
crates/cli/src/account/signup/process.rs
+9 -11
@@ -13,10 +13,7 @@ use {
13 serde::Serialize,
14 smbcloud_model::signup::SignupResult,
15 smbcloud_network::environment::Environment,
16 - smbcloud_networking::{
17 - constants::{PATH_USERS, SMB_USER_AGENT},
18 - smb_base_url_builder,
19 - },
16 + smbcloud_networking::{constants::PATH_USERS, smb_base_url_builder, smb_client::SmbClient},
17 smbcloud_networking_account::signup::signup,
18 smbcloud_utils::email_validation,
19 spinners::Spinner,
@@ -115,6 +112,7 @@ async fn signup_with_github(env: Environment) -> Result<CommandResult> {
112 }
113 }
114
115 +/// Signup with GitHub account.
116 pub async fn do_signup<T: Serialize + ?Sized>(env: Environment, args: &T) -> Result<CommandResult> {
117 let spinner = Spinner::new(
118 spinners::Spinners::BouncingBall,
@@ -147,12 +145,6 @@ pub async fn do_signup<T: Serialize + ?Sized>(env: Environment, args: &T) -> Res
145 }
146 }
147
150 -fn build_smb_signup_url(env: Environment) -> String {
151 - let mut url_builder = smb_base_url_builder(env);
152 - url_builder.add_route(PATH_USERS);
153 - url_builder.build()
154 -}
155 -
148 pub async fn do_signup_email(
149 env: Environment,
150 email: String,
@@ -163,7 +155,7 @@ pub async fn do_signup_email(
155 succeed_message("Signing you up"),
156 );
157
166 - match signup(env, SMB_USER_AGENT.to_string(), email, password).await {
158 + match signup(env, SmbClient::Cli, email, password).await {
159 Ok(_) => Ok(CommandResult {
160 spinner,
161 symbol: succeed_symbol(),
@@ -177,3 +169,9 @@ pub async fn do_signup_email(
169 }
170 }
171 }
172 +
173 +fn build_smb_signup_url(env: Environment) -> String {
174 + let mut url_builder = smb_base_url_builder(env);
175 + url_builder.add_route(PATH_USERS);
176 + url_builder.build()
177 +}
crates/smbcloud-model/src/signup.rs
+1 -1
@@ -1,5 +1,5 @@
1 use {
2 - crate::account::{Data, Status},
2 + crate::account::Data,
3 serde::{Deserialize, Serialize},
4 std::fmt::{Display, Formatter},
5 tsync::tsync,
crates/smbcloud-network/src/network.rs
+1 -1
@@ -11,7 +11,7 @@ use {
11
12 //use std::time::Duration;
13 #[cfg(debug_assertions)]
14 -const LOG_RESPONSE_BODY: bool = false; // You know what to do here.
14 +const LOG_RESPONSE_BODY: bool = true; // You know what to do here.
15 #[cfg(not(debug_assertions))]
16 const LOG_RESPONSE_BODY: bool = false;
17
crates/smbcloud-networking-account/src/check_email.rs
+11 -5
@@ -2,19 +2,25 @@ use {
2 reqwest::Client,
3 smbcloud_model::{account::SmbAuthorization, error_codes::ErrorResponse},
4 smbcloud_network::{environment::Environment, network::request},
5 - smbcloud_networking::{constants::PATH_USERS_CHECK_EMAIL, smb_base_url_builder},
5 + smbcloud_networking::{
6 + constants::PATH_USERS_CHECK_EMAIL, smb_base_url_builder, smb_client::SmbClient,
7 + },
8 };
9
8 -pub async fn check_email(env: Environment, email: &str) -> Result<SmbAuthorization, ErrorResponse> {
10 +pub async fn check_email(
11 + env: Environment,
12 + client: SmbClient,
13 + email: &str,
14 +) -> Result<SmbAuthorization, ErrorResponse> {
15 let builder = Client::new()
10 - .get(build_url(env, email))
16 + .get(build_url(env, &client, email))
17 .header("Accept", "application/json")
18 .header("Content-Type", "application/x-www-form-urlencoded");
19 request(builder).await
20 }
21
16 -fn build_url(env: Environment, email: &str) -> String {
17 - let mut url_builder = smb_base_url_builder(env);
22 +fn build_url(env: Environment, client: &SmbClient, email: &str) -> String {
23 + let mut url_builder = smb_base_url_builder(env, client);
24 url_builder.add_route(PATH_USERS_CHECK_EMAIL);
25 url_builder.add_param("email", email);
26 url_builder.build()
crates/smbcloud-networking-account/src/login.rs
+5 -3
@@ -8,11 +8,13 @@ use {
8 smbcloud_networking::{
9 constants::{PATH_USERS_SIGN_IN, SMB_USER_AGENT},
10 smb_base_url_builder,
11 + smb_client::SmbClient,
12 },
13 };
14
15 pub async fn login(
16 env: Environment,
17 + client: SmbClient,
18 username: String,
19 password: String,
20 ) -> Result<AccountStatus, ErrorResponse> {
@@ -23,14 +25,14 @@ pub async fn login(
25 },
26 };
27 let builder = Client::new()
26 - .post(build_smb_login_url(env))
28 + .post(build_smb_login_url(env, &client))
29 .json(&login_params)
30 .header("User-agent", SMB_USER_AGENT);
31 request_login(builder).await
32 }
33
32 -pub(crate) fn build_smb_login_url(env: Environment) -> String {
33 - let mut url_builder = smb_base_url_builder(env);
34 +pub(crate) fn build_smb_login_url(env: Environment, client: &SmbClient) -> String {
35 + let mut url_builder = smb_base_url_builder(env, client);
36 url_builder.add_route(PATH_USERS_SIGN_IN);
37 url_builder.build()
38 }
crates/smbcloud-networking-account/src/logout.rs
+11 -5
@@ -2,12 +2,18 @@ use {
2 reqwest::{Client, StatusCode},
3 smbcloud_model::error_codes::{ErrorCode, ErrorResponse},
4 smbcloud_network::environment::Environment,
5 - smbcloud_networking::{constants::PATH_USERS_SIGN_OUT, smb_base_url_builder},
5 + smbcloud_networking::{
6 + constants::PATH_USERS_SIGN_OUT, smb_base_url_builder, smb_client::SmbClient,
7 + },
8 };
9
8 -pub async fn logout(env: Environment, access_token: String) -> Result<(), ErrorResponse> {
10 +pub async fn logout(
11 + env: Environment,
12 + client: SmbClient,
13 + access_token: String,
14 +) -> Result<(), ErrorResponse> {
15 let response = match Client::new()
10 - .delete(build_smb_logout_url(env))
16 + .delete(build_smb_logout_url(env, &client))
17 .header("Authorization", access_token)
18 .header("Accept", "application/json")
19 .header("Content-Type", "application/x-www-form-urlencoded")
@@ -32,8 +38,8 @@ pub async fn logout(env: Environment, access_token: String) -> Result<(), ErrorR
38 }
39 }
40
35 -fn build_smb_logout_url(env: Environment) -> String {
36 - let mut url_builder = smb_base_url_builder(env);
41 +fn build_smb_logout_url(env: Environment, client: &SmbClient) -> String {
42 + let mut url_builder = smb_base_url_builder(env, client);
43 url_builder.add_route(PATH_USERS_SIGN_OUT);
44 url_builder.build()
45 }
crates/smbcloud-networking-account/src/me.rs
+9 -5
@@ -2,19 +2,23 @@ use reqwest::Client;
2 use smbcloud_model::account::User;
3 use smbcloud_model::error_codes::ErrorResponse;
4 use smbcloud_network::{environment::Environment, network::request};
5 -use smbcloud_networking::{constants::PATH_USERS_ME, smb_base_url_builder};
5 +use smbcloud_networking::{constants::PATH_USERS_ME, smb_base_url_builder, smb_client::SmbClient};
6
7 -pub async fn me(env: Environment, access_token: &str) -> Result<User, ErrorResponse> {
7 +pub async fn me(
8 + env: Environment,
9 + client: SmbClient,
10 + access_token: &str,
11 +) -> Result<User, ErrorResponse> {
12 let builder = Client::new()
9 - .get(build_smb_info_url(env))
13 + .get(build_smb_info_url(env, &client))
14 .header("Authorization", access_token)
15 .header("Accept", "application/json")
16 .header("Content-Type", "application/x-www-form-urlencoded");
17 request(builder).await
18 }
19
16 -fn build_smb_info_url(env: Environment) -> String {
17 - let mut url_builder = smb_base_url_builder(env);
20 +fn build_smb_info_url(env: Environment, client: &SmbClient) -> String {
21 + let mut url_builder = smb_base_url_builder(env, client);
22 url_builder.add_route(PATH_USERS_ME);
23 url_builder.build()
24 }
crates/smbcloud-networking-account/src/signup.rs
+6 -6
@@ -5,12 +5,12 @@ use {
5 signup::{SignupEmailParams, SignupResult, SignupUserEmail},
6 },
7 smbcloud_network::{environment::Environment, network::request},
8 - smbcloud_networking::{constants::PATH_USERS, smb_base_url_builder},
8 + smbcloud_networking::{constants::PATH_USERS, smb_base_url_builder, smb_client::SmbClient},
9 };
10
11 pub async fn signup(
12 env: Environment,
13 - user_agent: String,
13 + client: SmbClient,
14 email: String,
15 password: String,
16 ) -> Result<SignupResult, ErrorResponse> {
@@ -18,14 +18,14 @@ pub async fn signup(
18 user: SignupUserEmail { email, password },
19 };
20 let builder = Client::new()
21 - .post(build_smb_signup_url(env))
21 + .post(build_smb_signup_url(env, &client))
22 .json(&params)
23 - .header("User-agent", user_agent);
23 + .header("User-agent", client.id());
24 request(builder).await
25 }
26
27 -fn build_smb_signup_url(env: Environment) -> String {
28 - let mut url_builder = smb_base_url_builder(env);
27 +fn build_smb_signup_url(env: Environment, client: &SmbClient) -> String {
28 + let mut url_builder = smb_base_url_builder(env, client);
29 url_builder.add_route(PATH_USERS);
30 url_builder.build()
31 }
crates/smbcloud-networking-project/src/crud_project_create.rs
+3 -2
@@ -5,17 +5,18 @@ use smbcloud_model::{
5 project::{Project, ProjectCreate},
6 };
7 use smbcloud_network::{environment::Environment, network::request};
8 -use smbcloud_networking::constants::SMB_USER_AGENT;
8 +use smbcloud_networking::{constants::SMB_USER_AGENT, smb_client::SmbClient};
9
10 use crate::url_builder::build_project_url;
11
12 pub async fn create_project(
13 env: Environment,
14 + client: SmbClient,
15 access_token: String,
16 project: ProjectCreate,
17 ) -> Result<Project, ErrorResponse> {
18 let builder = Client::new()
18 - .post(build_project_url(env))
19 + .post(build_project_url(env, &client))
20 .json(&project)
21 .header("Authorization", access_token)
22 .header("User-agent", SMB_USER_AGENT);
crates/smbcloud-networking-project/src/crud_project_delete.rs
+3 -2
@@ -2,15 +2,16 @@ use crate::url_builder::build_project_url_with_id;
2 use reqwest::Client;
3 use smbcloud_model::error_codes::ErrorResponse;
4 use smbcloud_network::{environment::Environment, network::request};
5 -use smbcloud_networking::constants::SMB_USER_AGENT;
5 +use smbcloud_networking::{constants::SMB_USER_AGENT, smb_client::SmbClient};
6
7 pub async fn delete_project(
8 env: Environment,
9 + client: SmbClient,
10 access_token: String,
11 id: String,
12 ) -> Result<(), ErrorResponse> {
13 let builder = Client::new()
13 - .delete(build_project_url_with_id(env, id))
14 + .delete(build_project_url_with_id(env, &client, id))
15 .header("Authorization", access_token)
16 .header("User-agent", SMB_USER_AGENT);
17 request(builder).await
crates/smbcloud-networking-project/src/crud_project_deployment_create.rs
+7 -2
@@ -6,16 +6,21 @@ use smbcloud_model::{
6 project::{Deployment, DeploymentPayload},
7 };
8 use smbcloud_network::{environment::Environment, network::request};
9 -use smbcloud_networking::constants::SMB_USER_AGENT;
9 +use smbcloud_networking::{constants::SMB_USER_AGENT, smb_client::SmbClient};
10
11 pub async fn create_deployment(
12 env: Environment,
13 + client: SmbClient,
14 access_token: &str,
15 project_id: i32,
16 payload: DeploymentPayload,
17 ) -> Result<Deployment, ErrorResponse> {
18 let builder = Client::new()
18 - .post(build_project_deployment_index(env, project_id.to_string()))
19 + .post(build_project_deployment_index(
20 + env,
21 + &client,
22 + project_id.to_string(),
23 + ))
24 .json(&payload)
25 .header("Authorization", access_token)
26 .header("User-agent", SMB_USER_AGENT);
crates/smbcloud-networking-project/src/crud_project_deployment_read.rs
+9 -2
@@ -3,15 +3,20 @@ use anyhow::Result;
3 use reqwest::Client;
4 use smbcloud_model::{error_codes::ErrorResponse, project::Deployment};
5 use smbcloud_network::{environment::Environment, network::request};
6 -use smbcloud_networking::constants::SMB_USER_AGENT;
6 +use smbcloud_networking::{constants::SMB_USER_AGENT, smb_client::SmbClient};
7
8 pub async fn get_deployments(
9 env: Environment,
10 + client: SmbClient,
11 access_token: String,
12 project_id: i32,
13 ) -> Result<Vec<Deployment>, ErrorResponse> {
14 let builder = Client::new()
14 - .get(build_project_deployment_index(env, project_id.to_string()))
15 + .get(build_project_deployment_index(
16 + env,
17 + &client,
18 + project_id.to_string(),
19 + ))
20 .header("Authorization", access_token)
21 .header("User-agent", SMB_USER_AGENT);
22 request(builder).await
@@ -19,6 +24,7 @@ pub async fn get_deployments(
24
25 pub async fn get_deployment(
26 env: Environment,
27 + client: SmbClient,
28 access_token: String,
29 project_id: i32,
30 deployment_id: i32,
@@ -26,6 +32,7 @@ pub async fn get_deployment(
32 let builder = Client::new()
33 .get(build_project_deployment(
34 env,
35 + &client,
36 project_id.to_string(),
37 deployment_id.to_string(),
38 ))
crates/smbcloud-networking-project/src/crud_project_deployment_update.rs
+8 -2
@@ -5,18 +5,24 @@ use smbcloud_model::{
5 project::{Deployment, DeploymentPayload},
6 };
7 use smbcloud_network::{environment::Environment, network::request};
8 -use smbcloud_networking::constants::SMB_USER_AGENT;
8 +use smbcloud_networking::{constants::SMB_USER_AGENT, smb_client::SmbClient};
9
10 use crate::url_builder::build_project_deployment;
11
12 pub async fn update(
13 env: Environment,
14 + client: SmbClient,
15 access_token: String,
16 project_id: i32,
17 deployment_id: i32,
18 status: DeploymentPayload,
19 ) -> Result<Deployment, ErrorResponse> {
19 - let url = build_project_deployment(env, project_id.to_string(), deployment_id.to_string());
20 + let url = build_project_deployment(
21 + env,
22 + &client,
23 + project_id.to_string(),
24 + deployment_id.to_string(),
25 + );
26 let builder = Client::new()
27 .put(url)
28 .json(&status)
crates/smbcloud-networking-project/src/crud_project_read.rs
+5 -3
@@ -3,16 +3,17 @@ use {
3 reqwest::Client,
4 smbcloud_model::{error_codes::ErrorResponse, project::Project},
5 smbcloud_network::{environment::Environment, network::request},
6 - smbcloud_networking::constants::SMB_USER_AGENT,
6 + smbcloud_networking::{constants::SMB_USER_AGENT, smb_client::SmbClient},
7 };
8
9 pub async fn get_project(
10 env: Environment,
11 + client: SmbClient,
12 access_token: String,
13 id: String,
14 ) -> Result<Project, ErrorResponse> {
15 let builder: reqwest::RequestBuilder = Client::new()
15 - .get(build_project_url_with_id(env, id))
16 + .get(build_project_url_with_id(env, &client, id))
17 .header("Authorization", access_token)
18 .header("User-agent", SMB_USER_AGENT);
19 request(builder).await
@@ -20,10 +21,11 @@ pub async fn get_project(
21
22 pub async fn get_projects(
23 env: Environment,
24 + client: SmbClient,
25 access_token: String,
26 ) -> Result<Vec<Project>, ErrorResponse> {
27 let builder = Client::new()
26 - .get(build_project_url(env))
28 + .get(build_project_url(env, &client))
29 .header("Authorization", access_token)
30 .header("User-agent", SMB_USER_AGENT);
31 request(builder).await
crates/smbcloud-networking-project/src/crud_project_update.rs
+3 -2
@@ -2,16 +2,17 @@ use crate::url_builder::build_project_url_with_id;
2 use reqwest::Client;
3 use smbcloud_model::{error_codes::ErrorResponse, project::Project};
4 use smbcloud_network::{environment::Environment, network::request};
5 -use smbcloud_networking::constants::SMB_USER_AGENT;
5 +use smbcloud_networking::{constants::SMB_USER_AGENT, smb_client::SmbClient};
6
7 pub async fn update_project_description(
8 env: Environment,
9 + client: SmbClient,
10 access_token: String,
11 project_id: String,
12 new_description: &str,
13 ) -> Result<Project, ErrorResponse> {
14 // PATCH is correct for partial update of description
14 - let url = build_project_url_with_id(env, project_id.to_string());
15 + let url = build_project_url_with_id(env, &client, project_id.to_string());
16 let builder = Client::new()
17 .patch(url)
18 .header("Authorization", access_token)
crates/smbcloud-networking-project/src/url_builder.rs
+25 -10
@@ -1,31 +1,46 @@
1 -use smbcloud_network::environment::Environment;
2 -use smbcloud_networking::smb_base_url_builder;
1 +use {
2 + smbcloud_network::environment::Environment,
3 + smbcloud_networking::{smb_base_url_builder, smb_client::SmbClient},
4 +};
5
6 // Private functions
7
6 -pub(crate) fn build_project_url(env: Environment) -> String {
7 - let mut url_builder = smb_base_url_builder(env);
8 +pub(crate) fn build_project_url(env: Environment, client: &SmbClient) -> String {
9 + let mut url_builder = smb_base_url_builder(env, client);
10 url_builder.add_route("v1/projects");
11 url_builder.build()
12 }
13
12 -pub(crate) fn build_project_url_with_id(env: Environment, id: String) -> String {
13 - let mut url_builder = smb_base_url_builder(env);
14 +pub(crate) fn build_project_url_with_id(
15 + env: Environment,
16 + client: &SmbClient,
17 + id: String,
18 +) -> String {
19 + let mut url_builder = smb_base_url_builder(env, client);
20 url_builder.add_route("v1/projects");
21 url_builder.add_route(id.as_str());
22 url_builder.build()
23 }
24
19 -pub(crate) fn build_project_deployment_index(env: Environment, project_id: String) -> String {
20 - let mut url_builder = smb_base_url_builder(env);
25 +pub(crate) fn build_project_deployment_index(
26 + env: Environment,
27 + client: &SmbClient,
28 + project_id: String,
29 +) -> String {
30 + let mut url_builder = smb_base_url_builder(env, client);
31 url_builder.add_route("v1/projects");
32 url_builder.add_route(project_id.as_str());
33 url_builder.add_route("deployment");
34 url_builder.build()
35 }
36
27 -pub(crate) fn build_project_deployment(env: Environment, project_id: String, id: String) -> String {
28 - let mut url_builder = smb_base_url_builder(env);
37 +pub(crate) fn build_project_deployment(
38 + env: Environment,
39 + client: &SmbClient,
40 + project_id: String,
41 + id: String,
42 +) -> String {
43 + let mut url_builder = smb_base_url_builder(env, client);
44 url_builder.add_route("v1/projects");
45 url_builder.add_route(project_id.as_str());
46 url_builder.add_route("deployment");
crates/smbcloud-networking/src/constants.rs
+2 -2
@@ -7,8 +7,8 @@ pub const GH_OAUTH_REDIRECT_HOST: &str = "http://localhost";
7 pub const GH_OAUTH_REDIRECT_PORT: &str = "8808";
8
9 pub const SMB_CLIENT_ID: &str = "cli";
10 -pub const SMB_CLIENT_SECRET: &str = "YOUR_SMB_CLIENT_SECRET";
11 -pub const SMB_USER_AGENT: &str = "YOUR_SMB_USER_AGENT";
10 +pub const SMB_CLIENT_SECRET: &str = "secretttttttt";
11 +pub const SMB_USER_AGENT: &str = "smbcloud-cli";
12
13 // Paths
14 pub const PATH_USERS_CHECK_EMAIL: &str = "v1/check_email";
crates/smbcloud-networking/src/lib.rs
+5 -5
@@ -1,17 +1,17 @@
1 pub mod constants;
2 +pub mod smb_client;
3
4 use {
4 - constants::{SMB_CLIENT_ID, SMB_CLIENT_SECRET},
5 - smbcloud_network::environment::Environment,
5 + crate::smb_client::SmbClient, smbcloud_network::environment::Environment,
6 url_builder::URLBuilder,
7 };
8
9 -pub fn smb_base_url_builder(env: Environment) -> URLBuilder {
9 +pub fn smb_base_url_builder(env: Environment, client: &SmbClient) -> URLBuilder {
10 let mut url_builder = URLBuilder::new();
11 url_builder
12 .set_protocol(&env.api_protocol())
13 .set_host(&env.api_host())
14 - .add_param("client_id", SMB_CLIENT_ID)
15 - .add_param("client_secret", SMB_CLIENT_SECRET);
14 + .add_param("client_id", client.id())
15 + .add_param("client_secret", client.secret());
16 url_builder
17 }
crates/smbcloud-networking/src/smb_client.rs new
+22
@@ -0,0 +1,22 @@
1 +pub enum SmbClient {
2 + Cli,
3 + Sigit,
4 + WebConsole,
5 +}
6 +
7 +impl SmbClient {
8 + pub fn id(&self) -> &str {
9 + match self {
10 + SmbClient::Cli => "CLI_CLIENT_ID",
11 + SmbClient::Sigit => "SIGIT_CLIENT_ID",
12 + SmbClient::WebConsole => "WEB_CONSOLE_CLIENT_ID",
13 + }
14 + }
15 + pub fn secret(&self) -> &str {
16 + match self {
17 + SmbClient::Cli => "CLI_CLIENT_SECRET",
18 + SmbClient::Sigit => "SIGIT_CLIENT_SECRET",
19 + SmbClient::WebConsole => "WEB_CONSOLE_CLIENT_SECRET",
20 + }
21 + }
22 +}