use std::time::Duration;
use livekit_protocol::agent_db;
use livekit_token::get_env_keys;
use super::{ServiceBase, ServiceResult};
use crate::public_api::{self as api, call, next_cursor, opt, page_size, types, PROJECT};
#[derive(Debug)]
pub struct DatabaseClient {
client: api::Client,
}
impl DatabaseClient {
pub fn with_api_key(host: &str, api_key: &str, api_secret: &str) -> Self {
Self::build(
host,
ServiceBase::with_api_key(api_key, api_secret),
crate::http_client::client(),
)
}
pub fn with_token(host: &str, token: &str) -> Self {
Self::build(host, ServiceBase::with_token(token), crate::http_client::client())
}
pub fn new(host: &str) -> ServiceResult<Self> {
let (api_key, api_secret) = get_env_keys()?;
Ok(Self::with_api_key(host, &api_key, &api_secret))
}
pub(crate) fn build(host: &str, base: ServiceBase, http: crate::http_client::Client) -> Self {
Self { client: api::client(host, base, http) }
}
pub fn with_request_timeout(mut self, timeout: Duration) -> Self {
self.client.inner.timeout = timeout;
self
}
pub async fn create(
&self,
req: agent_db::CreateRequest,
) -> ServiceResult<agent_db::CreateResponse> {
let body = types::DatabaseServiceCreateDatabaseBody { ttl: req.ttl };
let res = call(self.client.database_service_create_database(PROJECT, &body)).await?;
Ok(agent_db::CreateResponse {
database_id: res.database_id.unwrap_or_default(),
expires_at: res.expires_at,
})
}
pub async fn get(&self, database_id: &str) -> ServiceResult<agent_db::AgentDatabase> {
let res = call(self.client.database_service_get_database(PROJECT, database_id)).await?;
Ok(res.database.unwrap_or_default())
}
pub async fn list(&self, req: agent_db::ListRequest) -> ServiceResult<agent_db::ListResponse> {
let res = call(self.client.database_service_list_databases(
PROJECT,
opt(&req.page_token),
page_size(req.page_size),
))
.await?;
Ok(agent_db::ListResponse {
databases: res.items,
next_page_token: next_cursor(res.page_info),
})
}
pub async fn delete(&self, database_id: &str) -> ServiceResult<()> {
call(self.client.database_service_delete_database(PROJECT, database_id)).await?;
Ok(())
}
pub async fn export(&self, database_id: &str) -> ServiceResult<agent_db::ExportResponse> {
let res = call(self.client.database_service_export_database(PROJECT, database_id)).await?;
Ok(agent_db::ExportResponse {
download_url: res.download_url.unwrap_or_default(),
expires_at: res.expires_at,
tip: res.tip.and_then(|t| t.parse().ok()).unwrap_or_default(),
})
}
}