use crate::prelude::*;
use std::time::{SystemTime, UNIX_EPOCH};
#[derive(thiserror::Error, Debug)]
pub enum LinkVError {
#[error("JWT error: {0}")]
JwtError(String),
#[error("Invalid Token!")]
InvalidToken
}
pub type Result<T> = std::result::Result<T, LinkVError>;
#[derive(Clone)]
pub struct LinkVConfig {
pub secret: String,
pub crypto: CryptoService,
pub redis: RedisManager,
pub jwt: JwtService,
}
#[derive(Clone)]
pub struct LinkV {
config: LinkVConfig,
}
impl LinkV {
pub fn new(config: LinkVConfig) -> Self {
Self { config }
}
pub fn generate_token(&self, key: &str, expiry_time: u32) -> Result<String> {
let current_time = SystemTime::now()
.duration_since(UNIX_EPOCH)
.map_err(|e| LinkVError::JwtError(e.to_string()))?
.as_secs() as usize;
let expiry_timestamp = current_time + expiry_time as usize;
let token = self.config.jwt.generate_exp_token(key, expiry_timestamp)
.map_err(|e| LinkVError::JwtError(format!("{:?}", e)))?;
Ok(token)
}
pub fn verify_token(&self, token: &str) -> Result<bool> {
if !self.config.jwt.verify_token(token) {
return Err(LinkVError::InvalidToken);
} else {
return Ok(false);
}
}
}