license_system/
manager.rs

1use crate::ty::*;
2use e_utils::chrono::{FixedOffset, Utc};
3use std::sync::Arc;
4
5pub struct LicenseManager {
6    protocol: Arc<dyn LicenseProtocol + Send + Sync>,
7    timezone: FixedOffset,
8}
9
10impl LicenseManager {
11    pub fn new(protocol: Arc<dyn LicenseProtocol + Send + Sync>, timezone_offset_hours: i32) -> e_utils::Result<Self> {
12        let timezone = FixedOffset::east_opt(timezone_offset_hours * 3600)
13            .ok_or("Invalid timezone offset")?;
14        
15        Ok(Self {
16            protocol,
17            timezone,
18        })
19    }
20}
21
22impl <'a>LicenseGenerator<'a> for LicenseManager {
23    fn generate_license(&self, user_id: &str, hours: u64) -> e_utils::Result<LicenseInfo> {
24        let license_key = self.protocol.generate(hours);
25        let expire_time = self.protocol.verify(&license_key)?;
26        
27        Ok(LicenseInfo {
28            user_id: user_id.to_string(),
29            license_key,
30            expire_time,
31        })
32    }
33
34    fn generate_batch_licenses(&self, user_ids: impl IntoIterator<Item = &'a str>, hours: u64) -> e_utils::Result<Vec<LicenseInfo>> {
35        user_ids
36            .into_iter()
37            .map(|user_id| self.generate_license(user_id, hours))
38            .collect()
39    }
40}
41
42impl LicenseValidator for LicenseManager {
43    fn verify_license(&self, license_key: &str) -> e_utils::Result<LicenseValidationResult> {
44        let now = Utc::now().with_timezone(&self.timezone);
45        
46        match self.protocol.verify(license_key) {
47            Ok(expire) => {
48                let days_remaining = expire.signed_duration_since(now).num_hours();
49                Ok(LicenseValidationResult {
50                    user_id: String::new(), // 单个验证时可能无法获取用户ID
51                    is_valid: days_remaining > 0,
52                    message: if days_remaining > 0 {
53                        format!("授权有效,剩余小时数: {},过期时间: {}", days_remaining, expire)
54                    } else {
55                        "授权已过期".to_string()
56                    },
57                    days_remaining,
58                })
59            }
60            Err(e) => Ok(LicenseValidationResult {
61                user_id: String::new(),
62                is_valid: false,
63                message: format!("授权无效: {}", e),
64                days_remaining: 0,
65            })
66        }
67    }
68
69    fn verify_batch_licenses(&self, licenses: &[LicenseInfo]) -> e_utils::Result<Vec<LicenseValidationResult>> {
70        licenses
71            .iter()
72            .map(|license| {
73                let mut result = self.verify_license(&license.license_key)?;
74                result.user_id = license.user_id.clone();
75                Ok(result)
76            })
77            .collect()
78    }
79}