//! Сборник утилит для работы с 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 { 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 = client.hget(key_buffer.as_str(), "owner").await?; valid .map(|uid| ApiKeyDescription { apikey_owner: uid }) .ok_or(AppError::ApiKeyInvalid { reason: "Unknown API key", }) }