use crate::{FilesClient, PaginationInfo, Result};
use serde::{Deserialize, Serialize};
use serde_json::json;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ApiKeyEntity {
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub descriptive_label: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub key: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user_id: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub platform: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub permission_set: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub created_at: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub expires_at: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub last_use_at: Option<String>,
}
#[derive(Debug, Clone)]
pub struct ApiKeyHandler {
client: FilesClient,
}
impl ApiKeyHandler {
pub fn new(client: FilesClient) -> Self {
Self { client }
}
pub async fn list(
&self,
user_id: Option<i64>,
cursor: Option<String>,
per_page: Option<i32>,
) -> Result<(Vec<ApiKeyEntity>, PaginationInfo)> {
let mut path = "/api_keys?".to_string();
if let Some(uid) = user_id {
path.push_str(&format!("user_id={}&", uid));
}
if let Some(c) = cursor {
path.push_str(&format!("cursor={}&", c));
}
if let Some(pp) = per_page {
path.push_str(&format!("per_page={}&", pp));
}
let response = self.client.get_raw(&path).await?;
let keys: Vec<ApiKeyEntity> = serde_json::from_value(response)?;
let pagination = PaginationInfo {
cursor_next: None,
cursor_prev: None,
};
Ok((keys, pagination))
}
pub async fn get(&self, id: i64) -> Result<ApiKeyEntity> {
let path = format!("/api_keys/{}", id);
let response = self.client.get_raw(&path).await?;
Ok(serde_json::from_value(response)?)
}
pub async fn create(
&self,
name: Option<&str>,
description: Option<&str>,
expires_at: Option<&str>,
permission_set: Option<&str>,
) -> Result<ApiKeyEntity> {
let mut body = json!({});
if let Some(n) = name {
body["name"] = json!(n);
}
if let Some(d) = description {
body["description"] = json!(d);
}
if let Some(e) = expires_at {
body["expires_at"] = json!(e);
}
if let Some(p) = permission_set {
body["permission_set"] = json!(p);
}
let response = self.client.post_raw("/api_keys", body).await?;
Ok(serde_json::from_value(response)?)
}
pub async fn update(
&self,
id: i64,
name: Option<&str>,
description: Option<&str>,
expires_at: Option<&str>,
) -> Result<ApiKeyEntity> {
let mut body = json!({});
if let Some(n) = name {
body["name"] = json!(n);
}
if let Some(d) = description {
body["description"] = json!(d);
}
if let Some(e) = expires_at {
body["expires_at"] = json!(e);
}
let path = format!("/api_keys/{}", id);
let response = self.client.patch_raw(&path, body).await?;
Ok(serde_json::from_value(response)?)
}
pub async fn delete(&self, id: i64) -> Result<()> {
let path = format!("/api_keys/{}", id);
self.client.delete_raw(&path).await?;
Ok(())
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_handler_creation() {
let client = FilesClient::builder().api_key("test-key").build().unwrap();
let _handler = ApiKeyHandler::new(client);
}
}