Files
k-photos/libertas_api/src/factory.rs

64 lines
1.9 KiB
Rust

use std::sync::Arc;
use libertas_core::{
config::Config,
error::{CoreError, CoreResult},
};
use libertas_infra::factory::{
build_album_repository, build_album_share_repository, build_database_pool,
build_media_repository, build_user_repository,
};
use crate::{
security::{Argon2Hasher, JwtGenerator},
services::{
album_service::AlbumServiceImpl, media_service::MediaServiceImpl,
user_service::UserServiceImpl,
},
state::AppState,
};
pub async fn build_app_state(config: Config) -> CoreResult<AppState> {
let nats_client = async_nats::connect(&config.broker_url)
.await
.map_err(|e| CoreError::Config(format!("Failed to connect to NATS: {}", e)))?;
println!("API connected to NATS at {}", config.broker_url);
let db_pool = build_database_pool(&config.database).await?;
let user_repo = build_user_repository(&config.database, db_pool.clone()).await?;
let media_repo = build_media_repository(&config.database, db_pool.clone()).await?;
let album_repo = build_album_repository(&config.database, db_pool.clone()).await?;
let album_share_repo = build_album_share_repository(&config.database, db_pool.clone()).await?;
let hasher = Arc::new(Argon2Hasher::default());
let tokenizer = Arc::new(JwtGenerator::new(config.jwt_secret.clone()));
let user_service = Arc::new(UserServiceImpl::new(
user_repo.clone(),
hasher,
tokenizer.clone(),
));
let media_service = Arc::new(MediaServiceImpl::new(
media_repo.clone(),
user_repo.clone(),
album_share_repo.clone(),
config.clone(),
nats_client.clone(),
));
let album_service = Arc::new(AlbumServiceImpl::new(
album_repo,
media_repo,
album_share_repo,
));
Ok(AppState {
user_service,
media_service,
album_service,
token_generator: tokenizer,
nats_client,
config,
})
}