alfresco_sdk/alfresco/authentication_api/
mod.rs

1use reqwest::Client;
2use crate::models::structs::{TicketBodyCreate, TicketEntry, ValidTicketEntry};
3use base64::{Engine as _, engine::general_purpose};
4use crate::models::enums::TicketValidationResult;
5
6pub struct AuthenticationApi {
7    pub base_url: String,
8    pub client: Client,
9}
10
11impl AuthenticationApi {
12    pub fn new(base_url: &str, client: Client) -> Self {
13        AuthenticationApi {
14            base_url: format!("{}/alfresco/api/-default-/public/authentication/versions/1", base_url),
15            client,
16        }
17    }
18
19    pub async fn login(&self, user_id: &str, password: &str) -> Result<TicketEntry, anyhow::Error> {
20        let formatted_url = format!("{}/tickets", self.base_url);
21
22        let body = TicketBodyCreate {
23            user_id: Some(user_id.to_string()),
24            password: Some(password.to_string()),
25        };
26
27        let raw_response = self.client.post(&formatted_url)
28            .json(&body)
29            .send()
30            .await?;
31
32        let parsed = raw_response.json::<TicketEntry>().await?;
33
34        Ok(parsed)
35    }
36
37    pub async fn validate_ticket(&self, ticket: &str) -> Result<TicketValidationResult, anyhow::Error> {
38        let formatted_url = format!("{}/tickets/-me-", self.base_url);
39
40        let b64 = general_purpose::STANDARD.encode(ticket);
41        let raw_response = self.client.get(formatted_url)
42            .header("Authorization", &format!("Basic {}", b64))
43            .send()
44            .await?;
45
46        let status_code = raw_response.status().as_u16();
47
48        match status_code {
49            404 | 401 => Ok(TicketValidationResult::InvalidTicket),
50            _ => {
51                let parsed = raw_response.json::<ValidTicketEntry>().await?;
52                Ok(TicketValidationResult::Valid(parsed))
53            },
54        }
55    }
56
57    pub async fn logout(&self, ticket: &str) -> Result<(), anyhow::Error> {
58        let formatted_url = format!("{}/tickets/-me-", self.base_url);
59
60        let b64 = general_purpose::STANDARD.encode(ticket);
61        self.client.delete(formatted_url)
62            .header("Authorization", &format!("Basic {}", b64))
63            .send()
64            .await?;
65
66        Ok(())
67    }
68}