use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct InvitationCode {
pub id: String,
pub code: String,
pub created_by: String, pub expiry_time: i64, pub is_used: bool, pub max_usage: u32, pub current_usage: u32, pub created_at: i64,
}
impl InvitationCode {
pub fn new(created_by: String, max_usage: Option<u32>) -> Self {
Self {
id: uuid::Uuid::new_v4().to_string(),
code: Self::generate_code(),
created_by,
expiry_time: Self::calculate_expiry_time(), is_used: false,
max_usage: max_usage.unwrap_or(1), current_usage: 0,
created_at: chrono::Utc::now().timestamp(),
}
}
fn generate_code() -> String {
use rand::{distributions::Alphanumeric, Rng};
rand::thread_rng()
.sample_iter(&Alphanumeric)
.take(16)
.map(char::from)
.collect()
}
fn calculate_expiry_time() -> i64 {
chrono::Utc::now().timestamp() + 24 * 60 * 60 }
pub fn is_valid(&self) -> bool {
let current_time = chrono::Utc::now().timestamp();
!self.is_used && current_time < self.expiry_time && self.current_usage < self.max_usage
}
pub fn use_code(&mut self) {
self.current_usage += 1;
if self.current_usage >= self.max_usage {
self.is_used = true;
}
}
}