feat: Implement media import functionality with repository and bundle support
This commit is contained in:
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user