caps and delete
This commit is contained in:
@@ -35,7 +35,9 @@ use crate::documents::{
|
||||
tags::{assign_tags as assign_tags_to_document, load_tags_for_documents},
|
||||
};
|
||||
use crate::error::{AppError, AppResult};
|
||||
use crate::jobs::{enqueue_job, JOB_ANALYZE_DOCUMENT, JOB_INDEX_DOCUMENT_TEXT};
|
||||
use crate::jobs::{
|
||||
enqueue_job, JobQueueError, JOB_ANALYZE_DOCUMENT, JOB_INDEX_DOCUMENT_TEXT, JOB_PURGE_DOCUMENT,
|
||||
};
|
||||
use crate::models::{
|
||||
Document, DocumentAsset, DocumentAssetObject, DocumentVersion, NewDocument, NewDocumentTag,
|
||||
NewDocumentVersion, Tag,
|
||||
@@ -1288,13 +1290,13 @@ pub async fn download_with_token(
|
||||
}
|
||||
|
||||
#[utoipa::path(
|
||||
delete,
|
||||
path = "/api/documents/{id}",
|
||||
post,
|
||||
path = "/api/documents/{id}/trash",
|
||||
params(("id" = Uuid, Path, description = "Document ID")),
|
||||
responses((status = 204, description = "Document deleted")),
|
||||
tag = "Documents"
|
||||
)]
|
||||
pub async fn delete_document(
|
||||
pub async fn trash_document(
|
||||
Path(document_id): Path<Uuid>,
|
||||
TenantScopedConn {
|
||||
mut conn,
|
||||
@@ -1316,6 +1318,50 @@ pub async fn delete_document(
|
||||
Ok(StatusCode::NO_CONTENT)
|
||||
}
|
||||
|
||||
#[utoipa::path(
|
||||
delete,
|
||||
path = "/api/documents/{id}",
|
||||
params(("id" = Uuid, Path, description = "Document ID")),
|
||||
responses((status = 202, description = "Document purge scheduled")),
|
||||
tag = "Documents"
|
||||
)]
|
||||
pub async fn delete_document(
|
||||
Path(document_id): Path<Uuid>,
|
||||
TenantScopedConn {
|
||||
mut conn,
|
||||
tenant_id,
|
||||
..
|
||||
}: TenantScopedConn,
|
||||
) -> AppResult<impl IntoResponse> {
|
||||
conn.transaction::<(), AppError, _>(|conn| {
|
||||
let document = documents::table
|
||||
.find(document_id)
|
||||
.filter(documents::tenant_id.eq(tenant_id))
|
||||
.for_update()
|
||||
.first::<Document>(conn)
|
||||
.optional()?
|
||||
.ok_or_else(AppError::not_found)?;
|
||||
|
||||
if document.deleted_at.is_none() {
|
||||
return Err(AppError::conflict(
|
||||
"document must be trashed before permanent deletion",
|
||||
));
|
||||
}
|
||||
|
||||
let payload = json!({ "document_id": document_id });
|
||||
match enqueue_job(conn, tenant_id, JOB_PURGE_DOCUMENT, payload, None) {
|
||||
Ok(_) => Ok(()),
|
||||
Err(JobQueueError::Database(diesel::result::Error::DatabaseError(
|
||||
DatabaseErrorKind::UniqueViolation,
|
||||
_,
|
||||
))) => Ok(()),
|
||||
Err(JobQueueError::Database(err)) => Err(AppError::from(err)),
|
||||
}
|
||||
})?;
|
||||
|
||||
Ok(StatusCode::ACCEPTED)
|
||||
}
|
||||
|
||||
#[utoipa::path(
|
||||
patch,
|
||||
path = "/api/documents/{id}",
|
||||
@@ -2433,6 +2479,7 @@ pub(crate) fn hydrate_documents(
|
||||
crate::routes::documents::upload_document,
|
||||
crate::routes::documents::get_document,
|
||||
crate::routes::documents::update_document,
|
||||
crate::routes::documents::trash_document,
|
||||
crate::routes::documents::delete_document,
|
||||
crate::routes::documents::restore_document,
|
||||
crate::routes::documents::download_with_token,
|
||||
|
||||
Reference in New Issue
Block a user