use crate::auth::error::{parse_identity_toolkit_response, AuthError};
use crate::core::HttpClient;
use serde::{Deserialize, Serialize};
use std::time::Duration;
#[derive(Debug, Serialize)]
struct CreateSessionCookieRequest<'a> {
#[serde(rename = "idToken")]
id_token: &'a str,
#[serde(rename = "validDuration")]
valid_duration_secs: u64,
}
#[derive(Debug, Deserialize)]
struct CreateSessionCookieResponse {
#[serde(rename = "sessionCookie")]
session_cookie: String,
}
pub async fn create_session_cookie(
http: &HttpClient,
endpoint: &str,
id_token: &str,
valid_duration: Duration,
bearer_token: Option<&str>,
emulator_api_key: Option<&str>,
) -> Result<String, AuthError> {
let body = CreateSessionCookieRequest {
id_token,
valid_duration_secs: valid_duration.as_secs(),
};
let mut request = http.inner().post(endpoint);
if let Some(token) = bearer_token {
request = request.bearer_auth(token);
}
if let Some(key) = emulator_api_key {
request = request.query(&[("key", key)]);
}
let response = request.json(&body).send().await?;
let parsed: CreateSessionCookieResponse = parse_identity_toolkit_response(response).await?;
Ok(parsed.session_cookie)
}