use std::time::SystemTime;
use serde::{Deserialize, Serialize};
use serde_json::Value;
use super::ErrorCode;
use super::Ratelimit;
use super::RatelimitState;
use super::Refill;
use super::UndefinedOr;
#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq)]
#[serde(rename_all = "lowercase")]
pub enum UpdateOp {
Increment,
Decrement,
Set,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct VerifyKeyRequest {
pub key: String,
pub api_id: String,
}
impl VerifyKeyRequest {
#[must_use]
pub fn new<T: Into<String>>(key: T, api_id: T) -> Self {
Self {
key: key.into(),
api_id: api_id.into(),
}
}
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct VerifyKeyResponse {
pub valid: bool,
pub key_id: Option<String>,
pub name: Option<String>,
pub owner_id: Option<String>,
pub meta: Option<Value>,
pub remaining: Option<usize>,
pub code: ErrorCode,
pub enabled: Option<bool>,
pub expires: Option<usize>,
pub ratelimit: Option<RatelimitState>,
pub refill: Option<Refill>,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct CreateKeyRequest {
pub api_id: String,
#[serde(skip_serializing_if = "UndefinedOr::is_undefined")]
pub owner_id: UndefinedOr<String>,
#[serde(skip_serializing_if = "UndefinedOr::is_undefined")]
pub byte_length: UndefinedOr<usize>,
#[serde(skip_serializing_if = "UndefinedOr::is_undefined")]
pub prefix: UndefinedOr<String>,
#[serde(skip_serializing_if = "UndefinedOr::is_undefined")]
pub name: UndefinedOr<String>,
#[serde(skip_serializing_if = "UndefinedOr::is_undefined")]
pub meta: UndefinedOr<Value>,
#[serde(skip_serializing_if = "UndefinedOr::is_undefined")]
pub expires: UndefinedOr<usize>,
#[serde(skip_serializing_if = "UndefinedOr::is_undefined")]
pub remaining: UndefinedOr<usize>,
#[serde(skip_serializing_if = "UndefinedOr::is_undefined")]
pub ratelimit: UndefinedOr<Ratelimit>,
#[serde(skip_serializing_if = "UndefinedOr::is_undefined")]
pub refill: UndefinedOr<Refill>,
}
impl CreateKeyRequest {
#[must_use]
pub fn new<T: Into<String>>(api_id: T) -> Self {
Self {
api_id: api_id.into(),
owner_id: UndefinedOr::Undefined,
byte_length: UndefinedOr::Undefined,
prefix: UndefinedOr::Undefined,
name: UndefinedOr::Undefined,
meta: UndefinedOr::Undefined,
expires: UndefinedOr::Undefined,
remaining: UndefinedOr::Undefined,
ratelimit: UndefinedOr::Undefined,
refill: UndefinedOr::Undefined,
}
}
#[must_use]
pub fn set_owner_id<T: Into<String>>(mut self, owner_id: T) -> Self {
self.owner_id = UndefinedOr::Value(owner_id.into());
self
}
#[must_use]
pub fn set_byte_length(mut self, byte_length: usize) -> Self {
self.byte_length = UndefinedOr::Value(byte_length);
self
}
#[must_use]
pub fn set_prefix<T: Into<String>>(mut self, prefix: T) -> Self {
self.prefix = UndefinedOr::Value(prefix.into());
self
}
#[must_use]
pub fn set_name<T: Into<String>>(mut self, name: T) -> Self {
self.name = UndefinedOr::Value(name.into());
self
}
#[must_use]
pub fn set_meta(mut self, meta: Value) -> Self {
self.meta = UndefinedOr::Value(meta);
self
}
#[must_use]
pub fn set_expires(mut self, expires: usize) -> Self {
let duration = SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.unwrap_or_else(|e| {
eprintln!("Error fetching duration since unix epoch: {e}");
std::process::exit(1);
});
let expires = duration.as_millis() as usize + expires;
self.expires = UndefinedOr::Value(expires);
self
}
#[must_use]
pub fn set_remaining(mut self, remaining: usize) -> Self {
self.remaining = UndefinedOr::Value(remaining);
self
}
#[must_use]
pub fn set_ratelimit(mut self, ratelimit: Ratelimit) -> Self {
self.ratelimit = UndefinedOr::Value(ratelimit);
self
}
#[must_use]
pub fn set_refill(mut self, refill: Refill) -> Self {
self.refill = UndefinedOr::Value(refill);
self
}
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct CreateKeyResponse {
pub key_id: String,
pub key: String,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ApiKey {
pub id: String,
pub name: Option<String>,
pub api_id: String,
pub workspace_id: String,
pub start: String,
pub owner_id: Option<String>,
pub meta: Option<Value>,
pub created_at: usize,
pub expires: Option<usize>,
pub remaining: Option<usize>,
pub ratelimit: Option<Ratelimit>,
pub refill: Option<Refill>,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct RevokeKeyRequest {
pub key_id: String,
}
impl RevokeKeyRequest {
#[must_use]
#[rustfmt::skip]
pub fn new<T: Into<String>>(key_id: T) -> Self {
Self { key_id: key_id.into() }
}
}
#[derive(Debug, Default, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct UpdateKeyRequest {
pub key_id: String,
#[serde(skip_serializing_if = "UndefinedOr::is_undefined")]
pub owner_id: UndefinedOr<String>,
#[serde(skip_serializing_if = "UndefinedOr::is_undefined")]
pub name: UndefinedOr<String>,
#[serde(skip_serializing_if = "UndefinedOr::is_undefined")]
pub meta: UndefinedOr<Value>,
#[serde(skip_serializing_if = "UndefinedOr::is_undefined")]
pub expires: UndefinedOr<usize>,
#[serde(skip_serializing_if = "UndefinedOr::is_undefined")]
pub remaining: UndefinedOr<usize>,
#[serde(skip_serializing_if = "UndefinedOr::is_undefined")]
pub ratelimit: UndefinedOr<Ratelimit>,
#[serde(skip_serializing_if = "UndefinedOr::is_undefined")]
pub refill: UndefinedOr<Refill>,
}
impl UpdateKeyRequest {
#[must_use]
pub fn new<T: Into<String>>(key_id: T) -> Self {
Self {
key_id: key_id.into(),
..Default::default()
}
}
#[must_use]
pub fn set_owner_id(mut self, owner_id: Option<&str>) -> Self {
self.owner_id = match owner_id {
Some(id) => Some(id.into()).into(),
None => None.into(),
};
self
}
#[must_use]
pub fn set_name(mut self, name: Option<&str>) -> Self {
self.name = match name {
Some(n) => Some(n.into()).into(),
None => None.into(),
};
self
}
#[must_use]
pub fn set_meta(mut self, meta: Option<Value>) -> Self {
self.meta = match meta {
Some(m) => Some(m).into(),
None => None.into(),
};
self
}
#[must_use]
pub fn set_expires(mut self, expires: Option<usize>) -> Self {
self.expires = expires.into();
self
}
#[must_use]
pub fn set_remaining(mut self, remaining: Option<usize>) -> Self {
self.remaining = remaining.into();
self
}
#[must_use]
pub fn set_ratelimit(mut self, ratelimit: Option<Ratelimit>) -> Self {
self.ratelimit = ratelimit.into();
self
}
#[must_use]
pub fn set_refill(mut self, refill: Option<Refill>) -> Self {
self.refill = refill.into();
self
}
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct GetKeyRequest {
pub key_id: String,
}
impl GetKeyRequest {
#[must_use]
#[rustfmt::skip]
pub fn new<T: Into<String>>(key_id: T) -> Self {
Self { key_id: key_id.into() }
}
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct UpdateRemainingRequest {
pub key_id: String,
pub value: Option<usize>,
pub op: UpdateOp,
}
impl UpdateRemainingRequest {
#[must_use]
#[rustfmt::skip]
pub fn new<T: Into<String>>(key_id: T, value: Option<usize>, op: UpdateOp) -> Self {
Self { key_id: key_id.into(), value, op }
}
}
#[derive(Debug, Clone, Deserialize)]
pub struct UpdateRemainingResponse {
pub remaining: usize,
}