server/src/web_server/utils/redis.rs

42 lines
1.3 KiB
Rust

//! Сборник утилит для работы с Redis.
use crate::web_server::app_error::AppError;
use fred::prelude::*;
use heapless::String as HeaplessString;
use lazy_static::lazy_static;
use regex::Regex;
use ufmt::uwrite;
lazy_static! {
/// Разрешённые знаки для API ключа.
static ref ALLOWED_API_KEY_CHARACTERS: Regex = Regex::new("[a-zA-Z0-9]{13}").unwrap();
}
/// Описание полей в KV DB у `apikey_{}`.
pub struct ApiKeyDescription {
/// ID владельца API ключа.
apikey_owner: i64,
}
/// Проверка API ключа на валидность.
pub async fn is_api_key_valid(
client: &RedisClient,
api_key: &str,
) -> Result<ApiKeyDescription, AppError> {
if !ALLOWED_API_KEY_CHARACTERS.is_match(api_key) {
return Err(AppError::ApiKeyInvalid {
reason: "Invalid characters present in the API key.",
});
}
let mut key_buffer = HeaplessString::<{ 7 + 13 }>::new();
uwrite!(key_buffer, "apikey_{}", api_key).expect("TODO"); // TODO: Error handling
let valid: Option<i64> = client.hget(key_buffer.as_str(), "owner").await?;
valid
.map(|uid| ApiKeyDescription { apikey_owner: uid })
.ok_or(AppError::ApiKeyInvalid {
reason: "Unknown API key",
})
}