Files
libertas/libertas_api/src/factory.rs
Gabriel Kaszewski 3c3b51a2a7 feat: enhance media management with EXIF data extraction, metadata filtering, and storage path generation
refactor: update configuration handling to use environment variables and improve code organization
2025-11-14 11:22:51 +01:00

67 lines
2.1 KiB
Rust

use std::sync::Arc;
use libertas_core::{
config::{AppConfig},
error::{CoreError, CoreResult},
};
use libertas_infra::factory::{
build_album_repository, build_album_share_repository, build_database_pool, build_media_metadata_repository, 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: AppConfig) -> 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, 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 media_metadata_repo =
build_media_metadata_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(),
Arc::new(config.clone()),
));
let media_service = Arc::new(MediaServiceImpl::new(
media_repo.clone(),
user_repo.clone(),
album_share_repo.clone(),
media_metadata_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,
})
}