1 use anyhow::{anyhow, Result};
2 use log::debug;
3 use reqwest::Client;
4 use smbpndk_model::{
5 self,
6 project::{Project, ProjectCreate},
7 };
8 use smbpndk_networking::{get_smb_token, smb_base_url_builder};
9
10 pub async fn get_all() -> Result<Vec<Project>> {
11 // Get current token
12 let token = get_smb_token().await?;
13
14 debug!("Current token: {}", token);
15
16 let response = Client::new()
17 .get(build_project_url())
18 .header("Authorization", token)
19 .header("User-agent", "smbpndk-cli")
20 .send()
21 .await?;
22
23 match response.status() {
24 reqwest::StatusCode::OK => {
25 let projects: Vec<Project> = response.json().await?;
26 Ok(projects)
27 }
28 _ => Err(anyhow!("Failed to fetch projects.")),
29 }
30 }
31
32 pub async fn create_project(project: ProjectCreate) -> Result<Project> {
33 // Get current token
34 let token = get_smb_token().await?;
35
36 let response = Client::new()
37 .post(build_project_url())
38 .json(&project)
39 .header("Authorization", token)
40 .send()
41 .await?;
42
43 match response.status() {
44 reqwest::StatusCode::CREATED => {
45 let project: Project = response.json().await?;
46 // println!("Project created: {project:#?}");
47 Ok(project)
48 }
49 _ => Err(anyhow!("Failed to create a project.")),
50 }
51 }
52
53 pub async fn get_project(id: String) -> Result<Project> {
54 // Get current token
55 let token = get_smb_token().await?;
56
57 let response = Client::new()
58 .get(build_project_url_with_id(id))
59 .header("Authorization", token)
60 .send()
61 .await?;
62
63 match response.status() {
64 reqwest::StatusCode::OK => {
65 let project: Project = response.json().await?;
66 //println!("Project requested: {project:#?}");
67 Ok(project)
68 }
69 _ => Err(anyhow!("Failed to request a project.")),
70 }
71 }
72
73 pub async fn delete_project(id: String) -> Result<()> {
74 // Get current token
75 let token = get_smb_token().await?;
76
77 let response = Client::new()
78 .delete(build_project_url_with_id(id))
79 .header("Authorization", token)
80 .send()
81 .await?;
82
83 match response.status() {
84 reqwest::StatusCode::OK => {
85 debug!("Project deleted.");
86 Ok(())
87 }
88 _ => Err(anyhow!("Failed to delete a project.")),
89 }
90 }
91
92 // Private functions
93
94 fn build_project_url() -> String {
95 let mut url_builder = smb_base_url_builder();
96 url_builder.add_route("v1/projects");
97 url_builder.build()
98 }
99
100 fn build_project_url_with_id(id: String) -> String {
101 let mut url_builder = smb_base_url_builder();
102 url_builder.add_route("v1/projects");
103 url_builder.add_route(id.as_str());
104 url_builder.build()
105 }