#[derive(Debug, Clone, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum OAuth2FormParameter {
GrantType,
Audience,
ClientId,
ClientSecret,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum OAuth2FormValue {
ClientCredentials,
WompiApi,
#[serde(untagged)]
ClientId(String),
#[serde(untagged)]
ClientSecret(String),
}
#[derive(serde::Deserialize, Clone)]
pub struct OAuth2Response {
pub access_token: String,
pub expires_in: u64,
pub token_type: String,
pub scope: String,
#[serde(skip)]
pub expires_at: chrono::DateTime<chrono::Utc>,
}
impl OAuth2Response {
#[must_use]
pub fn calculate_expiry(self) -> Self {
let mut res = self;
res.expires_at = chrono::Utc::now() + std::time::Duration::from_secs(res.expires_in);
res
}
#[must_use]
pub fn is_expired(&self) -> bool {
self.expires_at - std::time::Duration::from_secs(120) < chrono::Utc::now()
}
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, serde::Serialize)]
pub struct OAuth2Form<P, V>
where
P: serde::Serialize,
V: serde::Serialize,
{
params: [(P, V); 4],
}
impl std::ops::Deref for OAuth2Form<OAuth2FormParameter, OAuth2FormValue> {
type Target = [(OAuth2FormParameter, OAuth2FormValue); 4];
fn deref(&self) -> &Self::Target {
&self.params
}
}
impl OAuth2Form<OAuth2FormParameter, OAuth2FormValue> {
#[must_use]
pub const fn new(client_id: String, client_secret: String) -> Self {
let client_id = OAuth2FormValue::ClientId(client_id);
let client_secret = OAuth2FormValue::ClientSecret(client_secret);
let params = [
(
OAuth2FormParameter::GrantType,
OAuth2FormValue::ClientCredentials,
),
(OAuth2FormParameter::ClientId, client_id),
(OAuth2FormParameter::ClientSecret, client_secret),
(OAuth2FormParameter::Audience, OAuth2FormValue::WompiApi),
];
Self { params }
}
pub fn new_from_env() -> Result<Self, std::env::VarError> {
let client_id = OAuth2FormValue::ClientId(std::env::var("WOMPI_APP_ID")?);
let client_secret = OAuth2FormValue::ClientSecret(std::env::var("WOMPI_CLIENT_SECRET")?);
let params = [
(
OAuth2FormParameter::GrantType,
OAuth2FormValue::ClientCredentials,
),
(OAuth2FormParameter::ClientId, client_id),
(OAuth2FormParameter::ClientSecret, client_secret),
(OAuth2FormParameter::Audience, OAuth2FormValue::WompiApi),
];
Ok(Self { params })
}
}