Files
movies-diary/crates/application/src/use_cases/create_import_session.rs
Gabriel Kaszewski 19171806b9
Some checks failed
CI / Check / Test / Build (push) Has been cancelled
fmt
2026-05-13 23:38:57 +02:00

46 lines
1.2 KiB
Rust

use chrono::Utc;
use domain::{
errors::DomainError,
models::ImportSession,
value_objects::{ImportSessionId, UserId},
};
use crate::{commands::CreateImportSessionCommand, context::AppContext};
pub struct CreateSessionResult {
pub session_id: ImportSessionId,
pub columns: Vec<String>,
pub sample_rows: Vec<Vec<String>>,
}
pub async fn execute(
ctx: &AppContext,
cmd: CreateImportSessionCommand,
) -> Result<CreateSessionResult, DomainError> {
let user_id = UserId::from_uuid(cmd.user_id);
ctx.import_session_repository
.delete_expired_for_user(&user_id)
.await?;
let parsed = ctx
.document_parser
.parse(&cmd.bytes, cmd.format)
.map_err(|e| DomainError::ValidationError(e.to_string()))?;
let sample_rows = parsed.rows.iter().take(5).cloned().collect();
let columns = parsed.columns.clone();
let now = Utc::now().naive_utc();
let mut session = ImportSession::new(ImportSessionId::generate(), user_id, now);
let session_id = session.id.clone();
session.parsed_file = Some(parsed);
ctx.import_session_repository.create(&session).await?;
Ok(CreateSessionResult {
session_id,
columns,
sample_rows,
})
}