3 files changed
+33
-34
crates/cli/src/project/crud_delete.rs
+9
-5
@@ -1,14 +1,17 @@
1
use crate::{
2
- cli::CommandResult,
3
- ui::{fail_message, fail_symbol, succeed_message, succeed_symbol},
2
+ account::lib::is_logged_in, cli::CommandResult, ui::{fail_message, fail_symbol, succeed_message, succeed_symbol}
3
};
5
-use anyhow::Result;
4
+use anyhow::{anyhow, Result};
5
use dialoguer::{theme::ColorfulTheme, Input};
7
-use smbcloud_networking::environment::Environment;
6
+use smbcloud_networking::{environment::Environment, get_smb_token};
7
use smbcloud_networking_project::delete_project;
8
use spinners::Spinner;
9
10
pub async fn process_project_delete(env: Environment, id: String) -> Result<CommandResult> {
11
+ if !is_logged_in(env) {
12
+ return Err(anyhow!(fail_message("Please log in with `smb init`.")));
13
+ }
14
+
15
let confirmation = Input::<String>::with_theme(&ColorfulTheme::default())
16
.with_prompt("Are you sure you want to delete this project? (y/n)")
17
.interact()
@@ -26,7 +29,8 @@ pub async fn process_project_delete(env: Environment, id: String) -> Result<Comm
29
msg: succeed_message("Cancelled."),
30
});
31
}
29
- match delete_project(env, id).await {
32
+ let access_token = get_smb_token(env).await?;
33
+ match delete_project(env, access_token, id).await {
34
Ok(_) => Ok(CommandResult {
35
spinner,
36
symbol: succeed_symbol(),
crates/smbcloud-model/src/error_codes.rs
+8
-8
@@ -1,15 +1,11 @@
1
use core::fmt;
2
-use std::{
3
- error::Error,
4
- fmt::{Display, Formatter},
5
-};
6
-
2
+use std::fmt::{Display, Formatter};
3
use serde::{Deserialize, Serialize};
4
use serde_repr::{Deserialize_repr, Serialize_repr};
5
use strum_macros::EnumIter;
6
use thiserror::Error;
7
12
-#[derive(Serialize, Deserialize, Debug)]
8
+#[derive(Error, Serialize, Deserialize, Debug)]
9
#[serde(untagged)]
10
pub enum ErrorResponse {
11
Error {
@@ -18,8 +14,6 @@ pub enum ErrorResponse {
14
},
15
}
16
21
-impl Error for ErrorResponse {}
22
-
17
impl Display for ErrorResponse {
18
fn fmt(&self, f: &mut Formatter) -> fmt::Result {
19
write!(f, "{:?}", self)
@@ -35,6 +29,9 @@ pub enum ErrorCode {
29
ParseError = 1,
30
#[error("Network error.")]
31
NetworkError = 2,
32
+ // Account
33
+ #[error("Unauthorized access.")]
34
+ Unauthorized = 100,
35
// Projects
36
#[error("Project not found.")]
37
ProjectNotFound = 1000,
@@ -45,6 +42,8 @@ impl ErrorCode {
42
/// so we need to get it from i32.
43
pub fn from_i32(value: i32) -> Self {
44
match value {
45
+ // Account
46
+ 100 => ErrorCode::Unauthorized,
47
// Projects
48
1000 => ErrorCode::ProjectNotFound,
49
// Fallback
@@ -62,6 +61,7 @@ impl ErrorCode {
61
ErrorCode::ProjectNotFound => "Project not found.",
62
ErrorCode::ParseError => "Parse error.",
63
ErrorCode::NetworkError => "Network error.",
64
+ ErrorCode::Unauthorized => "Unauthorized access."
65
}
66
}
67
crates/smbcloud-networking-project/src/lib.rs
+16
-21
@@ -5,10 +5,14 @@ pub mod crud_project_deployment_update;
5
pub mod crud_project_read;
6
7
use anyhow::{anyhow, Result};
8
-use log::debug;
9
-use reqwest::{Client, StatusCode};
10
-use smbcloud_model::project::{Project, ProjectCreate};
11
-use smbcloud_networking::{environment::Environment, get_smb_token, smb_base_url_builder};
8
+use reqwest::Client;
9
+use smbcloud_model::{
10
+ error_codes::ErrorResponse,
11
+ project::{Project, ProjectCreate},
12
+};
13
+use smbcloud_networking::{
14
+ environment::Environment, get_smb_token, network::request, smb_base_url_builder,
15
+};
16
17
pub async fn create_project(env: Environment, project: ProjectCreate) -> Result<Project> {
18
// Get current token
@@ -31,24 +35,15 @@ pub async fn create_project(env: Environment, project: ProjectCreate) -> Result<
35
}
36
}
37
34
-pub async fn delete_project(env: Environment, id: String) -> Result<()> {
35
- // Get current token
36
- let token = get_smb_token(env).await?;
37
-
38
- let response = Client::new()
38
+pub async fn delete_project(
39
+ env: Environment,
40
+ access_token: String,
41
+ id: String,
42
+) -> Result<(), ErrorResponse> {
43
+ let builder = Client::new()
44
.delete(build_project_url_with_id(env, id))
40
- .header("Authorization", token)
41
- .send()
42
- .await?;
43
-
44
- match response.status() {
45
- StatusCode::OK => {
46
- debug!("Project deleted.");
47
- Ok(())
48
- }
49
- StatusCode::NOT_FOUND => Err(anyhow!("Failed to delete a project: project not found.")),
50
- _ => Err(anyhow!("Failed to delete a project: unknown error.")),
51
- }
45
+ .header("Authorization", access_token);
46
+ request(builder).await
47
}
48
49
// Private functions