From f17a9a034fe0102fec90a5fb7d35a213a4292486 Mon Sep 17 00:00:00 2001 From: Brandon Thomas Date: Sun, 21 Jul 2024 00:17:47 -0400 Subject: [PATCH] premium keys --- .../lib/redis_schema/src/keys/premium/mod.rs | 4 +- .../src/keys/premium/premium_avt_redis_key.rs | 40 +++++++++++++++++++ .../premium/premium_ip_address_redis_key.rs | 38 ++++++++++++++++++ ...key.rs => premium_user_token_redis_key.rs} | 23 +++++++---- 4 files changed, 97 insertions(+), 8 deletions(-) create mode 100644 crates/lib/redis_schema/src/keys/premium/premium_avt_redis_key.rs create mode 100644 crates/lib/redis_schema/src/keys/premium/premium_ip_address_redis_key.rs rename crates/lib/redis_schema/src/keys/premium/{user_token_premium_key.rs => premium_user_token_redis_key.rs} (51%) diff --git a/crates/lib/redis_schema/src/keys/premium/mod.rs b/crates/lib/redis_schema/src/keys/premium/mod.rs index ab5cb5e0dd..8f3f3920b5 100644 --- a/crates/lib/redis_schema/src/keys/premium/mod.rs +++ b/crates/lib/redis_schema/src/keys/premium/mod.rs @@ -1 +1,3 @@ -pub mod user_token_premium_key; \ No newline at end of file +pub mod premium_avt_redis_key; +pub mod premium_ip_address_redis_key; +pub mod premium_user_token_redis_key; \ No newline at end of file diff --git a/crates/lib/redis_schema/src/keys/premium/premium_avt_redis_key.rs b/crates/lib/redis_schema/src/keys/premium/premium_avt_redis_key.rs new file mode 100644 index 0000000000..0eb4defbbd --- /dev/null +++ b/crates/lib/redis_schema/src/keys/premium/premium_avt_redis_key.rs @@ -0,0 +1,40 @@ +use chrono::{Datelike, DateTime, Duration, Utc}; +use tokens::tokens::anonymous_visitor_tracking::AnonymousVisitorTrackingToken; + +pub struct PremiumAvtRedisKey(pub String); + +impl_string_key!(PremiumAvtRedisKey); + +const DURATION : Duration = Duration::milliseconds(1000 * 60 * 60 * 24 * 32); // 32 days + +impl PremiumAvtRedisKey { + pub fn new_for_user(avt: &AnonymousVisitorTrackingToken, time: DateTime) -> Self { + let month = time.month(); + let key = format!("premium:avt:{}:{}", avt.as_str(), month); + Self(key) + } + + pub fn get_redis_ttl() -> Duration { + DURATION + } +} + +#[cfg(test)] +mod tests { + use chrono::TimeZone; + + use super::*; + + #[test] + fn test_new_for_user() { + let avt = AnonymousVisitorTrackingToken::new_from_str("tracking"); + let time = Utc.with_ymd_and_hms(2021, 7, 4, 0, 0, 0).unwrap(); + let key = PremiumAvtRedisKey::new_for_user(&avt, time); + assert_eq!(key.as_str(), "premium:avt:tracking:7"); + } + + #[test] + fn test_duration() { + assert_eq!(PremiumAvtRedisKey::get_redis_ttl().num_days(), 32); + } +} diff --git a/crates/lib/redis_schema/src/keys/premium/premium_ip_address_redis_key.rs b/crates/lib/redis_schema/src/keys/premium/premium_ip_address_redis_key.rs new file mode 100644 index 0000000000..bef49d3768 --- /dev/null +++ b/crates/lib/redis_schema/src/keys/premium/premium_ip_address_redis_key.rs @@ -0,0 +1,38 @@ +use chrono::{Datelike, DateTime, Duration, Utc}; + +pub struct PremiumIpAddressRedisKey(pub String); + +impl_string_key!(PremiumIpAddressRedisKey); + +const DURATION : Duration = Duration::milliseconds(1000 * 60 * 60 * 24 * 32); // 32 days + +impl PremiumIpAddressRedisKey { + pub fn new_for_user(ip_addr: &str, time: DateTime) -> Self { + let month = time.month(); + let key = format!("premium:ip:{}:{}", ip_addr, month); + Self(key) + } + + pub fn get_redis_ttl() -> Duration { + DURATION + } +} + +#[cfg(test)] +mod tests { + use chrono::TimeZone; + + use super::*; + + #[test] + fn test_new_for_user() { + let time = Utc.with_ymd_and_hms(2021, 7, 4, 0, 0, 0).unwrap(); + let key = PremiumIpAddressRedisKey::new_for_user("127.0.0.1", time); + assert_eq!(key.as_str(), "premium:ip:127.0.0.1:7"); + } + + #[test] + fn test_duration() { + assert_eq!(PremiumIpAddressRedisKey::get_redis_ttl().num_days(), 32); + } +} diff --git a/crates/lib/redis_schema/src/keys/premium/user_token_premium_key.rs b/crates/lib/redis_schema/src/keys/premium/premium_user_token_redis_key.rs similarity index 51% rename from crates/lib/redis_schema/src/keys/premium/user_token_premium_key.rs rename to crates/lib/redis_schema/src/keys/premium/premium_user_token_redis_key.rs index 47a3af77b2..e8618e03fc 100644 --- a/crates/lib/redis_schema/src/keys/premium/user_token_premium_key.rs +++ b/crates/lib/redis_schema/src/keys/premium/premium_user_token_redis_key.rs @@ -1,32 +1,41 @@ -use chrono::{Datelike, DateTime, Utc}; +use chrono::{Datelike, DateTime, Duration, Utc}; use tokens::tokens::users::UserToken; -pub struct UserTokenPremiumKey(pub String); +pub struct PremiumUserTokenRedisKey(pub String); -impl_string_key!(UserTokenPremiumKey); +impl_string_key!(PremiumUserTokenRedisKey); -impl UserTokenPremiumKey { +const DURATION : Duration = Duration::milliseconds(1000 * 60 * 60 * 24 * 32); // 32 days + +impl PremiumUserTokenRedisKey { pub fn new_for_user(user_token: &UserToken, time: DateTime) -> Self { let month = time.month(); let key = format!("premium:user:{}:{}", user_token.as_str(), month); Self(key) } + + pub fn get_redis_ttl() -> Duration { + DURATION + } } #[cfg(test)] mod tests { use chrono::TimeZone; - use tokens::tokens::users::UserToken; - use super::*; #[test] fn test_new_for_user() { let user_token = UserToken::new_from_str("token"); let time = Utc.with_ymd_and_hms(2021, 1, 1, 0, 0, 0).unwrap(); - let key = UserTokenPremiumKey::new_for_user(&user_token, time); + let key = PremiumUserTokenRedisKey::new_for_user(&user_token, time); assert_eq!(key.as_str(), "premium:user:token:1"); } + + #[test] + fn test_duration() { + assert_eq!(PremiumUserTokenRedisKey::get_redis_ttl().num_days(), 32); + } }