1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
use crate::config::AuthConfig; use crate::model::token::{TokenData, TokenModel, TokenType}; use crate::repository::{AuthRepositoryManager, TokenRepository}; use c3p0::*; use lightspeed_core::error::LightSpeedError; use lightspeed_core::service::validator::Validator; use lightspeed_core::utils::*; #[derive(Clone)] pub struct TokenService<RepoManager: AuthRepositoryManager> { auth_config: AuthConfig, token_repo: RepoManager::TokenRepo, } impl<RepoManager: AuthRepositoryManager> TokenService<RepoManager> { pub fn new(auth_config: AuthConfig, token_repo: RepoManager::TokenRepo) -> Self { TokenService { auth_config, token_repo, } } pub fn generate_and_save_token<S: Into<String>>( &self, conn: &mut RepoManager::Conn, username: S, token_type: TokenType, ) -> Result<TokenModel, LightSpeedError> { let issued_at = current_epoch_seconds(); let expire_at_epoch = issued_at + (self.auth_config.token_validity_minutes * 60); let token = NewModel::new(TokenData { token: new_hyphenated_uuid(), token_type, username: username.into(), expire_at_epoch_seconds: expire_at_epoch, }); self.token_repo.save(conn, token) } pub fn fetch_by_token( &self, conn: &mut RepoManager::Conn, token: &str, validate: bool, ) -> Result<TokenModel, LightSpeedError> { let token_model = self.token_repo.fetch_by_token(conn, token)?; if validate { Validator::validate(&token_model.data)?; }; Ok(token_model) } pub fn delete( &self, conn: &mut RepoManager::Conn, token_model: TokenModel, ) -> Result<TokenModel, LightSpeedError> { self.token_repo.delete(conn, token_model) } }