Skip to content

Commit de2a9f2

Browse files
committed
Merge branch 'feature/organize-crud' into development
* feature/organize-crud: add update deployment update gemspec handle git branch errors organize crud pass around access_token move delete function add smbcloud-model gem add error code move to crate read use request it's called get_projects cleanup project crud project list is truncated
2 parents f933225 + 40f417f commit de2a9f2

32 files changed

+1160
-114
lines changed

crates/cli/src/deploy/config.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use git2::{Cred, CredentialType, Error};
66
use serde::{Deserialize, Serialize};
77
use smbcloud_model::{account::User, project::Project};
88
use smbcloud_networking::environment::Environment;
9-
use smbcloud_networking_project::crud_project_deployment_read::get_project;
9+
use smbcloud_networking_project::crud_project_read::get_project;
1010
use spinners::Spinner;
1111
use std::{fs, path::Path};
1212
use thiserror::Error;
@@ -103,6 +103,8 @@ impl Config {
103103

104104
#[derive(Error, Debug, PartialEq, Eq)]
105105
pub enum ConfigError {
106+
#[error("Missing token. Make sure you are logged in.")]
107+
MissingToken,
106108
#[error("Missing config file. Please regenerate with 'smb init'.")]
107109
MissingConfig,
108110
#[error("Missing id in repository. Please regenerate with 'smb init'.")]

crates/cli/src/deploy/mod.rs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,9 @@ pub async fn process_deploy(env: Environment) -> Result<CommandResult> {
5959
let commit_hash = match main_branch.resolve() {
6060
Ok(result) => match result.target() {
6161
Some(hash_id) => hash_id,
62-
None => todo!(),
62+
None => return Err(anyhow!("Should have at least one commit.")),
6363
},
64-
Err(_) => todo!(),
64+
Err(_) => return Err(anyhow!("Cannot resolve main branch.")),
6565
};
6666
let payload = DeploymentPayload {
6767
commit_hash: commit_hash.to_string(),
@@ -73,6 +73,13 @@ pub async fn process_deploy(env: Environment) -> Result<CommandResult> {
7373

7474
let mut push_opts = PushOptions::new();
7575
let mut callbacks = RemoteCallbacks::new();
76+
77+
// For updating status to failed
78+
let deployment_failed_flag = Arc::new(AtomicBool::new(false));
79+
let update_access_token = access_token.clone();
80+
let update_project_id = config.project.id.clone();
81+
let update_deployment_id = created_deployment.id.clone();
82+
7683
// Set the credentials
7784
callbacks.credentials(config.credentials(user));
7885
callbacks.sideband_progress(|data| {

crates/cli/src/deploy/setup.rs

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,10 @@ use crate::{
55
use dialoguer::{theme::ColorfulTheme, Confirm, Input, Select};
66
use regex::Regex;
77
use smbcloud_model::project::{Project, ProjectCreate};
8-
use smbcloud_networking::environment::Environment;
9-
use smbcloud_networking_project::{create_project, get_all};
8+
use smbcloud_networking::{environment::Environment, get_smb_token};
9+
use smbcloud_networking_project::{
10+
crud_project_create::create_project, crud_project_read::get_projects,
11+
};
1012
use std::{env, fs, path::Path};
1113

1214
pub async fn setup_project(env: Environment) -> Result<Config, ConfigError> {
@@ -25,7 +27,12 @@ pub async fn setup_project(env: Environment) -> Result<Config, ConfigError> {
2527
return Err(ConfigError::Cancel);
2628
}
2729

28-
let projects = match get_all(env).await {
30+
let access_token = match get_smb_token(env).await {
31+
Ok(token) => token,
32+
Err(_) => return Err(ConfigError::MissingToken),
33+
};
34+
35+
let projects = match get_projects(env, access_token).await {
2936
Ok(x) => x,
3037
Err(_) => return Err(ConfigError::InputError),
3138
};
@@ -126,8 +133,14 @@ async fn create_new_project(env: Environment, path: &str) -> Result<Project, Con
126133
}
127134
};
128135

136+
let access_token = match get_smb_token(env).await {
137+
Ok(token) => token,
138+
Err(_) => return Err(ConfigError::MissingToken),
139+
};
140+
129141
match create_project(
130142
env,
143+
access_token,
131144
ProjectCreate {
132145
name,
133146
repository,

crates/cli/src/project/crud_create.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ use anyhow::{anyhow, Result};
77
use console::style;
88
use dialoguer::{theme::ColorfulTheme, Input};
99
use smbcloud_model::project::ProjectCreate;
10-
use smbcloud_networking::environment::Environment;
11-
use smbcloud_networking_project::create_project;
10+
use smbcloud_networking::{environment::Environment, get_smb_token};
11+
use smbcloud_networking_project::crud_project_create::create_project;
1212
use spinners::Spinner;
1313

1414
pub async fn process_project_init(env: Environment) -> Result<CommandResult> {
@@ -51,8 +51,10 @@ pub async fn process_project_init(env: Environment) -> Result<CommandResult> {
5151
style("Creating a project...").green().bold().to_string(),
5252
);
5353

54+
let access_token = get_smb_token(env).await?;
5455
match create_project(
5556
env,
57+
access_token,
5658
ProjectCreate {
5759
name: project_name.clone(),
5860
repository,

crates/cli/src/project/crud_delete.rs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,19 @@
11
use crate::{
2+
account::lib::is_logged_in,
23
cli::CommandResult,
34
ui::{fail_message, fail_symbol, succeed_message, succeed_symbol},
45
};
5-
use anyhow::Result;
6+
use anyhow::{anyhow, Result};
67
use dialoguer::{theme::ColorfulTheme, Input};
7-
use smbcloud_networking::environment::Environment;
8-
use smbcloud_networking_project::delete_project;
8+
use smbcloud_networking::{environment::Environment, get_smb_token};
9+
use smbcloud_networking_project::crud_project_delete::delete_project;
910
use spinners::Spinner;
1011

1112
pub async fn process_project_delete(env: Environment, id: String) -> Result<CommandResult> {
13+
if !is_logged_in(env) {
14+
return Err(anyhow!(fail_message("Please log in with `smb init`.")));
15+
}
16+
1217
let confirmation = Input::<String>::with_theme(&ColorfulTheme::default())
1318
.with_prompt("Are you sure you want to delete this project? (y/n)")
1419
.interact()
@@ -26,7 +31,8 @@ pub async fn process_project_delete(env: Environment, id: String) -> Result<Comm
2631
msg: succeed_message("Cancelled."),
2732
});
2833
}
29-
match delete_project(env, id).await {
34+
let access_token = get_smb_token(env).await?;
35+
match delete_project(env, access_token, id).await {
3036
Ok(_) => Ok(CommandResult {
3137
spinner,
3238
symbol: succeed_symbol(),

crates/cli/src/project/crud_read.rs

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use anyhow::{anyhow, Result};
88
use log::debug;
99
use smbcloud_model::project::{Config, Project};
1010
use smbcloud_networking::{environment::Environment, get_smb_token};
11-
use smbcloud_networking_project::{crud_project_deployment_read::get_project, get_all};
11+
use smbcloud_networking_project::crud_project_read::{get_project, get_projects};
1212
use spinners::Spinner;
1313
use tabled::{Table, Tabled};
1414

@@ -22,6 +22,18 @@ struct ProjectRow {
2222
repository: String,
2323
#[tabled(rename = "Description")]
2424
description: String,
25+
}
26+
27+
#[derive(Tabled)]
28+
struct ProjectDetailRow {
29+
#[tabled(rename = "ID")]
30+
id: i32,
31+
#[tabled(rename = "Name")]
32+
name: String,
33+
#[tabled(rename = "Repository")]
34+
repository: String,
35+
#[tabled(rename = "Description")]
36+
description: String,
2537
#[tabled(rename = "Created at")]
2638
created_at: String,
2739
#[tabled(rename = "Updated at")]
@@ -33,8 +45,8 @@ pub async fn process_project_list(env: Environment) -> Result<CommandResult> {
3345
spinners::Spinners::SimpleDotsScrolling,
3446
succeed_message("Loading"),
3547
);
36-
37-
match get_all(env).await {
48+
let token = get_smb_token(env).await?;
49+
match get_projects(env, token).await {
3850
Ok(projects) => {
3951
spinner.stop_and_persist(&succeed_symbol(), succeed_message("Loaded."));
4052
let msg = if projects.is_empty() {
@@ -73,7 +85,7 @@ pub async fn process_project_show(env: Environment, id: String) -> Result<Comman
7385
Ok(project) => {
7486
spinner.stop_and_persist(&succeed_symbol(), succeed_message("Loaded."));
7587
let message = succeed_message(&format!("Showing project {}.", &project.name));
76-
show_projects(vec![project]);
88+
show_project_detail(&project);
7789
Ok(CommandResult {
7890
spinner: Spinner::new(
7991
spinners::Spinners::SimpleDotsScrolling,
@@ -101,14 +113,25 @@ pub(crate) fn show_projects(projects: Vec<Project>) {
101113
name: p.name,
102114
repository: p.repository,
103115
description: p.description.unwrap_or("-".to_owned()),
104-
created_at: p.created_at.date_naive().to_string(),
105-
updated_at: p.updated_at.date_naive().to_string(),
106116
})
107117
.collect();
108118
let table = Table::new(rows);
109119
println!("{table}");
110120
}
111121

122+
pub(crate) fn show_project_detail(project: &Project) {
123+
let row = ProjectDetailRow {
124+
id: project.id,
125+
name: project.name.clone(),
126+
repository: project.repository.clone(),
127+
description: project.description.clone().unwrap_or("-".to_owned()),
128+
created_at: project.created_at.date_naive().to_string(),
129+
updated_at: project.updated_at.date_naive().to_string(),
130+
};
131+
let table = Table::new(vec![row]);
132+
println!("{table}");
133+
}
134+
112135
pub(crate) async fn process_project_use(env: Environment, id: String) -> Result<CommandResult> {
113136
let access_token = get_smb_token(env).await?;
114137
let project = get_project(env, access_token, id).await?;

crates/smbcloud-model/src/error_codes.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,11 @@
11
use core::fmt;
2-
use std::{
3-
error::Error,
4-
fmt::{Display, Formatter},
5-
};
6-
72
use serde::{Deserialize, Serialize};
83
use serde_repr::{Deserialize_repr, Serialize_repr};
4+
use std::fmt::{Display, Formatter};
95
use strum_macros::EnumIter;
106
use thiserror::Error;
117

12-
#[derive(Serialize, Deserialize, Debug)]
8+
#[derive(Error, Serialize, Deserialize, Debug)]
139
#[serde(untagged)]
1410
pub enum ErrorResponse {
1511
Error {
@@ -18,8 +14,6 @@ pub enum ErrorResponse {
1814
},
1915
}
2016

21-
impl Error for ErrorResponse {}
22-
2317
impl Display for ErrorResponse {
2418
fn fmt(&self, f: &mut Formatter) -> fmt::Result {
2519
write!(f, "{:?}", self)
@@ -35,6 +29,9 @@ pub enum ErrorCode {
3529
ParseError = 1,
3630
#[error("Network error.")]
3731
NetworkError = 2,
32+
// Account
33+
#[error("Unauthorized access.")]
34+
Unauthorized = 100,
3835
// Projects
3936
#[error("Project not found.")]
4037
ProjectNotFound = 1000,
@@ -45,6 +42,8 @@ impl ErrorCode {
4542
/// so we need to get it from i32.
4643
pub fn from_i32(value: i32) -> Self {
4744
match value {
45+
// Account
46+
100 => ErrorCode::Unauthorized,
4847
// Projects
4948
1000 => ErrorCode::ProjectNotFound,
5049
// Fallback
@@ -62,6 +61,7 @@ impl ErrorCode {
6261
ErrorCode::ProjectNotFound => "Project not found.",
6362
ErrorCode::ParseError => "Parse error.",
6463
ErrorCode::NetworkError => "Network error.",
64+
ErrorCode::Unauthorized => "Unauthorized access.",
6565
}
6666
}
6767

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
use anyhow::Result;
2+
use reqwest::Client;
3+
use smbcloud_model::{
4+
error_codes::ErrorResponse,
5+
project::{Project, ProjectCreate},
6+
};
7+
use smbcloud_networking::{constants::SMB_USER_AGENT, environment::Environment, network::request};
8+
9+
use crate::build_project_url;
10+
11+
pub async fn create_project(
12+
env: Environment,
13+
access_token: String,
14+
project: ProjectCreate,
15+
) -> Result<Project, ErrorResponse> {
16+
let builder = Client::new()
17+
.post(build_project_url(env))
18+
.json(&project)
19+
.header("Authorization", access_token)
20+
.header("User-agent", SMB_USER_AGENT);
21+
request(builder).await
22+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
use crate::build_project_url_with_id;
2+
use reqwest::Client;
3+
use smbcloud_model::error_codes::ErrorResponse;
4+
use smbcloud_networking::{constants::SMB_USER_AGENT, environment::Environment, network::request};
5+
6+
pub async fn delete_project(
7+
env: Environment,
8+
access_token: String,
9+
id: String,
10+
) -> Result<(), ErrorResponse> {
11+
let builder = Client::new()
12+
.delete(build_project_url_with_id(env, id))
13+
.header("Authorization", access_token)
14+
.header("User-agent", SMB_USER_AGENT);
15+
request(builder).await
16+
}

crates/smbcloud-networking-project/src/crud_project_deployment_create.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use anyhow::{anyhow, Result};
33
use log::debug;
44
use reqwest::Client;
55
use smbcloud_model::project::{Deployment, DeploymentPayload};
6-
use smbcloud_networking::{environment::Environment, get_smb_token};
6+
use smbcloud_networking::{constants::SMB_USER_AGENT, environment::Environment, get_smb_token};
77

88
pub async fn create(
99
env: Environment,
@@ -19,7 +19,7 @@ pub async fn create(
1919
.post(build_project_deployment_index(env, project_id.to_string()))
2020
.json(&payload)
2121
.header("Authorization", token)
22-
.header("User-agent", "smbcloud-cli")
22+
.header("User-agent", SMB_USER_AGENT)
2323
.send()
2424
.await?;
2525

@@ -57,7 +57,7 @@ pub async fn update(
5757
.put(url)
5858
.json(&payload)
5959
.header("Authorization", token)
60-
.header("User-agent", "smbcloud-cli")
60+
.header("User-agent", SMB_USER_AGENT)
6161
.send()
6262
.await?;
6363

0 commit comments

Comments
 (0)