use std::sync::Arc; use adapters_auth::{BcryptPasswordHasher, JwtTokenIssuer}; use adapters_postgres::{PgPool, PostgresRefreshTokenRepository, PostgresUserRepository}; use application::identity::{ GetProfileHandler, LoginUserHandler, LogoutHandler, RefreshTokenHandler, RegisterUserHandler, }; use domain::ports::TokenIssuer; use presentation::state::IdentityHandlers; pub struct IdentityServices { pub handlers: IdentityHandlers, pub token_issuer: Arc, } pub fn build(pool: &PgPool, jwt_secret: &str) -> IdentityServices { let user_repo = Arc::new(PostgresUserRepository::new(pool.clone())); let hasher = Arc::new(BcryptPasswordHasher); let issuer: Arc = Arc::new(JwtTokenIssuer::new(jwt_secret)); let refresh_repo = Arc::new(PostgresRefreshTokenRepository::new(pool.clone())); let register = Arc::new(RegisterUserHandler::new(user_repo.clone(), hasher.clone())); let login = Arc::new(LoginUserHandler::new( user_repo.clone(), hasher, issuer.clone(), refresh_repo.clone(), )); let get_profile = Arc::new(GetProfileHandler::new(user_repo.clone())); let refresh = Arc::new(RefreshTokenHandler::new( refresh_repo.clone(), user_repo, issuer.clone(), )); let logout = Arc::new(LogoutHandler::new(refresh_repo.clone())); IdentityServices { handlers: IdentityHandlers { register, login, get_profile, refresh, logout, refresh_token_repo: refresh_repo, }, token_issuer: issuer, } }