This commit is contained in:
2025-10-12 14:07:10 +02:00
parent 797a641263
commit 6724634870
4 changed files with 94 additions and 10 deletions
+69
View File
@@ -145,6 +145,11 @@ pub struct BulkMoveRequest {
pub folder_id: Option<Uuid>,
}
#[derive(Deserialize)]
pub struct UpdateDocumentRequest {
pub title: Option<String>,
}
#[derive(Serialize)]
pub struct BulkMoveResponse {
pub updated: usize,
@@ -627,6 +632,70 @@ pub async fn delete_document(
Ok(StatusCode::NO_CONTENT)
}
pub async fn update_document(
State(state): State<AppState>,
Path(document_id): Path<Uuid>,
user: AuthenticatedUser,
Json(payload): Json<UpdateDocumentRequest>,
) -> AppResult<Json<DocumentDetailResponse>> {
let mut conn = state.db()?;
let mut document: Document = documents::table.find(document_id).first(&mut conn)?;
if document.deleted_at.is_some() {
return Err(AppError::not_found());
}
let new_title = match payload.title {
Some(ref title) => {
let trimmed = title.trim();
if trimmed.is_empty() {
return Err(AppError::bad_request("title must not be empty"));
}
Some(trimmed.to_string())
}
None => None,
};
if new_title.is_none() {
return Err(AppError::bad_request("no changes provided"));
}
if let Some(title) = new_title {
let now = Utc::now().naive_utc();
diesel::update(documents::table.find(document_id))
.set((documents::title.eq(title), documents::updated_at.eq(now)))
.execute(&mut conn)?;
document = documents::table.find(document_id).first(&mut conn)?;
}
let current_version: DocumentVersion = document_versions::table
.filter(document_versions::document_id.eq(document_id))
.filter(document_versions::version_number.eq(document.current_version))
.first(&mut conn)?;
let tags_map = load_tags_for_documents(&mut conn, &[document_id])?;
let version_id = current_version.id;
drop(conn);
let assets = load_asset_responses(&state, version_id).await?;
let thumbnail = assets
.iter()
.find(|asset| asset.asset_type == "thumbnail")
.cloned();
Ok(Json(DocumentDetailResponse {
document: to_document_response(
&state,
user.user_id,
document,
tags_map.get(&document_id).cloned(),
thumbnail,
)?,
current_version: to_version_response(current_version),
assets,
}))
}
pub async fn move_document(
State(state): State<AppState>,
Path(document_id): Path<Uuid>,
+3 -1
View File
@@ -64,7 +64,9 @@ pub fn create_router(state: AppState) -> Router<()> {
)
.route(
"/:id",
get(documents::get_document).delete(documents::delete_document),
get(documents::get_document)
.delete(documents::delete_document)
.patch(documents::update_document),
)
.route("/:id/download", get(documents::download_document))
.route(