smbpndk_networking_project/
lib.rs

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