Skip to main content

egs_api/api/types/
cosmos.rs

1use serde::{Deserialize, Serialize};
2
3/// Response from `GET /api/cosmos/auth` — session upgrade result.
4///
5/// After calling `set-sid`, this endpoint upgrades the bearer token and
6/// issues EPIC_EG1 / EPIC_EG1_REFRESH JWTs (set as cookies) required
7/// by all other `/api/cosmos/*` endpoints.
8#[allow(missing_docs)]
9#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
10#[serde(rename_all = "camelCase")]
11pub struct CosmosAuthResponse {
12    pub bearer_token_valid: bool,
13    pub cleared_offline: bool,
14    pub upgraded_bearer_token: bool,
15    pub account_id: String,
16}
17
18/// Error response from Cosmos when not authenticated.
19///
20/// Returned as `{"error": "Not logged in", "isLoggedIn": false}`
21/// when EPIC_EG1 cookie is missing or expired.
22#[allow(missing_docs)]
23#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
24#[serde(rename_all = "camelCase")]
25pub struct CosmosAuthError {
26    pub error: String,
27    pub is_logged_in: bool,
28}
29
30/// Response from `GET /api/cosmos/account` — account info.
31#[allow(missing_docs)]
32#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
33#[serde(rename_all = "camelCase")]
34pub struct CosmosAccount {
35    pub country: String,
36    pub display_name: String,
37    pub email: String,
38    pub id: String,
39    pub preferred_language: String,
40    pub cabined_mode: bool,
41    pub is_logged_in: bool,
42}
43
44/// Response from `GET/POST /api/cosmos/eula/accept`.
45///
46/// GET checks if a EULA is accepted; POST accepts it.
47/// Known EULA IDs: `unreal_engine`, `unreal_engine2`, `realityscan`, `mhc`, `content`
48#[allow(missing_docs)]
49#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
50#[serde(rename_all = "camelCase")]
51pub struct CosmosEulaResponse {
52    pub accepted: bool,
53}
54
55/// Response from `GET /api/cosmos/policy/aodc` — Age of Digital Consent.
56#[allow(missing_docs)]
57#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
58#[serde(rename_all = "camelCase")]
59pub struct CosmosPolicyAodc {
60    pub failed: bool,
61}
62
63/// Response from `GET /api/cosmos/communication/opt-in`.
64#[allow(missing_docs)]
65#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
66#[serde(rename_all = "camelCase")]
67pub struct CosmosCommOptIn {
68    pub setting_value: bool,
69}
70
71#[cfg(test)]
72mod tests {
73    use super::*;
74
75    #[test]
76    fn deserialize_cosmos_auth() {
77        let json = r#"{"bearerTokenValid":true,"clearedOffline":false,"upgradedBearerToken":true,"accountId":"8645b4947bbc4c0092a8b7236df169d1"}"#;
78        let auth: CosmosAuthResponse = serde_json::from_str(json).unwrap();
79        assert!(auth.bearer_token_valid);
80        assert!(auth.upgraded_bearer_token);
81        assert_eq!(auth.account_id, "8645b4947bbc4c0092a8b7236df169d1");
82    }
83
84    #[test]
85    fn deserialize_cosmos_auth_error() {
86        let json = r#"{"error":"Not logged in","isLoggedIn":false}"#;
87        let err: CosmosAuthError = serde_json::from_str(json).unwrap();
88        assert_eq!(err.error, "Not logged in");
89        assert!(!err.is_logged_in);
90    }
91
92    #[test]
93    fn deserialize_cosmos_eula() {
94        let json = r#"{"accepted":true}"#;
95        let eula: CosmosEulaResponse = serde_json::from_str(json).unwrap();
96        assert!(eula.accepted);
97    }
98
99    #[test]
100    fn deserialize_cosmos_account() {
101        let json = r#"{"country":"CZ","displayName":"Acheta Games","email":"m***n@stastnej.ch","id":"8645b4947bbc4c0092a8b7236df169d1","preferredLanguage":"en","cabinedMode":false,"isLoggedIn":true}"#;
102        let account: CosmosAccount = serde_json::from_str(json).unwrap();
103        assert_eq!(account.country, "CZ");
104        assert_eq!(account.display_name, "Acheta Games");
105        assert!(account.is_logged_in);
106    }
107
108    #[test]
109    fn deserialize_policy_aodc() {
110        let json = r#"{"failed":false}"#;
111        let policy: CosmosPolicyAodc = serde_json::from_str(json).unwrap();
112        assert!(!policy.failed);
113    }
114
115    #[test]
116    fn deserialize_comm_opt_in() {
117        let json = r#"{"settingValue":false}"#;
118        let opt: CosmosCommOptIn = serde_json::from_str(json).unwrap();
119        assert!(!opt.setting_value);
120    }
121}