wompi_models/
oauth2.rs

1#[derive(Debug, Clone, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize)]
2#[serde(rename_all = "snake_case")]
3pub enum OAuth2FormParameter {
4    GrantType,
5    Audience,
6    ClientId,
7    ClientSecret,
8}
9
10#[derive(Debug, Clone, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize)]
11#[serde(rename_all = "snake_case")]
12pub enum OAuth2FormValue {
13    ClientCredentials,
14    WompiApi,
15    #[serde(untagged)]
16    ClientId(String),
17    #[serde(untagged)]
18    ClientSecret(String),
19}
20
21#[derive(serde::Deserialize, Clone)]
22pub struct OAuth2Response {
23    pub access_token: String,
24    pub expires_in: u64,
25    pub token_type: String,
26    pub scope: String,
27    #[serde(skip)]
28    pub expires_at: chrono::DateTime<chrono::Utc>,
29}
30impl OAuth2Response {
31    #[must_use]
32    pub fn calculate_expiry(self) -> Self {
33        let mut res = self;
34        res.expires_at = chrono::Utc::now() + std::time::Duration::from_secs(res.expires_in);
35        res
36    }
37    #[must_use]
38    pub fn is_expired(&self) -> bool {
39        self.expires_at - std::time::Duration::from_secs(120) < chrono::Utc::now()
40    }
41}
42
43#[derive(Debug, Clone, PartialEq, Eq, Hash, serde::Serialize)]
44pub struct OAuth2Form<P, V>
45where
46    P: serde::Serialize,
47    V: serde::Serialize,
48{
49    params: [(P, V); 4],
50}
51impl std::ops::Deref for OAuth2Form<OAuth2FormParameter, OAuth2FormValue> {
52    type Target = [(OAuth2FormParameter, OAuth2FormValue); 4];
53    fn deref(&self) -> &Self::Target {
54        &self.params
55    }
56}
57impl OAuth2Form<OAuth2FormParameter, OAuth2FormValue> {
58    #[must_use]
59    pub const fn new(client_id: String, client_secret: String) -> Self {
60        let client_id = OAuth2FormValue::ClientId(client_id);
61        let client_secret = OAuth2FormValue::ClientSecret(client_secret);
62        let params = [
63            (
64                OAuth2FormParameter::GrantType,
65                OAuth2FormValue::ClientCredentials,
66            ),
67            (OAuth2FormParameter::ClientId, client_id),
68            (OAuth2FormParameter::ClientSecret, client_secret),
69            (OAuth2FormParameter::Audience, OAuth2FormValue::WompiApi),
70        ];
71        Self { params }
72    }
73    pub fn new_from_env() -> Result<Self, std::env::VarError> {
74        let client_id = OAuth2FormValue::ClientId(std::env::var("WOMPI_APP_ID")?);
75        let client_secret = OAuth2FormValue::ClientSecret(std::env::var("WOMPI_CLIENT_SECRET")?);
76        let params = [
77            (
78                OAuth2FormParameter::GrantType,
79                OAuth2FormValue::ClientCredentials,
80            ),
81            (OAuth2FormParameter::ClientId, client_id),
82            (OAuth2FormParameter::ClientSecret, client_secret),
83            (OAuth2FormParameter::Audience, OAuth2FormValue::WompiApi),
84        ];
85        Ok(Self { params })
86    }
87}