feat: Implement media import functionality with repository and bundle support

This commit is contained in:
2025-11-15 15:24:52 +01:00
parent faed54cb08
commit d7b22bdcb1
10 changed files with 190 additions and 66 deletions

View File

@@ -10,10 +10,11 @@ use libertas_core::{
error::{CoreError, CoreResult},
media_utils::{extract_exif_data, get_storage_path_and_date},
models::{Media, MediaMetadata, User},
repositories::{MediaMetadataRepository, MediaRepository, UserRepository},
repositories::{MediaImportRepository, MediaRepository, UserRepository},
schema::MediaImportBundle,
};
use libertas_infra::factory::{
build_database_pool, build_media_metadata_repository, build_media_repository,
build_database_pool, build_media_import_repository, build_media_repository,
build_user_repository,
};
use serde_json;
@@ -39,7 +40,7 @@ struct ImporterState {
config: AppConfig,
media_repo: Arc<dyn MediaRepository>,
user_repo: Arc<dyn UserRepository>,
metadata_repo: Arc<dyn MediaMetadataRepository>,
media_import_repo: Arc<dyn MediaImportRepository>,
nats_client: async_nats::Client,
}
@@ -55,7 +56,8 @@ async fn main() -> Result<()> {
let db_pool = build_database_pool(&config.database).await?;
let media_repo = build_media_repository(&config, db_pool.clone()).await?;
let user_repo = build_user_repository(&config.database, db_pool.clone()).await?;
let metadata_repo = build_media_metadata_repository(&config.database, db_pool.clone()).await?;
let media_import_repo =
build_media_import_repository(&config.database, db_pool.clone()).await?;
let nats_client = async_nats::connect(&config.broker_url).await?;
println!("Connected to database and NATS broker.");
@@ -64,7 +66,7 @@ async fn main() -> Result<()> {
config,
media_repo,
user_repo,
metadata_repo,
media_import_repo,
nats_client,
};
@@ -168,7 +170,6 @@ async fn process_file(
created_at: chrono::Utc::now(),
thumbnail_path: None,
};
state.media_repo.create(&media_model).await?;
let mut metadata_models = Vec::new();
for (source, tag_name, tag_value) in extracted_data.all_tags {
@@ -181,14 +182,13 @@ async fn process_file(
});
}
if !metadata_models.is_empty() {
state.metadata_repo.create_batch(&metadata_models).await?;
}
let bundle = MediaImportBundle {
media_model: media_model.clone(),
metadata_models,
file_size,
};
state
.user_repo
.update_storage_used(user.id, file_size)
.await?;
state.media_import_repo.create_media_bundle(bundle).await?;
user.storage_used += file_size;