3
This commit is contained in:
@@ -224,7 +224,7 @@ pub async fn upload_document(
|
||||
|
||||
while let Some(field) = multipart.next_field().await.map_err(|err| {
|
||||
let msg = format!("invalid multipart data: {err}");
|
||||
warn!(error = %err, "invalid multipart data");
|
||||
error!(error = %err, "invalid multipart data");
|
||||
AppError::bad_request(msg)
|
||||
})? {
|
||||
let name = field.name().map(|n| n.to_string());
|
||||
@@ -235,7 +235,7 @@ pub async fn upload_document(
|
||||
content_type = field.content_type().map(|mime| mime.to_string());
|
||||
let data = field.bytes().await.map_err(|err| {
|
||||
let msg = format!("failed to read file bytes: {err}");
|
||||
warn!(error = %err, "failed to read file bytes");
|
||||
error!(error = %err, "failed to read file bytes");
|
||||
AppError::bad_request(msg)
|
||||
})?;
|
||||
file_bytes = Some(data.to_vec());
|
||||
@@ -243,7 +243,7 @@ pub async fn upload_document(
|
||||
Some("folder_id") => {
|
||||
let value = field.text().await.map_err(|err| {
|
||||
let msg = format!("invalid folder id: {err}");
|
||||
warn!(error = %err, "invalid folder id");
|
||||
error!(error = %err, "invalid folder id");
|
||||
AppError::bad_request(msg)
|
||||
})?;
|
||||
if !value.trim().is_empty() {
|
||||
@@ -255,12 +255,12 @@ pub async fn upload_document(
|
||||
Some("metadata") => {
|
||||
let value = field.text().await.map_err(|err| {
|
||||
let msg = format!("invalid metadata: {err}");
|
||||
warn!(error = %err, "invalid metadata payload");
|
||||
error!(error = %err, "invalid metadata payload");
|
||||
AppError::bad_request(msg)
|
||||
})?;
|
||||
metadata = serde_json::from_str(&value).map_err(|err| {
|
||||
let msg = format!("metadata must be valid JSON: {err}");
|
||||
warn!(error = %err, "metadata parse failure");
|
||||
error!(error = %err, "metadata parse failure");
|
||||
AppError::bad_request(msg)
|
||||
})?;
|
||||
}
|
||||
@@ -269,10 +269,19 @@ pub async fn upload_document(
|
||||
}
|
||||
|
||||
let file_bytes = file_bytes.ok_or_else(|| {
|
||||
warn!("upload rejected: missing file field");
|
||||
error!("upload rejected: missing file field");
|
||||
AppError::bad_request("file field is required")
|
||||
})?;
|
||||
let original_name = original_name.unwrap_or_else(|| "upload.bin".to_string());
|
||||
|
||||
if file_bytes.is_empty() {
|
||||
error!("upload rejected: empty file payload");
|
||||
return Err(AppError::bad_request("file field must not be empty"));
|
||||
}
|
||||
let original_name = original_name.ok_or_else(|| {
|
||||
error!("upload rejected: missing original filename");
|
||||
AppError::bad_request("filename is required")
|
||||
})?;
|
||||
let original_name_for_log = original_name.clone();
|
||||
|
||||
let request = UploadRequest {
|
||||
bytes: file_bytes,
|
||||
@@ -283,18 +292,21 @@ pub async fn upload_document(
|
||||
};
|
||||
|
||||
let outcome = match process_upload(&state, request).await {
|
||||
Ok(outcome) => outcome,
|
||||
Ok(outcome) => {
|
||||
info!(
|
||||
document_id = %outcome.detail.document.id,
|
||||
original_name = %outcome.detail.document.original_name,
|
||||
created = outcome.created,
|
||||
reused_existing = !outcome.created,
|
||||
"document upload succeeded"
|
||||
);
|
||||
outcome
|
||||
}
|
||||
Err(err) => {
|
||||
error!(error = ?err, "document upload failed");
|
||||
error!(error = ?err, original_name = %original_name_for_log, "document upload failed");
|
||||
return Err(err);
|
||||
}
|
||||
};
|
||||
info!(
|
||||
document_id = %outcome.detail.document.id,
|
||||
original_name = %outcome.detail.document.original_name,
|
||||
created = outcome.created,
|
||||
"document upload succeeded"
|
||||
);
|
||||
let status = if outcome.created {
|
||||
StatusCode::CREATED
|
||||
} else {
|
||||
@@ -573,6 +585,12 @@ async fn process_upload(state: &AppState, request: UploadRequest) -> AppResult<U
|
||||
.find(|asset| asset.asset_type == "thumbnail")
|
||||
.cloned();
|
||||
|
||||
info!(
|
||||
document_id = %document.id,
|
||||
checksum = %checksum_hex,
|
||||
"upload deduplicated existing document"
|
||||
);
|
||||
|
||||
return Ok(UploadOutcome {
|
||||
detail: DocumentDetailResponse {
|
||||
document: to_document_response(document, tags, thumbnail),
|
||||
|
||||
@@ -87,6 +87,7 @@ impl Worker {
|
||||
JobExecution::Success => {
|
||||
if let Ok(mut conn) = self.state.db() {
|
||||
mark_job_succeeded(&mut conn, job.id)?;
|
||||
info!(job_id = %job.id, job_type = %job.job_type, "job completed successfully");
|
||||
} else {
|
||||
error!("failed to mark job succeeded due to pool error");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user