flagsmith_flag_engine/environments/
mod.rs

1use chrono::{DateTime, Utc};
2use serde::{Deserialize, Serialize};
3
4use super::features;
5use super::identities;
6use super::projects;
7use super::utils::datetime;
8pub mod builders;
9
10#[derive(Serialize, Deserialize, Debug, Clone)]
11pub struct Environment {
12    pub id: u32,
13    pub api_key: String,
14    pub project: projects::Project,
15    pub feature_states: Vec<features::FeatureState>,
16
17    #[serde(default)]
18    pub identity_overrides: Vec<identities::Identity>,
19}
20
21#[derive(Serialize, Deserialize, Debug)]
22pub struct EnvironmentAPIKey {
23    pub id: u32,
24    pub key: String,
25    pub active: bool,
26
27    #[serde(with = "datetime")]
28    pub created_at: DateTime<Utc>,
29    pub name: String,
30    pub client_api_key: String,
31    pub expires_at: Option<DateTime<Utc>>,
32}
33
34impl EnvironmentAPIKey {
35    pub fn is_valid(&self) -> bool {
36        if !self.active {
37            return false;
38        }
39        match self.expires_at {
40            None => return true,
41            Some(expires_at) if expires_at > Utc::now() => return true,
42            Some(_) => return false,
43        }
44    }
45}
46#[cfg(test)]
47mod tests {
48    use super::*;
49
50    #[test]
51    fn api_key_is_valid_returns_true_if_key_is_active_and_expired_is_null() {
52        let api_key_json = r#"{
53            "key": "ser.test_key",
54            "active": true,
55            "created_at": "2022-03-02T12:31:05.309861+00:00",
56            "client_api_key": "client_key",
57            "id": 1,
58            "name": "api key 1",
59            "expires_at": null
60        }"#;
61        let api_key: EnvironmentAPIKey = serde_json::from_str(api_key_json).unwrap();
62
63        assert!(api_key.is_valid())
64    }
65
66    #[test]
67    fn api_key_is_valid_returns_false_if_key_is_not_active() {
68        let api_key_json = r#"{
69            "key": "ser.test_key",
70            "active": false,
71            "created_at": "2022-03-02T12:31:05.309861+00:00",
72            "client_api_key": "client_key",
73            "id": 1,
74            "name": "api key 1",
75            "expires_at": null
76        }"#;
77        let api_key: EnvironmentAPIKey = serde_json::from_str(api_key_json).unwrap();
78
79        assert_eq!(api_key.is_valid(), false)
80    }
81
82    #[test]
83    fn api_key_is_valid_returns_false_if_key_is_active_but_expired() {
84        let api_key_json = r#"{
85            "key": "ser.test_key",
86            "active": true,
87            "created_at": "2022-03-02T12:31:05.309861+00:00",
88            "client_api_key": "client_key",
89            "id": 1,
90            "name": "api key 1",
91            "expires_at": "2022-03-02T12:32:05.309861+00:00"
92        }"#;
93        let api_key: EnvironmentAPIKey = serde_json::from_str(api_key_json).unwrap();
94
95        assert_eq!(api_key.is_valid(), false)
96    }
97}