license_system/
manager.rs1use 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(), 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}